2013-08-25 36 views
2

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 

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

回答

2

你不指定两次名。您在调用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是一个对象像任何其他一样,创建一个对象与创建一个变量来引用它不是一回事。

相关问题