如何将类型提示添加到现有模块类的猴子修补函数中?

Chr*_*raf 14 python monkeypatching type-hinting pycharm pyi

我想知道如何将类型提示(用于 PyCharm IDE 代码完成支持)添加到def links(self) -> List[str]我通过猴子修补到现有模块的类的方法:

我的功能

def issue_links(self) -> List[str]:
    links = []
    # ...
    return links
Run Code Online (Sandbox Code Playgroud)

将函数猴子修补到Issuepython-jira 类

from jira.resources import Issue

# {...} my defined function code is somewhere here

Issue.links = issue_links
Run Code Online (Sandbox Code Playgroud)

现在我遇到的问题是,当我在Issue对象上调用该方法时,PyCharm 显然无法识别该方法。我尝试遵循PEP 484 存根文件并使用文件typing中的模块.pyi来让 IDE 找到我的猴子修补函数的定义。

问题.pyi

from typing import List

class Issue:
    def links(self) -> List[str]: ...
Run Code Online (Sandbox Code Playgroud)

然而,这是行不通的。我的假设是文件结构在某种程度上不正确:

文件位置

jira-python module>> 站点包(使用pip install jira)下载

myFile.py>> /temp/myFile.py

Issue.pyi>> /temp/jira/resources/Issue.pyi 文件夹

Jon*_*eha 0

也许使用存根文件并不是您想要实现的最佳方法 - 因为在这种情况下,您必须复制Issue存根中的完整接口,正如评论中已经讨论的那样。

为什么不使用继承来达到这个目的呢?

from jira.resources import Issue as JiraIssue
from typing import List

class Issue(JiraIssue):
    def links(self) -> List[str]:
        # your function code here
Run Code Online (Sandbox Code Playgroud)

或者,如果您真的只想定义接口:

from jira.resources import Issue as JiraIssue
from typing import List, Protocol

class WithLinks():
    def links(self) -> List[str]: ...

class Issue(JiraIssue, WithLinks):
    pass
Run Code Online (Sandbox Code Playgroud)