repr与eval函数使用,其实eval还真的蛮不错的。
还是上基础,__str__与__repr__其实我有非常长的时间一直搞不清楚,他们具体有什么用。
今天回头看了下高手老师以前的教学视频,结合《深入了解Python特性》的书中知识。给自己备注下。
反着说,首先说比较少用的repr与eval这么简单的两个函数我以前尽然很长时间不理解。
eval简单来说可以还原任何repr返回的对象。
a = 123 a_repr = repr(a) b = eval(a_repr) print(a == b)
返回的是true
以前我一直不理解,repr与str的关系,感觉就是repr就是在上面有套了一层引号,还是字符串,为什么还要设计一个repr做什么。
其实repr一般与eval配对使用,一个任何的Python对象对可以使用repr函数(方法),通俗的理解我觉的可以说是用字符串的形式保存了下来,但可以用eval还原出来。
class Car: def __init__(self, color, mileage): self.color = color self.mileage = mileage
car = Car('red', 123) cat_repr = repr(car) car_2 = eval(cat_repr) print(car_2.color)
实例也可以通过repr保存,然后通过eval返回对象。repr是Python里面应该最厉害的多态形式表达的一种,因为任何一个对象都拥有该方法,但每个方法的执行输出都不一样。
eval对象里面如果是一些逻辑运算,还能算出里面的值,很早的时候,我就用eval给孩子做了心算表格。
eval('1+2') 3 eval('1.2+2') 3.2
在一些外国教材或者小学生教材中,用eval('具体数字')我觉的比用int或float是合适多了,eval其实是最原始的还原对象初始的状态,以前还教孩子最好用int或者float感觉有所误导他。
最后说一个format格式化输出中的!r用法
在字符串的格式话中如果想格式化输入一个对象的repr状态,简单的格式化输入会有误解。
a = '[1,2,3]' b = [1,2,3] f'a is {a}, b is {b}' 'a is [1,2,3], b is [1, 2, 3]'
在上面的代码中,从输出来看,根本无法看出来,原始状态喜爱,a与b的初始状态。
a = '[1,2,3]' b = [1,2,3] f'a is {a}, b is {b}' 'a is [1,2,3], b is [1, 2, 3]' f'a is {a !r}, b is {b !r}' "a is '[1,2,3]', b is [1, 2, 3]"
但在!r输出中,可以明显的看出a与b的区别,a在repr之后,外面有一层小括号,说明以前该对象是列表,而b就明显以前是列表。
__str__与__repr__的区别下一篇开始讲。