一.函数说明:
1.1 eval(expression, globals=None, locals=None)
- 参数:
- expression:这是一个
字符串的python表达式
,python可以用globals字典和locals字典作为全局和局部的变量命名空间,eval对expression进行解析和计算,用到的变量从globals和locals中查找。 - globals:这个参数是一个全局变量的命名空间,也就是我们在计算表达式的时候可以使用全局命名空间中的变量或函数,若有这个函数,且没有提供自定义的__builtins__,那么会将当前环境中的__builtins__拷贝到自己提供的globals里,才会进行计算。如果globals没有被提供,则使用python的全局命名空间。
- locals:这个参数是一个局部变量的命名空间,和globals类似,不过当它和globals中有重复的部分时,locals里的定义会覆盖掉globals中的。若locals中没有被提供,则为globals中的。
- expression:这是一个
- eval函数也可以被用来执行任意的代码对象(如那些由compile()创建的对象)。在这种情况下,expression参数是一个代码对象而不是一个字符串。如果代码对象已经被‘exec‘编译为模式参数,eavl()的返回值是None。
- eval() 传参不支持键值传参, 仅支持位置传参(下面代码中有演示)
二. 代码演示
$ ipython
Python 3.8.3 (default, Jul 2 2020, 17:30:36) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.16.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: x =1
# 简单一点的
In [2]: eval("x+1")
Out[2]: 2
In [3]: d1 = {"x": 12}
# 加个globals字典
In [4]: eval("x+1", d1)
Out[4]: 13
In [5]: y=2
In [6]: z=3
In [7]: d2={"x": 20, "y":100}
In [8]: d3={"y":200, "z": 50}
In [9]: eval("x+y+z", d2, d3)
Out[9]: 270
In [10]: express = "x+y+z"
In [11]: eval(express,d2,d3)
Out[11]: 270
In [12]: express2="xyz"
In [13]: eval(express,d2,d3)
Out[13]: 270
In [14]: eval(express2,d2,d3)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-14-d46906148e81> in <module>
----> 1 eval(express2,d2,d3)
<string> in <module>
NameError: name 'xyz' is not defined
In [15]: eval('express2',d2,d3)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-15-cbfdb004de25> in <module>
----> 1 eval('express2',d2,d3)
<string> in <module>
NameError: name 'express2' is not defined
In [16]: eval('express2')
Out[16]: 'xyz'
2.1 小应用
# notebook中
d1={'A': 8, "B":3, "E": "=A*(A-B)+B/3"}
result = d1.get("E").replace("=","")
print(result)
eval(result,d1)
A*(A-B)+B/3
41.0