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

WKP*_*lus 13 python namedtuple python-collections

我们用namedtuple这样的:

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p=Point(1,2)
>>> p.x
1
Run Code Online (Sandbox Code Playgroud)

我发现第一个论点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
Run Code Online (Sandbox Code Playgroud)

其次,似乎没有约束(例如,我们不必使其独特):

>>> 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)
Run Code Online (Sandbox Code Playgroud)

我没有从手册或谷歌搜索中找到解释.还有一个相关的问题在这里,但它没有回答为什么namedtuple需要第一个参数,它如何被使用,当它的必要.

Mar*_*ers 12

它设置生成的类的名称:

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

Point你的全局变量中的名称只是对生成的类的引用,类本身需要有一个名称.名称不能从与对象分配可变服用,因为类产生第一和仅然后在单独的步骤(该分配后namedtuple()调用返回).

它不需要是唯一的,就像使用时类名不需要是唯一的一样class:

>>> class Foo(object):
...     pass
... 
>>> Bar = Foo
>>> class Foo(object):
...     pass
... 
>>> Bar
<class '__main__.Foo'>
>>> Foo
<class '__main__.Foo'>
Run Code Online (Sandbox Code Playgroud)

你通常会避免这种事情的名称保持每个模块唯一的,但你不具备对.

该名称用于调试目的; 在回溯和repr()输出中,显示的名称可帮助您确定使用的类.

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