namedtuple TypeError счетчик позиционных аргументов - PullRequest
0 голосов
/ 05 февраля 2019

Почему сообщение TypeError указывает 3 позиционных аргумента, если namedtuple вызывает только два?Почему говорится, что 4 были даны?

from collections import namedtuple
Transition = namedtuple('Transition', ('one', 'two'))
a = Transition(1,2,3)
#TypeError: __new__() takes 3 positional arguments but 4 were given

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Воспроизведите ваши ошибки

import collections

# Two-way construct numedtuple
# 1st way:use iterable object as 2nd paras
Transition01 = collections.namedtuple('Transition', ['one', 'two'])
# 2nd way:use space-splited string as 2nd paras
Transition02 = collections.namedtuple('Transition', 'one two')

# In order to figure out the field names contained in a namedtuple object, it is recommended to use the _fields attribute.
print(Transition01._fields)
print(Transition01._fields == Transition02._fields)

# After you know the field name contained in a namedtuple object, it is recommended to initialize the namedtuple using keyword arguments because it is easier to debug than positional parameters.
nttmp01 = Transition01(one=1, two=2)
nttmp02 = Transition01(1, 2)
print(nttmp01)
print(nttmp02)

Отладочная информация

=======================================

# Transition01(1, 2, 3)
# Traceback (most recent call last):
# TypeError: __new__() takes 3 positional arguments but 4 were given

========================================

Технические детали, которые вас интересуют

function namedtuple_Transition.Transition.__new__(_cls, one, two)

Анализ: Созданный вами объект класса именованного кортежа имеет внутренний метод реализации new и инженер, который определяетметод принимает объект вызывающего метода в качестве первого параметра метода, и это более распространенная форма определения метода класса.

0 голосов
/ 05 февраля 2019

Первым аргументом в методе экземпляра всегда является сам экземпляр (обычно называемый self. Вызов Transition(1,2) равен Transition.__new__(self, 1, 2).

* Edit: спасибо @Slam за указание на то, что namedtuple использовался __new__ вместо __init__

...