什么做!在str()和repr()中做什么?

nal*_*zok 15 python string formatting repr python-2.7

根据Python 2.7.12文档:

!s(apply str())和!r(apply repr())可用于在格式化之前转换值.

>>> import math
>>> print 'The value of PI is approximately {}.'.format(math.pi)
The value of PI is approximately 3.14159265359.
>>> print 'The value of PI is approximately {!r}.'.format(math.pi)
The value of PI is approximately 3.141592653589793.
Run Code Online (Sandbox Code Playgroud)

有趣的是,转换后的值是输出repr(),而不是str().

>>> str(math.pi)
'3.14159265359'
>>> repr(math.pi)
'3.141592653589793'
Run Code Online (Sandbox Code Playgroud)

那么"转换价值"在这里意味着什么呢?使它不那么人性化?

mgi*_*son 25

为了格式化的东西一个字符串中的东西的字符串表示必须先创建."转换值"基本上是在讨论如何构造字符串表示.在python中,有两个相当自然的选择来获取某些东西的字符串表示... strrepr. str通常更人性化一点,repr一般更精确.也许官方文档是寻找差异的最佳位置:

object.__repr__(self)

  • repr()内置函数调用以计算对象的"官方"字符串表示.如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象(给定适当的环境).如果无法做到这一点,<...some useful description...>则应返回表单的字符串.返回值必须是字符串对象.如果类定义__repr__()但未定义__str__(),则__repr__()在需要该类的实例的"非正式"字符串表示时也使用.

  • 这通常用于调试,因此表示信息丰富且明确是很重要的.

object.__str__(self)

  • 由str(对象)和内置函数format()和print()调用,以计算对象的"非正式"或可良好打印的字符串表示形式.返回值必须是字符串对象.

  • 此方法的不同之处在于object.__repr__()不期望__str__()返回有效的Python表达式:可以使用更方便或简洁的表示.

  • 内置类型对象调用的默认实现调用object.__repr__().

str.format,!s选择使用str格式化对象,而!r选择repr格式化值.

字符串很容易看出差异(repr对于字符串将包括外部引号):

>>> 'foo {}'.format('bar')
'foo bar'
>>> 'foo {!r}'.format('bar')
"foo 'bar'"
Run Code Online (Sandbox Code Playgroud)

这两种方法之间的区别究竟真正取决于被格式化的对象.对于许多对象(例如那些不覆盖该__str__方法的对象),格式化输出没有区别.

  • @mehmet。`!r` 也非常明确。这就像说你应该使用 `a = a + 1` 而不是 `a += 1` 只是因为有人不熟悉语法。 (19认同)
  • 显式优于隐式,使用 `repr` 而不是 `!r`。 (8认同)