repr函数可以辅助我们输出调试信息,下面介绍下他的一些用法
使用print输出调试信息时候,不会输出变量的类型。在调试程序时候需要查看它的类型时就变得很重要,使用repr函数可以输出他们类型的差别。
# 使用print输出的结果没法判断5是int类型还是字符串类型
print(5)
print('5')
# 使用repr函数输出的变量可以区分变量类型
print(repr(5))
print(repr('5'))
运行上面代码输出结果,最后两个5类型是不一样的。
5
5
5
'5'
对于内置类型外的类型来说,print函数所打印的默认就是示例的repr值,所以无需专门调用repr,object子类的repr默认实现不是很有用,举个例子看下。
class OpaqueClass:
def __init__(self, x, y):
self.x = x
self.y = y
obj = OpaqueClass(1, 'foo')
# 默认调用repr输出信息
print(obj)
运行上面的代码,输出的信息只有一个实例地址。对于调试来说参考价值不大,下面我们来重写repr输出自定义信息。
<__main__.OpaqueClass object at 0x10b71cb50>
如果这个类是受我们控制,那么可以重写repr魔法函数定义输出信息。
class BetterClass:
def __init__(self, x, y):
self.x = x
self.y = y
# 重写repr魔法方法,输出调试信息
def __repr__(self):
return f'BetterClass({self.x!r}, {self.y!r})'
# Example 10
obj = BetterClass(2, 'bar')
print(obj)
运行上面的代码,输出了调试信息。
BetterClass(2, 'bar')
如果这个类不受我们控制,那么可以用其他的办法,把对象的实例字典传给print函数,这个字典是实例的dict属性。
obj = OpaqueClass(4, 'baz')
print(obj.__dict__)
运行上面的代码可以看到输出了调试信息
{'x': 4, 'y': 'baz'}