今天和大家介绍一个python内置的函数:好用的eval。
1.eval的好处
eval的功能是将一个字符串转换成python对象,比如可以将浮点型字符转换为浮点型进行运算。
float_str = "8.8"
print(eval(float_str), type(eval(float_str)), type(float_str))
# 8.8 <class 'float'> <class 'str'>
这似乎没什么了不起,强制类型转换而已。我们再来看一个例子:
fn_str = "sum([2, 3, 4])"
print(eval(fn_str))
# 9
从上可知,eval可以将函数调用的字符串直接转换函数的执行。
eval的另一个场景是:通过字符串(通常是在配置文件里)选择需要执行的函数, 见如下例子:
def process_a(info):
print("A: {}".format(info))
def process_b(info):
print("B: {}".format(info))
fn_select = "a"
process_fn = eval('process_{}'.format(fn_select))
process_fn('this is process ')
# A: this is process
上面例子中,我们提供了不同处理函数process_*,实际调用的时候可能会根据不同情况调用不同处理函数,或者尝试不同的处理函数的差异,我们就可以通过eval来将函数名转换为函数对象。
2.eval的注意事项
由于eval能够将字符串转换为实际的对象,如果是函数调用,就会执行;所以使用eval的时候,要避免不良的字符串命令, 如:
eval("__import__('os').system('rm -rf /home/*')")
上述例子把home目录所有数据都删除了;所以避免eval里的参数接受公开的输入。