字符串格式化python中的表示形式

Representational form in string formating python

我一直在快速学习python,并对对象的表示形式和字符串形式以及repr方法感到困惑。我用以下代码调用x=点(1,3)并得到:

1
2
3
4
5
6
7
8
9
10
11
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 conversion字段用于表示字符串中的变量,python可以使用eval()语句计算该字符串以创建另一个相同的对象,为什么不起作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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类型的点创建成一个字符串,其表示形式类似于:点(1,3)或类似于第一次运行。python是如何做到这一点的!字符串格式的r,它到底是什么意思?为什么第二个例子不起作用?


!r在对象上调用repr()(在内部调用__repr__)以获取字符串。在其__repr__的定义中要求对象的表示是没有意义的。这是递归的,这就是回溯告诉你的。没有要求对象的表示必须是可计算的,而且Python不会为您创建这种表示。