Когда выходные данные repr полезны?
Вопрос
Я читал о 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)
вызывает объект obj
S. __repr__
метод Поскольку в вашем примере класс A
не имеет своих __repr__
метод repr(b)
прибегает к указанию адреса класса и памяти.
Вы можете переопределить __repr__
Метод для предоставления более актуальной информации.
В вашем примере, '<__main__.A instance at 0x74d78>'
рассказывает нам две полезные вещи:
- что
b
это экземпляр классаA
в__main__
пространство имен, - и что объект находится в памяти по адресу 0x74d78.
Например, у вас есть два экземпляра класса A
. Анкет Если у них один и тот же адрес памяти, вы бы знали, что они «указывают» на тот же основной объект. (Обратите внимание, что эта информация также может быть получена с помощью id
).
Другие советы
Теоретически, repr(obj)
должна выплюнуть нитку таким образом, чтобы ее можно было скормить eval
чтобы воссоздать объект заново.Другими словами,
obj2 = eval(repr(obj1))
должен воспроизводить объект.
На практике, repr
часто является "облегченной" версией str
. str
может напечатать удобочитаемую форму объекта, тогда как repr
выводит информацию, такую как класс объекта, обычно для целей отладки.Но полезность во многом зависит от вашей ситуации и от того, как обрабатывается рассматриваемый объект repr
.
Главная цель repr()
является то, что он используется в интерактивном интерпретаторе и в отладчике для форматирования объектов в читаемой человеке. Пример, который вы дали, в основном полезен для отладки.