str()vs repr()在Python中?

python中的str()和repr()方法都用于字符串的字符串表示。尽管它们看起来都服务于相同的目的,但是它们之间还是有一点差异。

您是否曾经注意到当调用python内置函数str(x)时会发生什么,其中x是您想要的任何对象?str(x)的返回值取决于两种方法:__str__是默认选择,__repr__作为后备。

首先让我们看看python文档对它们的评价-

>>> help(str)
Help on class str in module builtins:

class str(object)
| str(object='') -> str
| str(bytes_or_buffer[, encoding[, errors]]) -> str
|
| Create a new string object from the given object.

>>> help(repr)
Help on built-in function repr in module builtins:

repr(obj, /)
Return the canonical string representation of the object.

For many object types, including most builtins, eval(repr(obj)) == obj.

现在让我们尝试使用几个示例来了解这两种方法

>>> str(123)
'123'
>>> repr(123)
'123'
>>> #Above we see- with integer data, there is no difference
>>> #Now let's try string data on these two methods
>>> str('Python')
'Python'
>>> repr('Python')
"'Python'"

repr()和str()的返回值对于整数值是相同的,但是字符串的返回值之间是有区别的-一个是正式的,另一个是非正式的。

现在,如果您查看官方的python文档-__str__用于查找对象的“非正式”(可读)字符串表示形式,而__repr__用于查找对象的“正式”字符串表示形式。

正式表示和非正式表示之间的区别在于,可以将str值的__repr__的默认实现称为eval的参数,而返回值将是有效的字符串对象。此函数(repr())接受一个字符串,并将其内容评估为python代码。

因此,当我们将“ Python”传递给它时,它就起作用了。但是,“ Python”会导致错误,原因是它被解释为变量Python,这当然是未定义的。以下是了解它的代码-

>>> x = "Python"
>>> repr(x)
"'Python'"
>>> x1 = eval (repr(x))
>>> x == x1
True

因此,如果我们尝试将__str__的返回值作为eval的参数来调用,它将失败。

>>> y = "Python"
>>> str(y)
'Python'
>>> y1 = eval(str(y))
Traceback (most recent call last):
File "<pyshell#51>", line 1, in <module>
y1 = eval(str(y))
File "<string>", line 1, in <module>
NameError: name 'Python' is not defined

另一个展示两者之间差异的例子是-

>>> import datetime
>>> now = datetime.datetime.now()
>>> str(now)
'2019-03-29 01:29:23.211924'
>>> repr(now)
'datetime.datetime(2019, 3, 29, 1, 29, 23, 211924)'

在上面的输出中,str(now)计算一个包含now值的字符串,而repr(now)再次返回重建我们now对象所需的python代码。

关键差异

str()
repr()
使对象可读
复制对象的必需代码
生成输出给最终用户
为开发人员生成输出

在为类编写__str__和__repr__时,需要考虑以上几点。