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

字符串格式python中的表示形式,python,string,format,repr,Python,String,Format,Repr,我一直在快速学习Python,对对象的表示形式和字符串形式以及repr方法感到困惑。我用以下代码调用x=点(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_

我一直在快速学习Python,对对象的表示形式和字符串形式以及repr方法感到困惑。我用以下代码调用x=点(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 conversion字段用于表示字符串中的变量,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类型的点创建为一个字符串,其表示形式类似于:点(1,3)或类似于第一次运行。Python是如何实现这种表示的!字符串格式的r,它的确切含义是什么?为什么第二个示例不起作用?

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

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

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

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

这里回答了这个问题:。当前支持两个转换标志:“!s”调用该值上的str(),以及“!r”调用repr()。此处回答此问题:。当前支持两个转换标志:“!s”调用该值上的str(),以及“!r”调用repr()。此处回答此问题:。当前支持两个转换标志:“!s”调用该值上的str(),以及“!r”调用repr()。此处回答此问题:。当前支持两个转换标志:“!s”对值调用str(),以及“!r”调用repr()