3 回答

TA贡献2065条经验 获得超14个赞
使用命名的tuple,它已添加到Python 2.6的标准库的collections模块中。如果您需要支持Python 2.4,也可以使用Raymond Hettinger的命名元组配方。
这对于您的基本示例很好,但是也涵盖了以后可能会遇到的许多极端情况。您上面的片段将写为:
from collections import namedtuple
MyStruct = namedtuple("MyStruct", "field1 field2 field3")
新创建的类型可以这样使用:
m = MyStruct("foo", "bar", "baz")
您还可以使用命名参数:
m = MyStruct(field1="foo", field2="bar", field3="baz")

TA贡献1784条经验 获得超8个赞
更新:数据类
通过引入数据类中的Python 3.7,我们非常接近。
下面的示例类似于下面的NamedTuple示例,但是结果对象是可变的,并且允许使用默认值。
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
z: float = 0.0
p = Point(1.5, 2.5)
print(p) # Point(x=1.5, y=2.5, z=0.0)
如果您想使用更多特定的类型注释,那么这与新的键入模块配合使用非常好。
我一直在拼命等待!如果您问我,数据类和新的NamedTuple声明,再加上键入模块,真是天赐之物!
改进了NamedTuple声明
从Python 3.6开始,只要您可以忍受不变性,它就变得非常简单和美观(IMHO)。
引入了一种声明NamedTuples的新方法,该方法还允许类型注释:
from typing import NamedTuple
class User(NamedTuple):
name: str
class MyStruct(NamedTuple):
foo: str
bar: int
baz: list
qux: User
my_item = MyStruct('foo', 0, ['baz'], User('peter'))
print(my_item) # MyStruct(foo='foo', bar=0, baz=['baz'], qux=User(name='peter'))
添加回答
举报