!r 在 str() 和 repr() 中做了啥?

Posted

技术标签:

【中文标题】!r 在 str() 和 repr() 中做了啥?【英文标题】:What does !r do in str() and repr()?!r 在 str() 和 repr() 中做了什么? 【发布时间】:2016-11-19 23:02:45 【问题描述】:

根据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'

那么这里的“转换值”是什么意思呢?让它不那么可读?

【问题讨论】:

观察str(..)repr(..) 的不同精度很有趣 【参考方案1】:

我调用了 str(object) 和函数 -format() 和 print() 来计算,因为有人称之为“非正式”。

完美地打印对象的字符串表示。返回值也必须是字符串对象。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 这似乎无法回答str.format!r!s 的问题。另外,请edit 提供您所说的“非正式”的详细信息。【参考方案2】:

为了将某些东西in格式化为字符串,必须首先创建该东西的字符串表示。 “转换值”基本上是在谈论如何构造字符串表示。在 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__ 方法的对象),格式化输出不会有任何差异。

【讨论】:

显式优于隐式,请使用repr 而不是!r

以上是关于!r 在 str() 和 repr() 中做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

这个“and”语句实际上在返回中做了啥?

=== 在 PHP 中做了啥

elementFormDefault 在 XSD 中做了啥?

自动恢复在 Apache Pulsar 中做了啥?

典型的 ./configure 在 Linux 中做了啥?

$SIG'ALRM' 在 Perl 中做了啥