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

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

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

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

Самая интересная часть для меня была...

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

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

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

Ответ 1

>>> 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...>.

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ничего себе, это много рук, извивающихся.

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

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

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

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

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

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

Ответ 6

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

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

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