【发布时间】:2020-06-14 18:57:32
【问题描述】:
我正在使用 Python 3.7.6 和 PyCharm。我希望我的代码作为一个很好的内部 API 工作,并为对象显示代码完成,所以我想使用打字。
我正在尝试为何时找到一个好的模式:
- 有两组类,每组都有自己的继承树
- 一组中的对象由另一组中的对象列表组成
(以下示例)
我在下面找到了一种方法,但感觉就像是 hack。什么是正确(或更好)的方法?
from typing import List, Type
class Leg:
def step(self):
print("step")
class DuckLeg(Leg):
def paddle(self):
print("splosh")
class Biped:
def __init__(self, leg_type: Type[Leg]):
self.legs: List[leg_type] = [leg_type(), leg_type()]
def walk(self):
for leg in self.legs:
leg.step()
class Duck(Biped):
def __init__(self):
super().__init__(leg_type=DuckLeg)
self.legs: List[DuckLeg] = self.legs # A hack?
my_duck = Duck()
my_duck.walk() # code-completion appears for .walk()
my_duck.legs[0].paddle() # code-completion appears for .paddle()
编辑1:这个问题不是关于在哪里放置类型注释,而是如何确保代码完成在这种情况下工作。如果以下行被注释掉...
self.legs: List[DuckLeg] = self.legs
...由于鸭子打字,代码仍将运行,但 .paddle() 不会出现代码完成,当手动输入 PyCharm 代码检查时将报告:未解析的属性引用 'paddle' 类 'Leg'。
【问题讨论】:
-
@mkrieger1 感谢您的评论。这是一本有趣的书,但不幸的是没有回答我的问题。这与在类定义中放置类型注释的位置无关(参见上面的编辑)。
-
但是如果你注释掉那一行,然后在
class Duck(Biped)下添加legs: List[DuckLeg]行呢?这不会有同样的效果,而不是一个黑客? -
@mkrieger1 感谢您回来。我同意这将不是一个黑客。遗憾的是,如果没有分配,它并没有给我我正在寻找的漂亮的内部 API(出于我不明白的原因)。所以仍然没有代码完成,仍然按照您建议的方式进行代码检查错误。
标签: python inheritance pycharm type-hinting