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

Как использовать __repr__ в Python?

[

Когда следует использовать .repr() против .str() в Python?

by Stephen Gruppetta Mar 22, 2023 0 Комментарии

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

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

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

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

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

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

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

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

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

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

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

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

Строковое представление объекта можно получить с помощью встроенных функций Python, таких как str() и repr(), или при выполнении операций, которые требуют преобразования объекта в строку, например, при использовании функции print().

>>> class Point:
... def __init__(self, x, y):
... self.x = x
... self.y = y
...
>>> p = Point(3, 4)
>>> str(p)
'<__main__.Point object at 0x110d0cb90>'
>>> repr(p)
'<__main__.Point object at 0x110d0cb90>'
>>> print(p)
<__main__.Point object at 0x110d0cb90>'

Обратите внимание, что по умолчанию объекты класса имеют официальное строковое представление вида <__main__.Point object at 0x110d0cb90>. Это не очень читабельно для пользователя программы. Вам может потребоваться определить методы .__repr__() и .__str__() для вашего собственного класса, чтобы предоставить более информативные и понятные строковые представления.

>>> class Point:
... def __init__(self, x, y):
... self.x = x
... self.y = y
...
... def __repr__(self):
... return f"Point(x={self.x}, y={self.y})"
...
... def __str__(self):
... return f"({self.x}, {self.y})"
...
>>> p = Point(3, 4)
>>> str(p)
'(3, 4)'
>>> repr(p)
'Point(x=3, y=4)'
>>> print(p)
'(3, 4)'

Теперь объект Point имеет пользовательское строковое представление в виде '(3, 4)', которое понятно и удобочитаемо. Официальное строковое представление теперь выглядит как 'Point(x=3, y=4)', что предоставляет подробную информацию о состоянии объекта для программиста.

Следует ли определять .repr() и .str() в пользовательском классе?

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

Однако определение данных методов не является обязательным и зависит от ваших конкретных потребностей. В некоторых случаях может быть достаточно использовать только один из этих методов или вообще не определять их, особенно если вы работаете с небольшими прототипами или простыми классами.

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

Заключение

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

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

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