在前面的答案的基础上建立并展示更多示例。如果使用得当,str 和repr 之间的区别就很明显了。简而言之,repr 应该返回一个可以复制粘贴的字符串以重建对象的确切状态,而str 对于logging 和observing 调试结果很有用。下面是一些示例,可以查看一些已知库的不同输出。
日期时间
print repr(datetime.now()) #datetime.datetime(2017, 12, 12, 18, 49, 27, 134411)
print str(datetime.now()) #2017-12-12 18:49:27.134452
str 可以很好地打印到日志文件中,如果您想直接运行它或将其作为命令转储到文件中,可以重新使用 repr。
x = datetime.datetime(2017, 12, 12, 18, 49, 27, 134411)
麻木
print repr(np.array([1,2,3,4,5])) #array([1, 2, 3, 4, 5])
print str(np.array([1,2,3,4,5])) #[1 2 3 4 5]
在 Numpy 中,repr 再次可直接使用。
自定义 Vector3 示例
class Vector3(object):
def __init__(self, args):
self.x = args[0]
self.y = args[1]
self.z = args[2]
def __str__(self):
return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z)
def __repr__(self):
return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z)
在这个例子中,repr 再次返回一个可以直接使用/执行的字符串,而str 作为调试输出更有用。
v = Vector3([1,2,3])
print str(v) #x: 1, y: 2, z: 3
print repr(v) #Vector3([1,2,3])
要记住一件事,如果str 未定义但repr,str 将自动调用repr。所以,至少定义repr总是好的