我正在将Python 3.7.6与PyCharm结合使用。我希望我的代码能够作为一个不错的内部API来工作,并为对象显示代码完成功能,因此我想使用类型输入。
我正在尝试为何时找到合适的模式:
(以下示例)
我在下面找到了一种方法,但是感觉像是在砍。什么是正确的(或更好的)方法?
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代码时,检查报告将报告:类'Leg'的未解析属性引用'paddle'。] >
我正在将Python 3.7.6与PyCharm结合使用。我希望我的代码能够作为一个不错的内部API来工作,并为对象显示代码完成功能,因此我想使用类型输入。我正在尝试为以下情况找到一个好的模式:...
不确定这是否能真正解决您的问题,但我认为它比您的建议还干净: