我们像这样使用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
需要第一个参数以及如何使用它或何时需要它。
答案 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
以后可以再次加载它的全局匹配的名称。但是,如果重新使用某个名称对您有意义,或者没有主动阻碍您的代码开发或调试任务,那么请务必重用该名称或选择您喜欢的任何名称。