在一行中声明和使用NamedTuple

17 投票
2 回答
5384 浏览
提问于 2025-04-27 22:47

我想存储一个名为 namedtuple 的维度 (x, y)。在我的整个程序中,我只需要用到一次。

我可以这样做:

Dimension = namedtuple('Dimension', ['x', 'y'])
dim = Dimension(2, 3)

但是,因为我确定在整个程序中只需要这个 Dimension,所以我在想是否可以把它简化成一行代码,这样我就可以像访问 dim.xdim.y 这样来访问这个对象的属性?

暂无标签

2 个回答

6

我自己也遇到过这个问题很多次;如果Python的标准库在collections模块里有一个这样的方便函数,那就太好了。不过如果没有,你也可以自己在本地定义一个:

def make_namedtuple(class_name, **fields):
    return namedtuple(class_name, fields)(*fields.values())

这样你就可以为一个单独的实例创建一个新的、一次性使用的命名元组类,方法如下:

dim = make_namedtuple('Dimension', x=2, y=3)

这个方法适用于Python 3.6及以上版本[1]

[1] 在Python 3.6之前的版本中,**fields的顺序是不会被保留的(换句话说,就是在PEP 468之前)。你仍然可以使用这个函数,但我觉得这就有点失去创建一个像元组一样可以展开的类的意义了……

25

这里不需要临时名称 Dimension

dim = namedtuple('Dimension', ['x', 'y'])(2, 3)

另外,你可以使用 type 的三参数形式来创建一个新类,并实例化它:

dim = type('Dimension', (object,), {'x': 2, 'y': 3})()

这个对象会占用更多的内存,但和 namedtuple 不同,它是可变的(这对你的使用场景来说可能是好事,也可能不是)。它还省去了一个 import 的步骤。

撰写回答