PyCharm中的部分存根

时间:2019-03-14 11:00:54

标签: python pycharm python-3.6 pep pyi

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

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

当pyi文件中没有任何条目时,是否可以强制PyCharm查找原始py文件?或者也许通过部分上课也可行吗?

我创建了示例项目来显示问题(原始大小): cannot find reference 'CC' in '__init__.pyi'

├── main.py
└── pep561_test
    ├── __init__.py
    └── __init__.pyi

main.py

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)

__ 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

__ 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

1 个答案:

答案 0 :(得分:0)

表示要在.py中查找缺少的顶级参考(CC)

根据PEP 484,这是可能的,只需在您的.pyi的顶层添加以下行即可(我检查了它是否适用于PyCharm 11.0.7):

def __getattr__(name) -> Any: ...

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

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

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

但是据我所知,这似乎并不是PEP 484的一部分,也没有在PyCharm中实现(自11.0.7起)。我刚刚为此功能创建了一个request:我偶然发现了这个stackoverflow问题,当时正在寻找一种将不完整的类存根与类定义合并的方法,并得出结论认为尚不可行。