PyCharm 中的部分存根

Grz*_*ota 6 python pep pycharm python-3.6 pyi

我想在我的项目中引入部分类型注释。例如重载。我发现 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) -> str: ...

    def test2(self, a):
        pass


class BB:
    def test1(self, a):
        pass
Run Code Online (Sandbox Code Playgroud)

ern*_*ttg 3

指示在 .py 中查找缺少的顶级引用 (CC)

根据PEP 484,这是可能的,只需在顶层添加以下行.pyi(我检查它是否适用于 PyCharm 11.0.7,编辑:在 PyCharm 2020.3 中不起作用):

def __getattr__(name) -> Any: ...
Run Code Online (Sandbox Code Playgroud)

指示在 .py 中查找缺少的属性/方法 (BB)

其他库(至少是typeshed)允许使用类似的语法将不完整的类存根与类定义合并.py

class Foo:
    def __getattr__(self, name: str) -> Any: ...  # incomplete
    x: int
    y: str
Run Code Online (Sandbox Code Playgroud)

然而,据我所知,这似乎不是 PEP 484 的一部分,并且没有在 PyCharm 中实现(截至 11.0.7)。我刚刚创建了对此功能的请求:我在寻找一种将不完整的类存根与类定义合并的方法时偶然发现了这个 stackoverflow 问题,并得出结论认为它还不可行。