Python объект .__ repr __ (self) должен быть выражением? - PullRequest
68 голосов
/ 17 января 2009

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

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

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

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

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

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

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

Ответы [ 7 ]

64 голосов
/ 17 января 2009
>>> 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...>.

31 голосов
/ 17 января 2009

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

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

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

11 голосов
/ 17 января 2009

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

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

4 голосов
/ 17 января 2009

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

Ух ты, это много ужимок.

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

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

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

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

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

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

1 голос
/ 13 августа 2018

'repr' означает репрезентацию. Сначала мы создаем экземпляр координаты класса.

x = Coordinate(3, 4) 

Тогда, если мы введем x в консоль, th-й вывод будет

<__main__.Coordinate at 0x7fcd40ab27b8>

Если вы используете repr ():

>>> repr(x)
Coordinate(3, 4)

вывод совпадает с 'Coordinate (3, 4)', за исключением того, что это строка. Вы можете использовать ее для воссоздания экземпляра координаты.

В заключение, в методе repr () выводится строка, представляющая объект.

1 голос
/ 28 марта 2018

Чтобы увидеть, как repr работает в классе, запустите следующий код сначала с, а затем без repr метода

class Coordinate (object):
    def __init__(self,x,y):
        self.x = x
        self.y = y

    def getX(self):
        # Getter method for a Coordinate object's x coordinate.
        # Getter methods are better practice than just accessing an attribute directly
        return self.x
    def getY(self):

        # Getter method for a Coordinate object's y coordinate
        return self.y

    def __repr__(self):  #remove this and the next line and re-run
        return 'Coordinate(' + str(self.getX()) + ',' + str(self.getY()) + ')' 

>>>c = Coordinate(2,-8)
>>>print(c)
0 голосов
/ 22 июля 2015

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

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

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

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