Есть ли использование для _tuple в Python?

Я прочитал официальную документацию 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 был защищенным значением ? Я прав?

Из общего исходного кода (вы можете увидеть исходный код, сгенерированный для этого конкретного namedtuple, путем печати 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 

collections.namedtuple был добавлен в Python 2.6.0. Это был исходный исходный код метода __new__ :

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

Дело в том, что исходный код находится в строке . Позднее они форматируют его, используя % locals() . Если tuple был указан в argtxt , то tuple.__new__ __new__ методом __new__ любого поля, содержащего tuple . Напротив, _tuple работает так, как ожидалось, потому что namedtuple не разрешает имена полей, начинающиеся с _ .

Ошибка была исправлена ​​в выпуске Python 2.6.3 (см. Журнал изменений – collections.namedtuple () не работал со следующими именами полей: cls, self, tuple, itemgetter и свойство ).