@ARTIsshoque

В чём проблема с кодом из книги М.Саммерфилда?

Читаю книгу Марка Саммерфилда "Программирование на 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.
  • Вопрос задан
  • 187 просмотров
Решения вопроса 1
longclaps
@longclaps
Не знаю что там в книжке, а у вас Incident наследуется от Object, который определённо не является mapping объектом (каковым является, например, dict).
Оператор распаковки ** к нему неприменим.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Guest007
@Guest007
Django, Python, Linux и всё такое...
Меня всегда это поражало: зачем люди покупают книги, состоящие из скриншотов, листингов и воды? Вот прямо даже интересно. Стоимость - кошмарная: от 1 до нескольких тысяч. Без гарантии, что осилишь и что это пригодится. Одноразовый, по сути, продукт - если осилишь, то, скорее всего, больше к этому не вернёшься...

Есть, конечно, "Искусство программирования", Драконова книга и т.д. Но их не много.

А тут - в книге Python 3.0 и очень странные примеры. Про то, как чуть ли не руками читать/писать XML. Длиннющие портянки кода... Это примеры для начинающего? Зачем? Для профессионала? Он и сам разберется...

Мой совет - бросай это дело. Если с основами языка разобрался - попроходи https://checkio.org/
Попробуй порешать практические задачки в той области программирования, в которую нацелился (web, ml, gui big-data и т.д.) Найди интересные проекты тебе проекты на github и разоберись как работает, что можно улучшить...
Реальная практика всегда лучше выдуманной (из 2009 года :-) )

Прошу прощения, если резко...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы