NamedTuple 声明并在一行中使用
Posted
技术标签:
【中文标题】NamedTuple 声明并在一行中使用【英文标题】:NamedTuple declaration and use in a single line 【发布时间】:2014-12-11 20:37:14 【问题描述】:我想存储一个维度namedtuple
(x, y)
。我在整个程序中只需要一次。
我能做到:
Dimension = namedtuple('Dimension', ['x', 'y'])
dim = Dimension(2, 3)
但是,因为我确定这是整个程序中唯一需要的 Dimension
,所以我想知道是否可以将它变成单行代码,返回一个我可以访问其属性的对象,例如 dim.x
和dim.y
?
【问题讨论】:
@jonrsharpe 猜猜这是一个非常愚蠢的问题!看来可以了,谢谢! @jonrsharpe 如何将其发布为答案,以便 OP 可以接受并且人们可以投票? :) 有一些枚举类可以让你做到这一点......你在哪个 python 版本上?这里有两个不同的答案:***.com/questions/36932/…。使用标准的 python3+ ,它看起来像这样:dimension = Enum('Dimension', (('x',2),('y', 3)))
,而使用旧版本(我更喜欢它,并且有一些基于它的类)你可以这样做:dimension = Enum(x=2, y=3)
...
【参考方案1】:
不需要临时名称Dimension
:
dim = namedtuple('Dimension', ['x', 'y'])(2, 3)
或者,您可以使用type
的三参数形式来创建新类并创建它的实例:
dim = type('Dimension', (object,), 'x': 2, 'y': 3)()
此对象将使用更多内存,但与namedtuple
不同,它将是可变的(这对您的用例来说可能是好事,也可能不是好事)。它还保存了一个import
。
【讨论】:
【参考方案2】:我自己也经常遇到这个问题; 如果 Python 标准库在 collections
模块中内置了以下便利函数,那会很棒。但取而代之的是,您始终可以在本地自行定义:
def make_namedtuple(class_name, **fields):
return namedtuple(class_name, fields)(*fields.values())
有了这个,你可以像这样为单个实例实例化一个新的、一次性的 namedtuple 类:
dim = make_namedtuple('Dimension', x=2, y=3)
这适用于Python 3.6+[1]。
[1] **fields
' 的顺序在 Python PEP 468 之前的版本)上不维护。您仍然可以使用该函数,但它有点违背了让类像元组一样解包的目的,imo...
【讨论】:
以上是关于NamedTuple 声明并在一行中使用的主要内容,如果未能解决你的问题,请参考以下文章