python eval()函数
在项目的开发过程中遇到根据字典或者相关命名进行获取与字符串相同的变量,并进行下一步的计算,所以了解一下eval()
函数,顺带介绍了globals()
和locals()
函数。
官方文档:https://docs.python.org/3/library/functions.html?highlight=eval#eval
python自带的eval()
函数可以将传递的字符串转化成对应的函数,字符串内的变量引用当前模块的变量参与计算。
在使用过程中一般会传递一些字符串,根据字符串获取与当前字符串相同变量的值。比如:
# 定义变量
message = 'hello, python eval()'
info = eval('message')
print(info) # hello, python eval()
eval(expression[, globals[, locals]])
下述代码位置:
https://gitee.com/hanhongwen/python-base/blob/master/py_function/fun_eval.py
eval()
函数传递参数是字符串,以及可选的参数globals()
和locals()
。 globals 实参必须是一个字典。locals 可以是任何映射对象。
当eval()
函数传递的参数是字符串,可以获取当前模块全局的变量作为参数,进行计算。
# -*- coding: utf-8 -*-
# eval(expression[, globals[, locals]])
x = 1
def fun_eval(z):
print(eval('x + 1')) # x + 1 = 2
print(eval('z + 1')) # z + 1 = 3
if __name__ == '__main__':
fun_eval(2)
当eval()
函数选择globals()
参数,那么在函数内的参数作为字符串传入时会提示报错,找不多对应的命名变量。
这是因为globals()
返回实现当前模块命名空间的字典。对于函数内的代码,这是在定义函数时设置的,无论函数在哪里被调用都保持不变。
# -*- coding: utf-8 -*-
# eval(expression[, globals[, locals]])
x = 1
def fun_eval_globals(z):
print(eval('x + 1', globals())) # x + 1 = 2
print(eval('z + 1', globals())) # NameError: name 'z' is not defined
if __name__ == '__main__':
fun_eval_globals(2)
当eval()
函数选择locals()
参数,会与之相反,全局变量获取不到,也会提示对应的错误。
同样是因为locals()
更新并返回表示当前本地符号表的字典。在函数代码块但不是类代码块中调用 locals() 时将返回自由变量。
请注意在模块层级上,locals()
和 globals()
是同一个字典。
# -*- coding: utf-8 -*-
# eval(expression[, globals[, locals]])
x = 1
def fun_eval_locals(z):
print(eval('z + 1', locals())) # z + 1 = 3
print(eval('x + 1', locals())) # NameError: name 'x' is not defined
if __name__ == '__main__':
fun_eval_locals(2)