当我遇到同样的问题时,看到
Martijn Pieters answer并不开心。因为我想要一种“快速”和“简单”的解决方法。所以我首先尝试了这里列出的其他建议。
注意:我使用的是带有Pylance作为语言服务器的VSCode。
Zaffys answer是我最喜欢的。
def demystify(mystery: Annotated[Tuple[int], 6]):
a, b, c, d, e, f = mystery
print(a, b, c, d, e, f)
函数的提示应该像这样:demystify: (mystery: Tuple[int]) -> None
同时,我收到了一个Pylance错误,Tuple size mismatch: expected 6 but received
,出现在a, b, c, d, e, f = mystery
这一行。
接下来,我尝试了Tuple[6 * (int, )]
,这是Martijn Pieters answer评论中balu提到的。
def demystify(mystery: Tuple[6 * (int,)]):
a, b, c, e, f, g = mystery
print(a, b, c, e, f, g)
导致与之前相同的Pylance错误。
该函数的提示是:
demystify: (mystery: Tuple[Tuple[Type[int], ...]]) -> None
回到记录预期长度的步骤:
def demystify(mystery: Tuple[int, int, int, int, int, int]):
a, b, c, e, f, g = mystery
print(a, b, c, e, f, g)
这解决了Pylance错误,并为我提供了一个“clear”函数提示:
demystify: (mystery: Tuple[int, int, int, int, int, int]) -> None
但就像约翰·布罗迪一样,我对这个解决方案并不满意。
现在回到起初不想要的答案:
class MysteryType(NamedTuple):
a: int
b: int
c: int
d: int
e: int
f: int
g: int
def demystify(mystery: MysteryType):
print(*mystery)
现在函数提示看起来更神秘了:demystify: (mystery: MysteryType) -> None
,但创建一个新的MysteryType会给我所有需要的信息:(a: int, b: int, c: int, d: int, e: int, f: int, g: int)
此外,我可以在其他方法和函数中使用MysteryType,而无需计算类型提示。
因此,为了简短地概括并转述Python之禅:
命名元组是一个非常好的想法 - 让我们做更多这样的事情!
Tuple[int, ...]
,参考 PEP484。 - Tomasz Bartkowiak