Разница между __str__и __repr__. (3/5)

python magic-methods repr




Answer 11 Casebash


Из (неофициальной) справочной вики по Python (архивная копия) от effbot:

__str__ " вычисляет" неформальное "строковое представление объекта. Это отличается от __repr__ в том, что оно не обязательно должно быть допустимым выражением Python: вместо него можно использовать более удобное или сжатое представление. "




Answer 12 Inconnu


str - Создает новый строковый объект из данного объекта.

repr - возвращает каноническое строковое представление объекта.

Различия:

str():

  • делает объект читабельным
  • генерирует вывод для конечного пользователя

repr():

  • нужен код,воспроизводящий объект
  • генерирует вывод для разработчика



Answer 13 bluenote10


Один аспект,который отсутствует в других ответах.Это правда,что в целом:

  • Цель __str__ : человекочитаемый
  • Цель __repr__ : однозначное, возможно, машиночитаемое через eval

К сожалению, это различие некорректно, потому что Python REPL, а также IPython используют __repr__ для печати объектов в консоли REPL (см. Связанные вопросы для Python и IPython ). Таким образом, проекты, предназначенные для работы с интерактивной консолью (например, Numpy или Pandas), начали игнорировать вышеприведенные правила и вместо этого предоставляют удобочитаемую реализацию __repr__ .




Answer 14 Ijaz Ahmad Khan


Из книги Свободный Питон :

Основным требованием к объекту Python является предоставление удобных строковых представлений самого себя,одно из которых используется для отладки и протоколирования,другое-для представления конечным пользователям.Поэтому
в модели данных существуют специальные методы __repr__ и __str__ .




Answer 15 orome


Отличные ответы уже охватывают разницу между __str__ и __repr__ , которая для меня сводится к тому, что первое читается даже конечным пользователем, а второе максимально полезно для разработчиков. Учитывая это, я обнаружил, что реализация по умолчанию __repr__ часто не может достичь этой цели, потому что в ней отсутствует информация, полезная для разработчиков.

По этой причине, если у меня достаточно простой __str__ , я обычно просто пытаюсь получить лучшее из обоих миров с чем-то вроде:

def __repr__(self):
    return '{0} ({1})'.format(object.__repr__(self), str(self))