蟒蛇namedtuple
工厂函数允许指定它创建的子类的名称两次 - 第一次在声明的左侧,然后作为函数的第一个参数(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类型。
您只能在将创建的命名元组分配给某个对象时使用它,并且只能通过分配给它的名称来使用它。传递“OtherTypeName”作为“名称”并不会神奇地创建一个名为的变量OtherTypeName
,这就是为什么当您尝试使用该名称时会收到 NameErrorOtherTypeName
。传递给namedtuple的名称(在您的例子中为“OtherTypeName”)的唯一真正用途是显示结果值。
显然,在许多情况下,让用于引用命名元组的变量与其自己的内部名称相同是很好的;它让事情变得不那么混乱。但是你可以有多个变量指向同一个命名元组:
NameOne = namedtuple('OtherTypeName', ['item'])
NameTwo = NameOne
。 。 。或者没有变量直接指向它,并且只能通过某个容器访问它:
x = []
x.append(namedtuple('OtherTypeName', ['item']))
x[0] # this is your namedtuple
与其说它有特殊的“应用”,不如说它的行为本身并不特殊:namedtuple 是一个像任何其他对象一样的对象,创建一个对象与创建一个引用它的变量不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)