Pythonnamedtuple
工厂函数允许将它创建的子类的名称指定两次-首先在声明的左侧,然后作为函数的第一个参数(IPython 1.0.0,Python 3.3.1):
In [1]: from collections import namedtuple
In [2]: TypeName = namedtuple('OtherTypeName', ['item'])
我在docs.python.org网站上看到的所有示例在两个位置都使用相同的名称。但是可以使用不同的名称,它们的功能也不同:
In [3]: TypeName(1)
Out[3]: OtherTypeName(item=1)
In [4]: type(TypeName)
Out[4]: builtins.type
In [5]: type(OtherTypeName)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-8-6616c1214742> in <module>()
----> 1 type(OtherTypeName)
NameError: name 'OtherTypeName' is not defined
In []: OtherTypeName(1)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-9-47d6b5709a5c> in <module>()
----> 1 OtherTypeName(1)
NameError: name 'OtherTypeName' is not defined
我想知道这个功能可能有什么应用程序。
最佳答案
你不能指定两次名字。调用namedtuple时指定一个“内部”名称,然后将生成的namedtuple类型分配给变量。
您指定作为namedtuple参数的参数是namedtuple类型对其名称的自己的概念,即“它自己所称的”等号左边的东西只是一个普通的python变量,您可以将namedtuple类型赋给它。
如果将创建的namedtuple分配给某个对象,则只能使用它,并且只能通过将其分配给的名称使用它。将“othertypename”作为“name”传递不会神奇地创建名为OtherTypeName
的变量,这就是为什么在尝试使用名称OtherTypeName
时会出现名称错误。传递给namedtuple的名称(在您的示例中为“othertypename”)的唯一实际用途是显示结果值。
显然,在许多情况下,让用来引用namedtuple的变量与它自己的内部名称相同是很好的;这样可以减少混淆但是可以有多个变量指向同一名称的对偶:
NameOne = namedtuple('OtherTypeName', ['item'])
NameTwo = NameOne
是的。……或者没有直接指向它的变量,只能通过某些容器访问它:
x = []
x.append(namedtuple('OtherTypeName', ['item']))
x[0] # this is your namedtuple
与其说存在这种特殊的“应用程序”,不如说行为本身并不特殊:namedtuple与其他对象一样是一个对象,创建对象与创建引用它的变量不同。