使用Python类型化模块指定序列或列表的长度
我给Python使用Python类型化模块指定序列或列表的长度,python,python-3.x,type-hinting,mypy,Python,Python 3.x,Type Hinting,Mypy,我给Python模块打了一针 我知道指定列表的长度是有效的,如下*: List[float, float, float] # List of 3 floats <-- NOTE: this is not valid Python 如果这是可能的话,这会很方便 *注意:事实证明,以这种方式向序列[](及其子类)提供多个参数目前是无效的。此外,目前无法使用键入模块以这种方式指定序列长度。到目前为止,只有元组支持指定固定数量的字段,并且没有固定重复次数的捷径 以下是模块中的定义和文档字符
模块打了一针
我知道指定列表的长度是有效的,如下*:
List[float, float, float] # List of 3 floats <-- NOTE: this is not valid Python
如果这是可能的话,这会很方便
*注意:事实证明,以这种方式向序列[]
(及其子类)提供多个参数目前是无效的。此外,目前无法使用键入模块以这种方式指定序列
长度。到目前为止,只有元组支持指定固定数量的字段,并且没有固定重复次数的捷径
以下是模块中的定义和文档字符串:
由于列表是一种可变的、可变长度的类型,因此使用类型声明来指定固定大小没有任何意义。您不能这样做。列表是一种可变长度的结构。如果需要固定长度的结构,请改用元组:
Tuple[float, float, float, float, float, float, float, float, float, float]
或者更好的是,使用同时具有索引和命名属性的:
class BunchOfFloats(NamedTuple):
foo: float
bar: float
baz: float
spam: float
ham: float
eggs: float
monty: float
python: float
idle: float
cleese: float
对于固定长度的数据结构,列表只是错误的数据类型。注释的
在这里很方便。它允许您指定任意元数据以键入提示:
Annotated[List[float], 3]
有关更多信息,请参阅。当我也遇到同样的问题时,我不高兴看到。因为我想要一个“快速”和“简单”的方法来解决这个问题
所以我首先尝试了这里列出的其他建议
注意:我使用带有Pylance的VSCode作为语言服务器
那是我最喜欢的
def demystify(mystery: Annotated[Tuple[int], 6]):
a, b, c, d, e, f = mystery
print(a, b, c, d, e, f)
函数提示如下:demystify:(神秘:Tuple[int])->None
我还得到了一个Pylance错误元组大小不匹配:对于a,b,c,d,e,f=summary的行
接下来我尝试了Tuple[6*(int,)]
,巴鲁在
导致与之前相同的Pylance错误。
函数提示如下:demystify:(神秘: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错误,并为我提供了一个“清晰”的函数提示:demystify:(神秘:Tuple[int,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:(神秘:MysteryType)->None
但是创建一个新的MysteryType可以提供我需要的所有信息:(a:int,b:int,c:int,d:int,e:int,f:int,g:int)
我还可以在其他方法和函数中使用MysteryType,而无需计算类型提示
因此,长话短说,解释一下Python的禅:
命名双工是一个非常好的主意——让我们做更多的
谢谢雷蒙德,够清楚了。虽然我在这里得到的两个答案都是准确和清晰的,但我仍然不能100%确定提示真正需要设置长度序列输入的函数的最佳方法。我想仅仅把这个放在文档串中并不太糟糕,但这似乎是一种耻辱。(我真的很喜欢PyCharm如何在为每个方法生成的帮助中获得这些提示)“到目前为止…”是否有计划在某个时候在键入模块中指定一个固定长度、可变序列Generic
?如果您使用tuple,您也可以使用文字省略号,即tuple[int,…]
根据@TomaszBartkowiak:这与所要求的正好相反。是的,您可以通过这种方式声明包含单个类型的可变长度元组。但这不是一个固定的大小。有时你需要一个固定长度的可变容器。例如,如果要将容器项初始化为“无”,但随后使用新值更新这些项。但是容器的大小仍然是固定的。@Matt:当然,但是没有内置的Python类型可以让您这样做,因此也没有类型提示。FYI@MartijnPieters的第一个建议可以缩写为Tuple[10*(float,)]
,我觉得它非常简短,因为它非常清楚地表达了它的目的。
def demystify(mystery: Tuple[6 * (int,)]):
a, b, c, e, f, g = mystery
print(a, b, c, e, f, g)
def demystify(mystery: Tuple[int, int, int, int, int, int]):
a, b, c, e, f, g = mystery
print(a, b, c, e, f, g)
class MysteryType(NamedTuple):
a: int
b: int
c: int
d: int
e: int
f: int
g: int
def demystify(mystery: MysteryType):
print(*mystery)