Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python类型化模块指定序列或列表的长度_Python_Python 3.x_Type Hinting_Mypy - Fatal编程技术网

使用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 如果这是可能的话,这会很方便 *注意:事实证明,以这种方式向序列[](及其子类)提供多个参数目前是无效的。此外,目前无法使用键入模块以这种方式指定序列长度。到目前为止,只有元组支持指定固定数量的字段,并且没有固定重复次数的捷径 以下是模块中的定义和文档字符

我给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)