Python中的_tuple有用吗?

时间:2014-08-16 06:23:40

标签: python namedtuple python-internals

我今天阅读了collections.namedtuple的官方文档,并在_tuple方法中找到了__new__。我没有找到_tuple的定义位置。

您可以尝试在Python中运行以下代码,它不会引发任何错误。

>>> Point = namedtuple('Point', ['x', 'y'], verbose=True)
class Point(tuple):
    'Point(x, y)'

    __slots__ = ()

    _fields = ('x', 'y')

    def __new__(_cls, x, y):
        'Create a new instance of Point(x, y)'
        return _tuple.__new__(_cls, (x, y)) # Here. Why _tuple?

更新:

有什么好处
from builtins import property as _property, tuple as _tuple

这只是让tuple成为受保护的值吗?我是对的吗?

1 个答案:

答案 0 :(得分:8)

来自通用source code(您可以通过打印Point._source查看为此特定命名元素生成的源代码):

from builtins import property as _property, tuple as _tuple

所以_tuple这里只是内置tuple类型的别名:

In [1]: from builtins import tuple as _tuple

In [2]: tuple is _tuple
Out[2]: True
在Python 2.6.0中添加了

collections.namedtuple。这是__new__方法的初始源代码:

def __new__(cls, %(argtxt)s):
    return tuple.__new__(cls, (%(argtxt)s)) \n

问题是,源代码在 string 中。他们稍后使用% locals()对其进行格式化。如果tuple中列出了argtxt,则tuple.__new__会调用__new__字段中包含的tuple字段。相比之下,_tuple按预期工作,因为namedtuple不允许以_开头的字段名称。

该错误已在Python 2.6.3发行版中修复(请参阅changelog - collections.namedtuple()未使用以下字段名称:cls,self,tuple,itemgetter和property < / em>的)。