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 1 def clean_data(data): 2 2 for sub_list in data: 3 3 for i in range(len(sub_list)): 4 4 try: 5 5 sub_list[i] = eval(sub_list[i]) 6 6 except SyntaxError: 7 7 sub_list[i] = None 8 8 except NameError: 9 9 pass 1010 1111 d = [['abc', '123', '45.6', 'True', 'False']] 1212 clean_data(d) 1313 print(d) 1414 1515 d = [['ab2'], ['-123'], ['45.6'], ['False', '3.2']] 1616 clean_data(d) 1717 print(d)

输出结果:

[['abc', 123, 45.6, True, False]]
[['ab2'], [-123], [45.6], [False, 3.2]]

可以看到, 字符串还是字符串,字符串中包含数字的转换为数字, 包含布尔值的字符串都变为布尔值.其实就是字符串的表达式化.

如果字符串里面还有一个类名字,例如: 'class_name'

那么使用eval('class_name')()就可以创建一个类的实例. 比如下面代码

1 1 >>> class T(object): 2 2 ... def __init__(self): 3 3 ... print("hello from T") 4 4 ... 5 5 >>> type(eval('T')) 6 6 <class 'type'> 7 7 >>> eval('T') 8 8 <class '__main__.T'> 9 9 >>> eval('T')() 1010 hello from T 1111 <__main__.T object at 0x0000016E0D5BCDD8> 1212 >>>
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Python中eval的使用 - HelloWorld