字符串格式的表示形式 python
Representational form in string formating python
我一直在快速学习 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 的,它到底是什么意思?为什么第二个示例不起作用?
!r
在对象上调用 repr()
(在内部调用 __repr__
)以获取字符串。在 __repr__
的定义中要求对象的表示是没有意义的。这是递归的,这就是回溯告诉你的。没有要求对象的表示必须是可评估的,Python 不会为您创建这种表示。
我一直在快速学习 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 的,它到底是什么意思?为什么第二个示例不起作用?
!r
在对象上调用 repr()
(在内部调用 __repr__
)以获取字符串。在 __repr__
的定义中要求对象的表示是没有意义的。这是递归的,这就是回溯告诉你的。没有要求对象的表示必须是可评估的,Python 不会为您创建这种表示。