namedtuple的第一个参数用于什么?

时间:2015-05-29 09:36:09

标签: python namedtuple python-collections

我们像这样使用namedtuple

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p=Point(1,2)
>>> p.x
1

我发现namedtuple的第一个参数似乎没用,因为:

首先,我们不能使用它(例如创建实例):

>>> from collections import namedtuple
>>> P = namedtuple('Point', ['x', 'y'])
>>> p = Point(1,2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'Point' is not defined

其次,它似乎没有约束(例如,我们不必使其唯一):

>>> P1 = namedtuple('Point', ['x', 'y'])
>>> P2 = namedtuple('Point', ['x', 'y', 'z'])
>>> p1 = P1(1,2)
>>> p2 = P2(1,2,3)
>>> p1
Point(x=1, y=2)
>>> p2
Point(x=1, y=2, z=3)

我没有从manual或通过Google搜索找到解释。有一个相关的问题here,但它没有回答为什么namedtuple需要第一个参数以及如何使用它或何时需要它。

1 个答案:

答案 0 :(得分:11)

它设置生成的类的名称:

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> Point
<class '__main__.Point'>
>>> Point = namedtuple('Foobar', ['x', 'y'])
>>> Point
<class '__main__.Foobar'>

全局变量中的Point名称只是对生成的类的引用,类本身需要有一个名称。该名称不能从分配了该对象的变量中获取,因为该类是先生成 ,然后在单独的步骤中(仅在{{1}之后)分配然后 } call returns)。

与使用namedtuple()时类名称不必是唯一的一样,它不需要是唯一的:

class

你通常会通过保持每个模块的名称唯一来避免这种事情,但你不能拥有

该名称用于调试目的;在追溯和>>> class Foo(object): ... pass ... >>> Bar = Foo >>> class Foo(object): ... pass ... >>> Bar <class '__main__.Foo'> >>> Foo <class '__main__.Foo'> 输出中,显示的名称可以帮助您找出使用的类。

对于Python,如果生成的类重用了名称,则并不重要。它适用于repr()模块;如果你需要能够挑选你的命名元组类实例,请确保选择一个与pickle以后可以再次加载它的全局匹配的名称。但是,如果重新使用某个名称对您有意义,或者没有主动阻碍您的代码开发或调试任务,那么请务必重用该名称或选择您喜欢的任何名称。