Я только что наткнулся на этот вопрос Difference between __str__
and __repr__
in Python и его упоминание о том, что основная цель __repr__
должна быть однозначной. Но я слышал, что основная цель __repr__
состоит в том, чтобы сгенерировать строку, так что eval()
может позже восстановить объект python. На самом деле, какова основная цель __repr__
? Выполняют ли какие-либо встроенные функции или любые модули по умолчанию в python, используя __repr__
для восстановления объекта? Будет ли это испортить выполнение, если мы просто перезапишем __repr__
так, чтобы он всегда возвращал постоянную строку (например, «foo»)?Основная цель __repr__ в python
ответ
Для типов, которые имеют буквальное обозначение (str
, int
, float
, list
и т.д.), repr()
возвращает строку, которая может быть использована для создания типа снова.
Это nice, но не обязательно.
Основная цель __repr__
- предоставить разработчику с однозначной информацией относительно того, какой объект у них здесь, для целей отладки.
Цитируя __repr__
documentation:
Вызывается встроенной функцией
repr()
вычислить «официальное» строковое представление объекта. Если это вообще возможно, это должно выглядеть как действительное выражение Python, которое может быть использовано для воссоздания объекта с тем же значением (с учетом соответствующей среды). Если это невозможно, необходимо вернуть строку формы<...some useful description...>
.
но больше всего:
Это, как правило, используется для отладки , поэтому важно, чтобы представление информации богатых и однозначными.
Emphasis mine.
Возвращение постоянной строки из вашего пользовательского типа не могло бы ничего сломать технически, но сделало бы вашу жизнь как разработчик труднее.
Соглашение состоит в том, что вы используете repr
, чтобы получить строку, представляющую объект, и str
, чтобы описать ее. repr
используется больше для отладки, str
для обычной печати. Идея состоит в том, что вывод репрезентации - это то, что выглядит как код, который вы могли бы оценить, и часто это так. Однако вы не можете полагаться на это. Если вам нужно преобразовать объект в строку и обратно, используйте pickle
или json
.
Например:
>>> greeting = "Hello"
>>> print str(greeting)
Hello
>>> print repr(greeting)
'Hello'
Если вы пишете свой собственный класс, и это очень просто, вы можете сделать __repr__
вернуть то, что может быть Эвальд:
class Song(object):
def __init__(self, title, artist):
self.title = title
self.artist = artist
def __repr__(self):
return "Song(%r, %r)" % (self.title, self.artist)
def __str__(self):
return "%s - %s" % (self.artist, self.title)
Обратите внимание, как Я использую %r
, чтобы получить repr
название и художник. Это автоматически устраняет и цитирует (для python), и позволяет мне оценивать результат repr(a_song)
, хотя я бы не делал этого вне отладки. Опять же, str
возвращает то, что вы напечатаете пользователю, repr
что-то, что поможет вам отлаживать. Если класс становится более сложным, вы не сможете вернуть что-то полное или возможное с repr
. Конвенция здесь, чтобы вернуть сжатую строку для идентификации вас экземпляра, как правило, с угловыми скобками:
>>> repr(type(None))
"<type 'NoneType'>"
>>> import gtk
>>> win = gtk.Window()
>>> repr(win)
'<gtk.Window object at 0x10de45690 (GtkWindow at 0x7fdd89240000)>'
- 1. Какова цель __str__ и __repr__?
- 2. Какова основная цель холста?
- 3. Основная цель C грамматика
- 4. Основная цель класса
- 5. Основная цель поля
- 6. SetLayout Функция Основная цель
- 7. Какова основная цель WebExceptionStatus.Success?
- 8. Python - Понимание __repr__
- 9. Основная цель событий в C#
- 10. Определение правильного __repr__ в Python
- 11. Основная цель использования заводской картины?
- 12. Какова основная цель свойства List.single?
- 13. Основная цель-C Указатель Вопрос
- 14. Какова основная цель IDE-рефрактора?
- 15. __repr__ реализация в связанном списке в python
- 16. Основная цель: в чем состоит цель этого. $ El.children(). Detach() ;?
- 17. Какова основная цель $ scope в контроллере AngularJS?
- 18. Какова основная цель наследования в ООП?
- 19. Использовать intropection для __repr__ в Python
- 20. Определение __repr__ при установке подкласса в Python
- 21. Использование __repr__ с модулем полки в Python
- 22. Назначение Python's __repr__
- 23. Основная цель файла с предварительно скомпилированным заголовком
- 24. Какова основная цель файла SSL_CTX_use_certificate_file от openssl?
- 25. Какова основная цель Object Scopes DI C#
- 26. Основная цель-C: Почему этот код работает?
- 27. Может ли модуль python иметь __repr__?
- 28. Основная цель уничтожить не отправлять параметры
- 29. Как использовать метод __repr__ python 2.7
- 30. Правильное использование Python __str__ и __repr__
+1, '__str __()' для пользователя, '__repr __()' для разработчика. –