eval()官方文档里面给出来的功能解释是:将字符串string对象转化为有效的表达式参与求值运算返回计算结果
语法上:调用的是:eval(expression,globals=None, locals=None)返回的是计算结果
其中:
expression是一个参与计算的python表达式
globals是可选的参数,如果设置属性不为None的话,就必须是dictionary对象了
locals也是一个可选的对象,如果设置属性不为None的话,可以是任何map对象了
python是用命名空间来记录变量的轨迹的,命名空间是一个dictionary,键是变量名,值是变量值。
当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:
1)局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x, 或一个参数 x,Python 将使用它,然后停止搜索。
2)全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
3)内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。
举例子,可能不是好例子,因为原作者说的是滥用,但是可以用来体会eval的功能:)
1)大概意思就是定义一个函数,清理一个嵌套list中的字符串数据,按照对应可以解析的数据类型进行转换。
正常情况下,大多数人的方法可能是用 try int,float, 加 if 判断,但是写起相当麻烦.这里用eval函数实现
起来却非常省事。
1 def clean_data(data):
2 for sub_list in data:
3 for i in range(len(sub_list)):
4 try:
5 sub_list[i] = eval(sub_list[i])
6 except SyntaxError:
7 sub_list[i] = None
8 except NameError:
9 pass
10
11 d = [['abc', '123', '45.6', 'True', 'False']]
12 clean_data(d)
13 print(d)
14
15 d = [['ab2'], ['-123'], ['45.6'], ['False', '3.2']]
16 clean_data(d)
17 print(d)
输出结果:
[['abc', 123, 45.6, True, False]]
[['ab2'], [-123], [45.6], [False, 3.2]]
可以看到, 字符串还是字符串,字符串中包含数字的转换为数字, 包含布尔值的字符串都变为布尔值.其实就是字符串的表达式化.
如果字符串里面还有一个类名字,例如: 'class_name'
那么使用eval('class_name')()就可以创建一个类的实例. 比如下面代码
1 >>> class T(object):
2 ... def __init__(self):
3 ... print("hello from T")
4 ...
5 >>> type(eval('T'))
6 <class 'type'>
7 >>> eval('T')
8 <class '__main__.T'>
9 >>> eval('T')()
10 hello from T
11 <__main__.T object at 0x0000016E0D5BCDD8>
12 >>>