在一行中声明和使用NamedTuple
我想存储一个名为 namedtuple
的维度 (x, y)
。在我的整个程序中,我只需要用到一次。
我可以这样做:
Dimension = namedtuple('Dimension', ['x', 'y'])
dim = Dimension(2, 3)
但是,因为我确定在整个程序中只需要这个 Dimension
,所以我在想是否可以把它简化成一行代码,这样我就可以像访问 dim.x
和 dim.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
的步骤。