namedtuple - 在相同的定义不同类型的名称的应用程序
Python的namedtuple
工厂功能允许子类它创建将被指定了两次的名称 - 第一对声明的左侧,然后作为该函数的第一参数( IPython的1.0.0,3.3.1的Python):namedtuple - 在相同的定义不同类型的名称的应用程序
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
的变量,这就是为什么当您尝试使用名称OtherTypeName
时出现NameError。传入namedtuple(在您的案例中为“OtherTypeName”)的名称的唯一真正用途是显示结果值。
显然,在许多情况下,很高兴有您用来指namedtuple是一样的自己的内部名称的变量;它使事情变得更加混乱。但是你可以有多个变量指向相同的名称:
NameOne = namedtuple('OtherTypeName', ['item'])
NameTwo = NameOne
。 。 。或者没有变量指向它直接,只能通过一些容器访问:
x = []
x.append(namedtuple('OtherTypeName', ['item']))
x[0] # this is your namedtuple
这不是这么多,有特殊作为的行为本身不是特别的这种“应用程序”:一个namedtuple是一个对象像任何其他一样,创建一个对象与创建一个变量来引用它不是一回事。