Python 命名为tuple—;同一定义中不同类型名称的应用程序

Python 命名为tuple—;同一定义中不同类型名称的应用程序,python,namedtuple,Python,Namedtuple,Pythonnamedtuplefactory函数允许将它创建的子类的名称指定两次——首先在声明的左侧,然后作为函数的第一个参数(IPython 1.0.0,Python 3.3.1): 我在docs.python.org网站上看到的所有示例在两个位置都使用相同的名称。但是可以使用不同的名称,它们的功能也不同: In [3]: TypeName(1) Out[3]: OtherTypeName(item=1) In [4]: type(TypeName) Out[4]: builtins.ty

Python
namedtuple
factory函数允许将它创建的子类的名称指定两次——首先在声明的左侧,然后作为函数的第一个参数(IPython 1.0.0,Python 3.3.1):

我在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
[3]中的
:TypeName(1)
Out[3]:OtherTypeName(项=1)
在[4]中:类型(TypeName)
Out[4]:内置类型
在[5]中:键入(OtherTypeName)
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在()
---->1类型(其他类型名称)
名称错误:未定义名称“OtherTypeName”
在[]中:其他类型名称(1)
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在()
---->1其他类型名称(1)
名称错误:未定义名称“OtherTypeName”

我想知道这个功能可能有哪些应用程序。

您没有两次指定名称。在调用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与其他对象一样是一个对象,创建一个对象与创建一个引用它的变量不同

x = []
x.append(namedtuple('OtherTypeName', ['item']))
x[0] # this is your namedtuple