namedtuple 的第一个参数是做啥用的?
Posted
技术标签:
【中文标题】namedtuple 的第一个参数是做啥用的?【英文标题】:What's the first argument of namedtuple used for?namedtuple 的第一个参数是做什么用的? 【发布时间】:2015-08-12 02:46:34 【问题描述】:我们像这样使用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 或谷歌搜索中找到解释。有一个相关的问题here,但它没有回答为什么namedtuple
需要第一个参数以及它如何使用或何时需要。
【问题讨论】:
想一想——如果类没有有__name__
,repr
会是什么样子?如果您设置ClassName = namedtuple('ClassName', ...)
,那么您可以使用例如eval
重新创建给定的实例。
你认为namedtuple的名字部分是从哪里来的?
@jonrsharpe 我之前对类名有一个误解,我认为它们应该是唯一的。
@WKPlus 他们通常应该是,是的,但不是必需。
【参考方案1】:
它设置生成的类的名称:
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> Point
<class '__main__.Point'>
>>> Point = namedtuple('Foobar', ['x', 'y'])
>>> Point
<class '__main__.Foobar'>
全局变量中的Point
名称只是对生成类的引用,类本身 需要有一个名称。不能从分配对象的变量中获取名称,因为该类是生成的first,并且仅在单独的步骤中分配了then(在namedtuple()
调用之后返回)。
它不需要唯一,就像使用class
时类名不需要唯一一样:
>>> class Foo(object):
... pass
...
>>> Bar = Foo
>>> class Foo(object):
... pass
...
>>> Bar
<class '__main__.Foo'>
>>> Foo
<class '__main__.Foo'>
您通常通过保持每个模块的名称唯一来避免这种事情,但您没有必须这样做。
该名称用于调试目的;在 tracebacks 和 repr()
输出中,会显示名称以帮助您确定所使用的类。
对于 Python,如果生成的类重用名称,并不重要。它适用于pickle
模块;如果您需要能够腌制您的命名元组类实例,请确保选择一个与全局匹配的名称,pickle
稍后可以通过该名称再次加载它。但是,如果重用名称对您有意义或不会积极阻碍您的代码开发或调试任务,那么请务必重用名称或选择您喜欢的任何名称。
【讨论】:
但是当我定义两个具有相同名称的命名元组时,它工作正常,为什么? @WKPlus 为什么不会呢? @WKPlus:我也可以创建多个具有相同名称的类。或功能。出于调试目的和清晰性,您希望它们保持唯一性,但这不是强制执行的。 两个同名但包含不同属性的命名元组,它仍然可以工作,这有意义吗? @WKPlus:如果对您作为开发人员来说它没有意义,那么不要使用重复的名称。但在某些情况下,按需生成命名元组类很容易,并且名称无关紧要,因此为每个类生成新的唯一名称也没有意义。以上是关于namedtuple 的第一个参数是做啥用的?的主要内容,如果未能解决你的问题,请参考以下文章
STUN stun.l.google.com:19302 是做啥用的
SetPixelFormat() 中的 PIXELFORMATDESCRIPTOR 参数是做啥用的?
predicateWithBlock: 中块的 bindings 参数是做啥用的?