Python中!r和%r有什么区别?

73
作为标题所述,这两个标志之间有什么区别?它们似乎都使用repr()将值转换为字符串? 此外,在这行代码中:


此外,在这行代码中:

"{0!r:20}".format("Hello")  

在 !r 前面加 0 是什么意思?


2
0 表示“使用第 0 个位置参数” - 只有在您需要多次使用其中一个位置参数或需要支持 Python 2.6 时才需要它。"{} {}".format(...)将自动编号,以便在 Python 2.7 和 3.x 中被视为"{0} {1}".format(...)`。 - lvc
可能是Python字符串格式化:%与.format的重复问题。 - Andrea Corbellini
这可能是那种没有人预料到的面试问题之一 - undefined
1个回答

115

%r不是str.format()格式化操作中的有效占位符;它只在旧式%字符串格式化中起作用。它确实通过repr()函数将对象转换为表示形式。

str.format()中,!r是等效的,但这也意味着您现在可以使用所有的格式代码来格式化字符串。通常str.format()会调用对象本身的object.__format__()方法,但是通过使用!r,将使用repr(object).__format__()代替。

还有!s和(在Python 3中)!a转换器;它们首先应用str()ascii()函数。

0 前面的数字表示要使用 str.format() 方法中的哪个参数来填充该占位符;在您的情况下,位置参数 0"Hello"。您也可以使用 命名 参数,并将对象作为关键字参数传递:

"{greeting!r:20}".format(greeting="Hello")  

除非您使用的是Python 2.6版本,否则可以省略此内容,因为没有索引或名称的插槽会自动编号;第一个{}0,第二个{}将在索引1处获取第二个参数,以此类推。

2
谢谢,您能澄清一下“这也意味着您现在可以使用字符串的所有格式代码”是什么意思吗? - b_pcakes
3
冒号后面的代码将传递给object.__format__()方法,因此具有类型特定性。浮点数接受与字符串不同的格式化代码。因此,如果对象是浮点数,则使用的格式化代码与添加!r时不同。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接