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 回复

!rformat() 方法中的一个转换标志,它会在格式化之前,对传入的值(这里是 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

回到顶部