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.xdim.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 声明并在一行中使用的主要内容,如果未能解决你的问题,请参考以下文章

collections模块学习之namedtuple

命名元组namedtuple

关于Python3的namedtuple问题

Python的namedtuple使用详解

namedtuple的简单使用

让 namedtuple 接受 kwargs