178

考虑以下代码:

from collections import namedtuple
point = namedtuple("Point", ("x:int", "y:int"))

上面的代码只是展示我想要实现的目标的一种方式。我想namedtuple使用类型提示。

你知道任何优雅的方式来达到预期的结果吗?

4

3 回答 3

237

自 3.6 以来,类型化命名元组的首选语法是

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int = 1  # Set default value

Point(3)  # -> Point(x=3, y=1)

编辑 从 Python 3.7 开始,考虑使用dataclasses(您的 IDE 可能还不支持它们进行静态类型检查):

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int = 1  # Set default value

Point(3)  # -> Point(x=3, y=1)
于 2018-04-26T08:45:00.550 回答
133

您可以使用typing.NamedTuple

从文档

namedtuple打字版本

>>> import typing
>>> Point = typing.NamedTuple("Point", [('x', int), ('y', int)])

这仅在 Python 3.5 及以后版本中存在

于 2015-12-14T14:47:50.553 回答
5

公平地说,NamedTuple来自typing

>>> from typing import NamedTuple
>>> class Point(NamedTuple):
...     x: int
...     y: int = 1  # Set default value
...
>>> Point(3)
Point(x=3, y=1)

等于经典namedtuple

>>> from collections import namedtuple
>>> p = namedtuple('Point', 'x,y', defaults=(1, ))
>>> p.__annotations__ = {'x': int, 'y': int}
>>> p(3)
Point(x=3, y=1)

所以,NamedTuple只是语法糖namedtuple

NamedTuple下面,您可以从 的源代码中找到一个创建函数python 3.10。正如我们所看到的,它使用collections.namedtuple构造函数并__annotations__从提取的类型中添加:

def _make_nmtuple(name, types, module, defaults = ()):
    fields = [n for n, t in types]
    types = {n: _type_check(t, f"field {n} annotation must be a type")
             for n, t in types}
    nm_tpl = collections.namedtuple(name, fields,
                                    defaults=defaults, module=module)
    nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
    return nm_tpl
于 2021-11-17T17:53:33.183 回答