编程语言
首页 > 编程语言> > python-namedtuple —在相同定义中使用不同类型名称的应用

python-namedtuple —在相同定义中使用不同类型名称的应用

作者:互联网

Python 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类型.

如果将其分配给某物,则只能使用创建的namedtuple,并且只能通过为其分配名称来使用它.将“ OtherTypeName”作为“名称”传递不会神奇地创建一个名为OtherTypeName的变量,这就是为什么当您尝试使用名称OtherTypeName时会出现NameError的原因.传递给namedtuple的名称(在您的情况下为“ OtherTypeName”)的唯一实际用途是显示结果值.

显然,在许多情况下,将用于引用namedtuple的变量与其内部名称相同是一件很不错的事情.它使事情变得不那么混乱.但是您可能有多个变量指向同一个namedtuple:

NameOne = namedtuple('OtherTypeName', ['item'])
NameTwo = NameOne

. . .或没有直接指向它的变量,只能通过某个容器访问它:

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

并不是说有特殊的“应用程序”,而是行为本身并不特殊:namedtuple是一个像其他对象一样的对象,创建对象与创建引用它的变量并不相同.

标签:namedtuple,python
来源: https://codeday.me/bug/20191122/2063056.html