Читаю книгу Марка Саммерфилда "Программирование на Python 3". Возникла проблема с одним из примеров.
Саммерфилд использует следующий код:
def __repr__(self):
return ("Incident({report_id!r}, {date!r}, "
"{airport!r}, {aircraft_id!r}, "
"{aircraft_type!r}, "
"{pilot_percent_hours_on_type!r}, "
"{pilot_total_hours!r}, {midair!r}, "
"'''{narrative}''')".format(**self))
В классе, к которому относится данный метод, атрибуты используются в качестве свойств с методами чтения и записи.
На версии Python 3.5 этот участок кода вызывает исключение:
TypeError: format() argument after ** must be a mapping, not Incident
Вопрос в том, почему это происходит? Ошибка в книге или изменения в языке? Можно ли как-то заменить
**self, чтобы код стал работоспособным?
Для себя я решил проблему так:
Костыльdef __repr__(self):
return ("Incident({0!r}, {1!r}, {2!r}, {3!r}, {4!r}, {5!r}, {6!r}, {7!r}, '''{8}''')".format(
self.report_id, self.date, self.airport, self.aircraft_id, self.aircraft_type,
self.pilot_percent_hours_on_type, self.pilot_total_hours, self.midair, self.narrative
))
т.е. передавая атрибуты по одному,
но хочется избавиться от неясности и узнать на будущее, как правильно.
P.S. Если кому-то для ответа нужен полный код примера, он есть здесь:
https://pastebin.com/EEZ6W0bw
Класс, о котором идёт речь, начинается со строки 86.