Репрезентативная форма в строковом питоне

Я быстро изучал Python, и меня смущают форма представления и строковая форма объекта, а также метод repr. Я называю x = Point(1, 3) следующим кодом и получаю:

class Point():
def __init__(self, x, y):
    '''Initilizae the object'''
    self.x = x
    self.y = y
def __repr__(self):
    return "Point({0.x!r}, {0.y!r})".format(self)
def distance_from_origin(self):
    return math.hypot(self.x, self.y)
>>>x
Point(1, 3)

Если! R поле преобразования предназначено для представления переменной в строке, которая может быть оценена Python для создания другого идентичного объекта с помощью оператора eval(), почему это не работает:

class Point():
    def __init__(self, x, y):
        '''Initilizae the object'''
        self.x = x
        self.y = y
    def __repr__(self):
        return "{!r}".format(self)
    def distance_from_origin(self):
        return math.hypot(self.x, self.y)
>>>x
File "C:\...\...\examplepoint.py, line 8, in __repr__
   return "{!r}".format(self)
File "C:\...\...\examplepoint.py, line 8, in __repr__
   return "{!r}".format(self)
File "C:\...\...\examplepoint.py, line 8, in __repr__
   return "{!r}".format(self)
File "C:\...\...\examplepoint.py, line 8, in __repr__
   return "{!r}".format(self)
The same error for 100 more lines
RuntimeError: maximum recursion depth exceeded

Я думал, что спецификация! R создаст объект x типа Point в строку в форме представления, которая будет выглядеть следующим образом: Point(1, 3) или аналогично первому запуску. Как именно Python делает это представление! R в строковом формате и что именно это означает? Почему не работает второй пример?

1 ответ

Решение

!r звонки repr() (который вызывает __repr__ внутренне) на объекте, чтобы получить строку. Нет смысла просить о представлении объекта в определении его __repr__, Это рекурсивно, и это то, что говорит вам трассировка. Не требуется, чтобы представление объекта было оцениваемым, и Python не создает такого представления для вас.

Другие вопросы по тегам