Вопрос

Я читал о repr на языке Python.Мне было интересно, каково применение выходных данных repr есть.например ,

class A:
 pass

repr(A) ='<class __main__.A at 0x6f570>'

b=A()
repr(b) = '<__main__.A instance at 0x74d78>'

Когда кого-то могли бы заинтересовать '<class __main__.A at 0x6f570>' или'<__main__.A instance at 0x74d78>'?

Это было полезно?

Решение

Иногда вам приходится иметь дело с или Представьте строку байта такие как

bob2='bob\xf0\xa4\xad\xa2'

Если вы распечатаете это (в Ubuntu), вы получите

In [62]: print(bob2)
bob𤭢

Что не очень полезно для других, пытающихся понять вашу байтовую строку. В комментариях Джон указывает на это в Windows, print(bob2) приводит к чему -то вроде bob𤭢. Анкет Проблема в том, что Python обнаруживает кодирование по умолчанию вашего терминала/консоли и пытается расшифровать строку байта в соответствии с этим кодированием. Поскольку Ubuntu и Windows используют разные кодировки по умолчанию (возможно utf-8 а также cp1252 соответственно), возникают разные результаты.

Напротив, репресс из строки однозначен:

In [63]: print(repr(bob2))
'bob\xf0\xa4\xad\xa2'

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

В целом, REPR должен быть однозначным представлением строки объекта. repr(obj) вызывает объект objS. __repr__ метод Поскольку в вашем примере класс A не имеет своих __repr__ метод repr(b) прибегает к указанию адреса класса и памяти.

Вы можете переопределить __repr__ Метод для предоставления более актуальной информации.


В вашем примере, '<__main__.A instance at 0x74d78>' рассказывает нам две полезные вещи:

  1. что b это экземпляр класса Aв __main__пространство имен,
  2. и что объект находится в памяти по адресу 0x74d78.

Например, у вас есть два экземпляра класса A. Анкет Если у них один и тот же адрес памяти, вы бы знали, что они «указывают» на тот же основной объект. (Обратите внимание, что эта информация также может быть получена с помощью id).

Другие советы

Теоретически, repr(obj) должна выплюнуть нитку таким образом, чтобы ее можно было скормить eval чтобы воссоздать объект заново.Другими словами,

obj2 = eval(repr(obj1))

должен воспроизводить объект.

На практике, repr часто является "облегченной" версией str. str может напечатать удобочитаемую форму объекта, тогда как repr выводит информацию, такую как класс объекта, обычно для целей отладки.Но полезность во многом зависит от вашей ситуации и от того, как обрабатывается рассматриваемый объект repr.

Главная цель repr() является то, что он используется в интерактивном интерпретаторе и в отладчике для форматирования объектов в читаемой человеке. Пример, который вы дали, в основном полезен для отладки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top