Python中 'Item({!r})'.format(self.name) 中的 !r 是什么意思?
Python Cookbook 3rd 的 1.5 章有一段代码如下:
>>> class Item:
... def __init__(self,name):
... self.name=name
... def __repr__(self):
... return 'Item({!r})'.format(self.name)
...
请问 return 语句中的 !r 是什么意思,我咋个都搜不到,谢谢!
Python中 'Item({!r})'.format(self.name) 中的 !r 是什么意思?
3 回复
!r 是 format() 方法中的一个转换标志,它会在格式化之前,对传入的值(这里是 self.name)调用 repr() 函数。
简单来说:
str():返回给人看的、友好的字符串表示。repr():返回给解释器看的、明确的、通常能用于重新创建该对象的字符串表示。对于字符串,最明显的区别就是它会包含引号。
看个例子就明白了:
class Item:
def __init__(self, name):
self.name = name
def __str__(self):
# 假设我们有一个Item对象,它的name是 "Coffee Mug"
item1 = Item("Coffee Mug")
item2 = Item("The \"Special\" Item")
# 不使用 !r
print('Item({})'.format(item1.name)) # 输出: Item(Coffee Mug)
print('Item({})'.format(item2.name)) # 输出: Item(The "Special" Item) <-- 这里格式乱了,引号成了字符串的一部分
# 使用 !r
print('Item({!r})'.format(item1.name)) # 输出: Item('Coffee Mug') <-- 自动加了引号
print('Item({!r})'.format(item2.name)) # 输出: Item('The "Special" Item') <-- 外层单引号明确了字符串边界,内部的引号被正确转义
# 这行代码通常用在 __repr__ 方法里,用来生成对象的官方字符串表示。
def __repr__(self):
return 'Item({!r})'.format(self.name) # 这样 eval(repr(item)) 就能得到一个类似的新对象
# 验证一下
my_item = Item("Test")
print(repr(my_item)) # 输出: Item('Test')
所以,{!r} 的作用就是确保 self.name 的值被清晰地表示出来,特别是当它包含特殊字符(如引号、换行符)时,能避免歧义,并且生成的字符串更适合用于调试或重新构造对象。
总结:用 !r 是为了得到明确无歧义的表示。
Three conversion flags are currently supported: ‘!s’ which calls str() on the value, ‘!r’ which calls repr() and ‘!a’ which calls ascii().
thanks

