python中eval方法的妙用
python中eval的妙用
对于python中的eval函数,通常就知道是一个计算函数,比如:
eval("111")
Out[7]: 111
x = 1
y = eval("x+1")
y
Out[30]: 2
但是最近发现,eval函数可以将字符类型中的格式转化成对应的数据类型;例如
a = """{"a":"b"}"""
type(a)
Out[3]: str
b = eval(a)
b
Out[5]: {'a': 'b'}
type(b)
Out[6]: dict
可以看到,字符串a,内容上是dict格式.但是想直接强转
c = dict(a)
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3398, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-8-37ec6a275a35>", line 1, in <cell line: 1>
c = dict(a)
ValueError: dictionary update sequence element #0 has length 1; 2 is required
又比如
a
Out[12]: '[["000001","HXCZHH","hahahaha","2","HUAXIACHENGZHANGHUNHE"]]'
b = list(a)
b[0]
Out[14]: '['
c = eval(a)
c[0]
Out[16]: ['000001', 'HXCZHH', 'hahahaha', '2', 'HUAXIACHENGZHANGHUNHE']
type(a)
Out[17]: str
type(b), type(c)
Out[18]: (list, list)
这里,a是字符串,里面的内容是一个嵌套的list.
可以看到,直接用list强转,可以成功,但并不是我们想要的结果;
用eval函数,就可以实现一步转换,实在是方便至极.
官方文档不太理解
eval(expression[, globals[, locals]])
实参是一个字符串,以及可选的 globals 和 locals.globals 实参必须是一个字典.locals 可以是任何映射对象.
表达式解析参数 expression 并作为 Python 表达式进行求值(从技术上说是一个条件列表),采用 globals 和 locals 字典作为全局和局部命名空间. 如果存在 globals 字典,并且不包含 __builtins__ 键的值,则在解析 expression 之前会插入以该字符串为键以对内置模块 builtins 的字典的引用为值的项. 这样就可以在将 globals 传给 eval() 之前通过向其传入你自己的 __builtins__ 字典来控制可供被执行代码可以使用哪些内置模块. 如果 locals 字典被省略则它默认为 globals 字典. 如果两个字典都被省略,则将使用调用 eval() 的环境中的 globals 和 locals 来执行该表达式. 注意,eval() 无法访问闭包环境中的 嵌套作用域 (非局部变量).
返回值就是表达式的求值结果. 语法错误将作为异常被报告. 例如:
x = 1
eval('x+1')
2
该函数还可用于执行任意代码对象(比如由 compile() 创建的对象). 这时传入的是代码对象,而非一个字符串了.如果代码对象已用参数为 mode 的 'exec' 进行了编译,那么 eval() 的返回值将为 None.
- 关于 官方文档 ,参考 [这儿][1].
[1]: https://docs.python.org/zh-cn/3/library/functions.html?highlight=eval#eval