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

What is the difference between !r and %r in Python?

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

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

!r 前面的 0 有什么作用?

%r 不是 str.format() 格式化操作中的有效占位符;它仅适用于 old-style % string formatting。它确实通过 repr() 函数将对象转换为表示形式。

str.format()中,!r是等价的,但这也意味着您现在可以将所有format codes用于一个字符串。通常 str.format() 将调用对象本身的 object.__format__() 方法,但是通过使用 !r,将使用 repr(object).__format__() 代替。

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

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

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

除非您使用的是 Python 2.6,否则您可以省略此项,因为没有索引或名称的插槽会自动编号;第一个 {}0,第二个 {} 在索引 1 处接受第二个参数,等等