在namedtuple中输入提示


127

考虑以下代码:

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

上面的代码只是演示我正在尝试实现的方法。我想namedtuple使用类型提示。

您知道如何以一种优雅的方式达到预期效果吗?


2
另外,从py3.7开始,您可以使用dataclass选项: docs.python.org/3/library/dataclasses.html
JohnE,

Answers:


150

从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)

12
@JohnE; OP专门询问了命名元组。是的,数据类将更好地服务于命名元组的许多用例。但是要引用出色的为什么不命名元组
Wolfgang Kuehn

1
使用数据类,不可能像元组那样解构结果对象
VARAK

6
元组是不可变的。数据类不是(默认情况下)它确实具有冻结的标志,该标志接近元组的行为。只是要注意的事情。
shao.lo

103

您可以使用 typing.NamedTuple

来自文档

类型版本namedtuple

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

仅在Python 3.5及更高版本中存在


我宣布它是这样的:GeoPoint = NamedTuple('GeoPoint', [('longitude', float), ('latitude', float)])那我试试地理=的GeoPoint(**数据),其中数据包含所需的密钥和值是字典decimal.Decimal,并没有强制转换为浮动情况;(无typerror要么:( :(所以这是如何typing.NamedTuple工作看?要点.github.com / andilabs / 15002176b2bda786b9037077fa06cc71
andilabs

8
@andi输入不会强制或强制转换变量,afaik。
巴尔加夫(Bhargav Rao)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.