2013-03-27 3 views
3

Я только что наткнулся на этот вопрос Difference between __str__ and __repr__ in Python и его упоминание о том, что основная цель __repr__ должна быть однозначной. Но я слышал, что основная цель __repr__ состоит в том, чтобы сгенерировать строку, так что eval() может позже восстановить объект python. На самом деле, какова основная цель __repr__? Выполняют ли какие-либо встроенные функции или любые модули по умолчанию в python, используя __repr__ для восстановления объекта? Будет ли это испортить выполнение, если мы просто перезапишем __repr__ так, чтобы он всегда возвращал постоянную строку (например, «foo»)?Основная цель __repr__ в python

ответ

8

Для типов, которые имеют буквальное обозначение (str, int, float, list и т.д.), repr() возвращает строку, которая может быть использована для создания типа снова.

Это nice, но не обязательно.

Основная цель __repr__ - предоставить разработчику с однозначной информацией относительно того, какой объект у них здесь, для целей отладки.

Цитируя __repr__ documentation:

Вызывается встроенной функцией repr() вычислить «официальное» строковое представление объекта. Если это вообще возможно, это должно выглядеть как действительное выражение Python, которое может быть использовано для воссоздания объекта с тем же значением (с учетом соответствующей среды). Если это невозможно, необходимо вернуть строку формы <...some useful description...>.

но больше всего:

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

Emphasis mine.

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

+4

+1, '__str __()' для пользователя, '__repr __()' для разработчика. –

0

Соглашение состоит в том, что вы используете 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)>' 
Смежные вопросы