Разберём два выражения
1️⃣Объект p принадлежит классу Price. Метод __repr__ возвращает строку DEBUG, а __format__ — PUBLIC.
2️⃣В выражении f"{p}" Python вызывает p.__format__(""). Пустая строка означает, что после двоеточия не задан формат. Наш метод возвращает PUBLIC.
3️⃣В выражении f"{p!r}" сначала вызывается repr(p). Получается строка DEBUG, после чего форматирование применяется уже к этой строке. Метод Price.__format__ здесь не вызывается.
4️⃣Оба результата передаются в print, который разделяет их пробелом. Итоговый вывод: PUBLIC DEBUG.
Почему это важно
Класс может по-разному представлять объект в отчёте и при отладке. Например, __format__ выводит цену с валютой, а __repr__ показывает данные для диагностики. Добавление !r меняет путь преобразования, поэтому его нельзя считать просто декоративной пометкой.
Post #4926
155