将字典声明为文字时,有没有办法输入提示我期望特定键的值是什么?
然后,讨论一下:在 Python 中是否有关于字典输入的指导原则?我想知道在字典中混合类型是否被认为是不好的做法。
这是一个例子:
考虑在类中声明字典__init__
:
(免责声明:我意识到在示例中,某些.elements
条目可能更适合作为类属性,但这是为了示例。)
class Rectangle:
def __init__(self, corners: Tuple[Tuple[float, float]], **kwargs):
self.x, self.z = corners[0][0], corners[0][1]
self.elements = {
'front': Line(corners[0], corners[1]),
'left': Line(corners[0], corners[2]),
'right': Line(corners[1], corners[3]),
'rear': Line(corners[3], corners[2]),
'cog': calc_cog(corners),
'area': calc_area(corners),
'pins': None
}
class Line:
def __init__(self, p1: Tuple[float, float], p2: Tuple[float, float]):
self.p1, self.p2 = p1, p2
self.vertical = p1[0] == p2[0]
self.horizontal = p1[1] == p2[1]
当我键入以下内容时,
rec1 = Rectangle(rec1_corners, show=True, name='Nr1')
rec1.sides['f...
Pycharm 会'front'
为我建议。更好的是,当我这样做时
rec1.sides['front'].ver...
Pycharm 会建议.vertical
所以 Pycharm 会记住类中字典文字声明中的键__init__
,以及它们的值的预期类型。或者更确切地说:它期望任何值具有文字声明中的任何一种类型 - 可能与我做了一个self.elements = {} # type: Union[type1, type2]
会做的一样。无论哪种方式,我都觉得它非常有帮助。
如果你的函数有它们的输出类型提示,那么 Pycharm 也会考虑到这一点。
所以假设在上面的Rectangle
例子中,我想指出这pins
是一个Pin
对象列表......如果pins
是一个普通的类属性,它将是:
self.pins = None # type: List[Pin]
(前提是完成了必要的导入)
有没有办法在字典文字声明中给出相同的类型提示?
以下没有达到我正在寻找的东西:
Union[...]
在文字声明的末尾添加类型提示?
'area': calc_area(corners),
'pins': None
} # type: Union[Line, Tuple[float, float], float, List[Pin]]
为每一行添加类型提示:
'area': calc_area(corners), # type: float
'pins': None # type: List[Pin]
}
这种事情有最佳实践吗?
更多背景:
我在 PyCharm 中使用 Python 并广泛使用打字,因为它可以帮助我预测和验证我的工作。当我创建新类时,有时我还会将一些不常用的属性放入字典中,以避免带有太多属性的对象混乱(这在调试模式下很有帮助)。