Pull to refresh

В чем разница между __str__ и __repr__ в Python

Привет Хабр!

image

__str__ и __repr__ — оба методы для получения строкового представления объекта. __str__ это должен быть короткий и более user-friendly, а __repr__ предполагается предоставить более подробную информацию.

* Реализация по умолчанию не имеет смысла.
* __repr__ цель-быть однозначным.
* __str__ цель-БЫТЬ читаемым
*Контейнера __str__ использует объекты, содержащиеся’ __repr__

Реализация по умолчанию бесполезно

В основном это удивительно, так как Python по умолчанию, как правило, достаточно полезно. Однако, в этом случае, имея по умолчанию для __repr__ что будет действовать, как:

return "%s(%r)" % (self.__class__, self.__dict__)

было бы слишком опасно (например, слишком легко попасть в бесконечную рекурсию, если объекты ссылаются друг на друга). Обратите внимание, что по умолчанию, которое является истинным: если __repr__ определяется и __str__ не, объект будет вести себя так, как будто __str__=__repr__.

Это означает, в простых выражениях: почти каждый объект реализации должна иметь функциональные __repr__ это применимо для понимания объекта. Реализация __str__ необязательно: что, если вам нужно “pretty print” функциональность (например, используется генератор отчетов).

Цель __repr__ — быть однозначным

Дай мне прийти прямо сказать — я не верю в отладчики. Я действительно не знаю, как пользоваться отладчиком, и никогда не использовал один серьезно. Кроме того, я считаю, что большая вина в отладчики является их основной характер — большинство отказов я debug это было давным-давно, в галактике далеко, далеко. Это означает, что я верю, с религиозным рвением, лесозаготовительной промышленности. Ведение журнала-это кровеносная система любой приличный огонь и забыть системы сервера. Python позволяет легко журнала: может быть, с некоторых конкретных проектов обертки, все, что вам нужно, это

log(INFO, «I am in the weird function and a is», a, «and b is», b, «but I got a null C — using default», default_c)

Но вы должны сделать последний шаг — сделать так, чтобы каждый объект, который вы реализации полезна repr, поэтому код, который можно просто работать. Вот почему “eval” вещь: если у вас есть достаточно информации, чтобы eval(repr©)==c, это означает, что вы знаете все, что нужно знать о c. Если это достаточно просто, по крайней мере, в нечеткий образ, сделать это. Если нет, убедитесь, что у вас есть достаточно информации о c в любом случае. Я обычно использую eval-формате: «MyClass (=% r,=% r)» % (self.this,self.that). Это не значит, что вы действительно сможете сделать MyClass, или что это правильные аргументы конструктора — но это полезная форма выражения “это все, что вам нужно знать об этом экземпляре”.

Примечание: я использовал %r выше, не %s. Вы всегда хотите использовать repr() [или %r форматирование символов, эквивалентно] внутри __repr__ реализации, или ты победив цель repr. Вы хотите быть в состоянии различать MyClass(3) и MyClass(«3»).

Цель __str__ это было читаемо

В частности, он не предназначен, чтобы быть однозначной — обратите внимание, что str(3)==str(«3»). Аналогично, если вы реализуете IP-абстракция, имеющая ул выглядят как 192.168.1.1-это просто замечательно. При реализации дату/время абстракции, ул может быть «2010/4/12 15:35:22»и др. Цель: представить это таким образом, что пользователь, а не программист, хотели бы, чтобы прочитать его. Отрубить бесполезных цифр, притвориться другим классом — как долго он поддерживает читаемость, это улучшение.

Контейнера __str__ использует объекты, содержащиеся’ __repr__

Это, кажется, удивляет, не так ли? Это немного, но как бы читаемым

[moshe is, 3, hello
world, this is a list, oh I don't know, containing just 4 elements]

Не очень. В частности, строки в контейнере бы найти его слишком легко нарушить его строковое представление. Перед лицом неопределенности, помните, Python сопротивляется искушению догадываться. Если вы хотите, чтобы над поведение, когда вы используете для печати списка, просто

print "["+", ".join(l)+"]"

Резюме

Реализации __repr__ для реализации любого класса. Это должна быть вторая натура. Реализации __str__ если вы думаете, что было бы полезно получить строковую версию, который ошибается в сторону более читаемости в пользу большей неоднозначности.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.
Change theme settings