我今天阅读了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
成为受保护的值吗?我是对的吗?
答案 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>的)。