Python interview - repr & str

Python中__str__和__repr__方法很容易混淆,并在面试中偶尔会突然碰到提问区别是什么。


简单来说,__repr__的目的是unambiguous明确数据,而__str__是为了数据readable更加可读。


Python 的官方documentation说,__repr__是compute the "official" string representation of an object, __str__是compute the "informal" string representation of an object. 使用print输出的时候,str方法用的是__str__来显示输出对象,repr方法用的是__repr__来显示输出对象。


import datetime
today = datetime.datetime.now()


s = str(today)
print s
print type(s)
r = repr(today)
print r
print type(r)


try:
    print eval(s)
    print eval('s')
except:
    pass


try:
    print eval(r)
    print type(eval(r))
    print eval('r')
    print type(eval('r'))
except:
    pass


# result


2014-10-24 17:26:25.499000
<type 'str'>
datetime.datetime(2014, 10, 24, 17, 26, 25, 499000)
<type 'str'>
2014-10-24 17:26:25.499000
<type 'datetime.datetime'>
datetime.datetime(2014, 10, 24, 17, 26, 25, 499000)
<type 'str'>


根据输出的结果,我们可以很容易的区分两者的区别,str方法输出的结果可以很容易的让用户明白日期和时间。不同的是,repr方法虽然说也是返回了一个string,但是是python "official"的数据结构,是一个可以容易被再改造的数据。

str方法得到的string值不能被eval方法在转换为一个object,repr的可以。因为是一个string,所以应该用引号括起来,用eval方得到一个datetime的对象。


IDE中的输出我们并看不出结果的区别。 其实应该是这样的。

>>> x = 1
>>> repr(x)
'1'
>>> str(x)
'1'
>>> y = 'a string'
>>> repr(y)
"'a string'"
>>> str(y)
'a string'

数字没区别,对于string,repr会多加上一对双引号。

>>> repr(y)
"'a string'"
>>> y2 = eval(repr(y))
>>> y == y2
True

相对而言,repr和eval就是一对相异的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值