PyCharm 中的部分存根
Posted
技术标签:
【中文标题】PyCharm 中的部分存根【英文标题】:Partial stub in PyCharm 【发布时间】:2019-08-05 05:54:33 【问题描述】:我想在我的项目中引入部分类型注释。例如重载。我发现 pep561 引入了部分存根文件支持。
我使用 PyCharm 开发我的项目并添加相应的 *.pyi
文件。并得到了预期的信息,但 PyCharm 报告在 pyi 文件中找不到参考。
当 pyi 文件中没有条目时,是否可以强制 PyCharm 查找原始 py 文件?或者也许它也可以部分进入课堂?
我创建示例项目来显示问题(原始项目很大):
├── 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
【问题讨论】:
我认为不可能合并来自 PEP 561 的同一文件的py
和 pyi
存根的定义:“这可以被认为是复制存根包到与相应运行时包相同的目录中......并类型检查组合目录结构”。这样__init__.pyi
将覆盖__init__.py
。 mypy
做不到 PyCharm 一样好:main.py:1: error: Module 'pep561_test' has no attribute 'CC'
为什么不能将类型提示添加到您的常规 py
文件中?
这是我在提出这些问题时使用的解决方案。我更喜欢使用单独文件的主要原因是保持代码简洁。当我写这个问题时,我还需要在为自动生成的方法添加类型注释时使用# noinspection PyOverloads
..
仅供参考:我创建了一个相应的问题youtrack.jetbrains.com/issue/PY-46104
【参考方案1】:
表示要在 .py 中查找缺少的***引用 (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:我在寻找一种将我不完整的类存根与类定义合并的方法时偶然发现了这个 *** 问题,并得出结论认为它还不可行。
【讨论】:
这在 PyCharm 2020.3 中对我不起作用 感谢您的反馈。我刚刚测试了它(以防你犯了错误,或者你的特定 PyCharm 配置有问题)。但我确认上述建议在 PyCharm 2020.3 中不起作用,我将离开它,因为 应该 是解决方案(它是 PEP 484 的一部分)并且可能在未来的 PyCharm 版本中得到修复。跨度> 感谢您的确认!你知道它在哪个 Pycharm 版本中工作,用 year.month 表示法吗?以上是关于PyCharm 中的部分存根的主要内容,如果未能解决你的问题,请参考以下文章
Pycharm中不支持中文编码的解决方案。Pycharm中文报错。 Pycharm出现的部分快捷键无效及解决办法