标签: 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 …

python monkeypatching type-hinting pycharm pyi

14
推荐指数
1
解决办法
2484
查看次数

代码 '_T = TypeVar('_T')' 在 *.pyi 文件中是什么意思?

我是 Python 注释的新手(类型提示)。我注意到文件中的许多类定义pyi都继承了Generic[_T], 和_T = TypeVar('_T').

我很困惑,_T这里是什么意思?

from typing import Generic, TypeVar

_T = TypeVar('_T')

class Base(Generic[_T]): pass
Run Code Online (Sandbox Code Playgroud)

python annotations type-hinting pyi

7
推荐指数
1
解决办法
2416
查看次数

PyCharm 中的部分存根

我想在我的项目中引入部分类型注释。例如重载。我发现 pep561 引入了部分存根文件支持。

我使用 PyCharm 开发我的项目并添加相应的*.pyi文件。并得到了预期的信息,但 PyCharm 报告在 pyi 文件中找不到参考。

当pyi文件中没有条目时,是否可以强制PyCharm查看原始py文件?或者也许它也可以部分进入课堂?

我创建示例项目来显示问题(原始的太大): 在“__init__.pyi”中找不到引用“CC”

??? main.py
??? pep561_test
    ??? __init__.py
    ??? __init__.pyi
Run Code Online (Sandbox Code Playgroud)

主文件

from pep561_test import AA, BB, CC

AA().test1(1)
AA().test1(True)
AA().test1('a')
AA().test2(1)

BB().test1(1)
BB().test2(1)
Run Code Online (Sandbox Code Playgroud)

__init__.py

class AA:
    def test1(self, a):
        pass

    def test2(self, a):
        pass


class BB:
    def test1(self, a):
        pass

    def test2(self, a):
        pass


class CC:
    def test1(self, a):
        pass

    def test2(self, a):
        pass
Run Code Online (Sandbox Code Playgroud)

__init__.pyi

class AA:
    def test1(self, a: int) -> int: ...

    def test1(self, a: bool) …
Run Code Online (Sandbox Code Playgroud)

python pep pycharm python-3.6 pyi

6
推荐指数
1
解决办法
587
查看次数

将pyi(类型存根文件)导入普通python模块

我有一个程序(如宏),它在父程序中运行并从该程序导入一个 API 模块(让我们称之为foo)。问题是该模块仅存在于该程序中,因此我无法执行诸如在软件外部运行pydocmd之类的操作,因为该脚本会引发 ReferenceError。为了帮助我自己的开发,我foo.pyi在我的项目目录中创建了一个类型存根文件。如果导入失败,我想要做的是将该类型存根作为普通 Python 文件导入,以提供虚拟函数和属性。就像是:

try:
  import foo
except ImportError:
  from . import foo.pyi
Run Code Online (Sandbox Code Playgroud)

但是,这会引发错误,因为它试图pyifoo项目文件夹中不存在的库中导入。我能想到的唯一另一种选择是拥有 .pyi 文件的相同副本,比如“dummy_foo.py”,但我必须在一个 repo 中维护同一文件的两个副本。我宁愿不这样做。

python import stub python-import pyi

5
推荐指数
1
解决办法
1097
查看次数