В интерактивном режиме используется sys.displayhook, который по умолчанию среди других вещей вызывает repr(obj):
def displayhook(value):
if value is None:
return
# Set '_' to None to avoid recursion
builtins._ = None
text = repr(value)
try:
sys.stdout.write(text)
except UnicodeEncodeError:
bytes = text.encode(sys.stdout.encoding, 'backslashreplace')
if hasattr(sys.stdout, 'buffer'):
sys.stdout.buffer.write(bytes)
else:
text = bytes.decode(sys.stdout.encoding, 'strict')
sys.stdout.write(text)
sys.stdout.write("\n")
builtins._ = value
Назначение repr(obj) получить однозначное текстовое представление объекта (полезно для отладки). Идеально, eval(repr(obj)) == obj, например:
>>> import datetime
>>> datetime.datetime.utcnow()
datetime.datetime(2015, 7, 28, 17, 24, 57, 111636)
repr для datetime объекта позволяет воспроизвести его точно.
print(obj) может вызывать str(obj). Назначение str(obj) получить читаемое текстовое представление для объекта:
>>> print(datetime.datetime.utcnow())
2015-07-28 17:24:57.111636
str, repr встроенные функции могут вызывать __str__, __repr__ методы, чтобы реализовать нестандартное поведение. Cтандартное поведение repr(obj) не очень полезно:
>>> object()
<object object at 0x7fe8a7a560f0>
Для Юникодных строк, в Питоне 2 существует __unicode__ метод:
>>> class C:
... def __str__(self):
... return "str"
... def __repr__(self):
... return "repr"
... def __unicode__(self):
... return u"unicode"
...
>>> C()
repr
>>> print(C())
str
>>> u"%s" % C()
u'unicode'
Если __str__, __unicode__ не определены, то используется repr() функция:
>>> class NoStr:
... def __repr__(self):
... return "repr"
...
>>> NoStr()
repr
>>> print(NoStr())
repr
>>> u"%s" % NoStr()
u'repr'
Не следует вызывать __str__, __repr__ напрямую. Эти методы не усиливают возвращаемый тип, в отличии от соответствующих функций.
Ссылки