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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
от 150 000 до 250 000 руб.
YLab Тольятти
от 90 000 до 150 000 руб.
Платформа НТИ Москва
от 130 000 до 180 000 руб.
21 апр. 2019, в 21:02
1000 руб./за проект
21 апр. 2019, в 19:41
5000 руб./за проект
21 апр. 2019, в 19:20
3500 руб./за проект