【问题标题】:What is the difference between !r and %r in Python?Python 中的 !r 和 %r 有什么区别?
【发布时间】:2016-01-10 21:03:57
【问题描述】:

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

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

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

【问题讨论】:

  • 0 表示“使用第 0 个位置参数”——仅当您要多次使用位置参数之一或需要支持 Python 2.6 时才需要它。 "{} {}".format(...)` 会自动编号,以便在 Python 2.7 和 3.x 中被视为 "{0} {1}".format(...)

标签: python string format string-formatting


【解决方案1】:

%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 处的第二个参数,等等。

【讨论】:

  • 谢谢,您能否澄清一下“这也意味着您现在可以使用字符串的所有格式代码”是什么意思?
  • : 冒号之后的代码被传递给object.__format__() 方法,因此是特定于类型的。浮点数接受来自字符串的不同格式代码。因此,如果对象是浮点数,您将使用与添加 !r 时不同的格式代码。
猜你喜欢
  • 2019-06-20
  • 2010-11-19
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2011-08-12
  • 2021-02-23
  • 1970-01-01
  • 2013-03-04
相关资源
最近更新 更多