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

时间:2016-07-17 05:04:43

标签: python string python-2.7 formatting repr

根据Python 2.7.12 documentation

  

!s(应用str())和!r(应用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.

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

>>> str(math.pi)
'3.14159265359'
>>> repr(math.pi)
'3.141592653589793'

那么“转换价值”在这里意味着什么呢?减少人类的可读性?

1 个答案:

答案 0 :(得分:19)

为了在字符串中格式化中的某些内容,必须首先创建该字符串的字符串表示形式。 “转换值”基本上是在讨论如何构造字符串表示。在python中,有两个相当自然的选择来获取某些东西的字符串表示...... strreprstr通常更加人性化,repr通常更精确。也许official documentation是寻找差异的最佳去处:

  

object.__repr__(self)

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

  •   
  • 这通常用于调试,因此表示信息丰富且明确无误。

  •   
     

object.__str__(self)

     
      
  • 由str(object)和内置函数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'"

这两种方法之间的区别实际上取决于被格式化的对象。对于许多对象(例如那些不覆盖__str__方法的对象),格式化输出没有区别。