Python中eval的使用

       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 >>>

 

posted @ 2018-12-14 11:49  元宝向前  阅读(3025)  评论(0编辑  收藏  举报