Пропустить до содержимого

Как использовать __repr__ для удобного представления данных

[

Когда использовать .__repr__() против .__str__() в Python?

од Стивен Группетта, 22 марта 2023 г.

Вкратце: используйте .__repr__() для программистов и .__str__() для пользователей

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

Объект Python имеет несколько специальных методов, которые предоставляют определенное поведение. Существуют два похожих специальных метода, которые описывают объект с использованием строкового представления. Это методы .__repr__() и .__str__(). Метод .__repr__() возвращает подробное описание для программиста, который должен поддерживать и отлаживать код. Метод .__str__() возвращает упрощенное описание с информацией для пользователя программы.

Методы .__repr__() и .__str__() - это два из специальных методов, которые вы можете определить для любого класса. Они позволяют вам контролировать, как программа отображает объект в нескольких обычных формах вывода, таких как то, что вы получаете из функции print(), форматированных строк и интерактивных сред.

В этом учебнике вы узнаете, как отличить .__repr__() от .__str__() и как использовать эти специальные методы в определенных вами классах. Определение этих методов делает классы, которые вы пишете, более читаемыми и легче отлаживаемыми и поддерживаемыми. Итак, когда следует выбирать .__repr__() против .__str__ в Python?

Вкратце: используйте .__repr__() для программистов и .__str__() для пользователей

Специальные методы .__repr__() и .__str__() оба возвращают строковые представления объекта. Строковое представление - это строка, которая показывает информацию о объекте. Вы можете настроить эту информацию для разных аудиторий, таких как пользователи программы или ваши коллеги-программисты.

Как и с другими специальными методами с двойными подчеркиваниями в начале и в конце их имен, вы можете определить эти методы для любого класса.

Причина, по которой существует два метода для отображения объекта, заключается в том, что они имеют разные цели:

  • .__repr__() предоставляет официальное строковое представление объекта, предназначенное для программиста.
  • .__str__() предоставляет неформальное строковое представление объекта, предназначенное для пользователя.

Целевая аудитория для строкового представления, возвращаемого .__repr__(), - это программист, разрабатывающий и поддерживающий программу. В целом, оно предоставляет детальную и однозначную информацию о объекте. Еще одно важное свойство официального строкового представления состоит в том, что программист обычно может использовать его для создания объекта, идентичного оригинальному.

Метод .__str__() предоставляет строковое представление, нацеленное на пользователей программы, которые не обязательно являются программистами Python. Поэтому это представление позволяет любому пользователю понять и использовать объект, даже если он не имеет знаний о внутренней реализации класса или программе в целом.

Как получить доступ к строковым представлениям объекта?

Вы можете получить доступ к строковым представлениям объекта, используя соответствующие встроенные функции или методы. Вот несколько основных способов получить доступ к строковым представлениям объекта:

Функции str() и repr()

Стандартные встроенные функции str() и repr() используют методы .__str__() и .__repr__() соответственно для получения строковых представлений объекта. Вы можете вызывать эти функции, передавая объект в качестве аргумента:

my_object = MyClass()
str_representation = str(my_object)
repr_representation = repr(my_object)

Оператор print()

Оператор print() использует функцию str() для получения строки для печати на стандартный вывод. Вы можете передать объект как аргумент оператору print():

my_object = MyClass()
print(my_object)

Форматированные строки

Форматированные строки в Python используют функцию str.format() для подстановки значений в шаблон строки. При форматировании строки, объекты автоматически преобразуются в строковые представления с помощью метода .__str__():

my_object = MyClass()
formatted_string = "My object: {}".format(my_object)

Интерактивные среды

В интерактивных средах, таких как интерпретатор Python или блокнот Jupyter, ввод объекта в командную строку автоматически вызывает метод .__repr__() для отображения строкового представления объекта.

>>> my_object = MyClass()
>>> my_object

Должны ли вы определить .__repr__() и .__str__() в пользовательском классе?

В большинстве случаев имеет смысл определить и .__repr__() и .__str__() для пользовательского класса. По умолчанию, если вы не определите эти методы, Python будет использовать стандартные реализации, которые возвращают строки вида <__main__.MyClass object at 0x00000123456> для .__repr__() и <__main__.MyClass object> для .__str__().

Определение собственных методов .__repr__() и .__str__() позволяет вам контролировать вывод вашего объекта и предоставить более информативные и понятные строки для программистов и пользователей программы.

Заключение

В этом учебнике вы узнали о различиях между .__repr__() и .__str__() в Python, а также о том, как использовать эти методы для улучшения понятности и читаемости ваших классов. Теперь вы знаете, что использовать .__repr__() для программистов и .__str__() для пользователей, чтобы обеспечить наилучшую информативность и удобство использования ваших объектов.

Get Python Tricks »

Теперь, когда вы ознакомились с различием между .__repr__() и .__str__() вы можете более осознанно использовать эти методы в ваших программах Python. Определение правильных строковых представлений для ваших классов поможет сделать ваш код более читаемым и понятным для ваших коллег-программистов и пользователей программы.