PyCharm中的部分存根

9

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

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

是否可以强制PyCharm在pyi文件中没有条目时查找原始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

我认为不可能将pypyi存根的定义合并到同一文件中,来自PEP 561:“这可以被视为将存根包复制到与相应运行时包相同的目录中...并对组合的目录结构进行类型检查”的功能等效方式。这样__init__.pyi将覆盖__init__.pymypy无法像PyCharm那样执行此操作:main.py:1: error: Module 'pep561_test' has no attribute 'CC' - Pavel Karateev
为什么不能在常规的py文件中添加类型提示? - Wombatz
这是我在提出这些问题时使用的解决方案。我喜欢使用单独的文件的主要原因是保持代码的清晰。当我为自动生成的方法添加类型注释时,我还需要使用 # noinspection PyOverloads - Grzegorz Bokota
2
请注意:我已经创建了一个相应的问题 https://youtrack.jetbrains.com/issue/PY-46104 - Alex Maystrenko
1个回答

3

指示查找丢失的顶级引用(CC)

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

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问题,并得出结论它还不可行。

在 PyCharm 2020.3 中,这对我不起作用。 - Alex Maystrenko
1
感谢您的反馈。我刚刚进行了测试(以防您犯了错误,或者您的PyCharm配置有问题)。但是我确认上面的建议在PyCharm 2020.3中不起作用。我将保留它,因为那应该是解决方案之一(它是PEP 484的一部分),并且可能会在未来的PyCharm版本中得到修复。 - ernesttg
谢谢确认!您知道在哪个Pycharm版本中它可以工作,以年.月的格式表示吗? - Alex Maystrenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接