Объект Python .__ repr __ (self) должен быть выражением?

Я смотрел на встроенные методы объекта в документации Python , и меня интересовала документация для object.__repr__(self) . Вот что он говорит:

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

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

Самое интересное для меня было …

Если это вообще возможно, это должно выглядеть как действительное выражение Python, которое может быть использовано для воссоздания объекта с одинаковым значением

… но я точно не знаю, что это значит. В нем говорится, что это должно выглядеть как выражение, которое может быть использовано для воссоздания объекта, но означает ли это, что это просто пример того типа выражения, которое вы могли бы использовать, или должно быть фактическое выражение, которое может быть выполнено (eval и т. д.) для воссоздания объекта? Или … должно быть, это просто повторение фактического выражения, которое использовалось для чистых информационных целей?

В общем, я немного смущен тем, что я должен здесь положить.

6 Solutions collect form web for “Объект Python .__ repr __ (self) должен быть выражением?”

 >>> from datetime import date >>> >>> repr(date.today()) # calls date.today().__repr__() 'datetime.date(2009, 1, 16)' >>> eval(_) # _ is the output of the last command datetime.date(2009, 1, 16) 

Вывод – это строка, которая может быть проанализирована интерпретатором python и приводит к равному объекту.

Если это невозможно, он должен вернуть строку в виде <...some useful description...> .

Это должно быть выражение Python, которое, когда eval'd, создает объект с теми же свойствами, что и этот. Например, если у вас есть класс Fraction который содержит два целых числа, числитель и знаменатель, ваш __repr__() будет выглядеть следующим образом:

 # in the definition of Fraction class def __repr__(self): return "Fraction(%d, %d)" % (self.numerator, self.denominator) 

Предполагая, что конструктор принимает эти два значения.

Guideline: Если вы можете кратко представить точное представление , отформатируйте его как выражение Python (это означает, что он может быть как eval'd, так и скопирован непосредственно в исходный код, в правильном контексте). Если вы предоставляете неточное представление , используйте формат <...> .

Существует множество возможных представлений для любого значения, но наиболее интересным для программистов на Python является выражение, которое воссоздает значение. Помните, что те, кто понимает Python, являются целевой аудиторией, и именно поэтому неточные представления должны включать соответствующий контекст. Даже <XXX object at 0xNNN> умолчанию <XXX object at 0xNNN> , но почти полностью бесполезный, по-прежнему предоставляет тип, id() (для различения разных объектов) и указание на то, что лучшего представления нет.

«но означает ли это, что это просто пример того типа выражения, которое вы могли бы использовать, или оно должно быть реальным выражением, которое может быть выполнено (eval и т. д.), чтобы воссоздать объект? Или … должно ли это быть просто повторение фактического выражения, которое использовалось для чистых информационных целей? »

Вау, это много рук.

  1. «Пример такого выражения, который вы могли бы использовать», не был бы представлением конкретного объекта. Это не может быть полезным или значимым.

  2. В чем разница между «фактическим выражением, которое может … воссоздать объект» и «повторением фактического выражения, которое было использовано [для создания объекта]»? Оба являются выражением, которое создает объект. Между ними нет практического различия. Повторный вызов мог бы произвести либо новое выражение, либо исходное выражение. Во многих случаях они одинаковы.

Обратите внимание, что это не всегда возможно, практично или желательно.

В некоторых случаях вы заметите, что repr () представляет строку, которая явно не является выражением какого-либо рода. Значение по умолчанию () для любого класса, который вы определяете, не является полезным в качестве выражения.

В некоторых случаях у вас могут быть взаимные (или круговые) ссылки между объектами. Представление () этой запутанной иерархии не имеет смысла.

Во многих случаях объект создается инкрементально через парсер. Например, из XML или JSON или что-то в этом роде. Каким будет представительство? Оригинальный XML или JSON? Очевидно, нет, поскольку они не Python. Это может быть какое-то выражение Python, которое генерирует XML. Однако для гигантского XML-документа было бы невозможно написать одно выражение Python, которое было бы функциональным эквивалентом анализа XML.

Мир :),

Это может быть полезно: http://www.rafekettler.com/magicmethods.html

Я думаю, что путаница здесь коренится с английского. Я имею в виду __repr__() ; короткий для «представления» значения, которое я угадываю, как @ S.Lott сказал

«В чем разница между« фактическим выражением, которое может … воссоздать объект »и« повторением фактического выражения, которое было использовано [для создания объекта] »? Оба являются выражением, которое создает объект. практическое различие между ними.Революционный вызов может привести либо к новому выражению, либо к оригинальному выражению. Во многих случаях они одинаковы ».

Но в некоторых случаях они могут быть разными. Например; координаты, вы можете захотеть, чтобы c.coordinate вернул: 3,5 но c.__repr__ чтобы вернуть Coordinate(3, 5) . Надеюсь, что имеет смысл …

  • Как включить сторонние библиотеки Python в Google App Engine?
  • OrderedDict для более старых версий python
  • что функция (var1) (var2) в python
  • Удалить символ при определенном индексе - python
  • Python - Извлечение нескольких списков из списка списков по индексу
  • Как я могу сортировать кортежи?
  • Python config parser для получения всех значений из раздела?
  • Outerzip / zip самая длинная функция (с несколькими значениями заполнения)
  • Python - лучший язык программирования в мире.