eval、literal_eval、exec函数的使用
- eval函数
- literal_eval函数
- exec函数
- 三者的区别
eval函数
eval()是Python中的内置函数,它可以将一个字符串作为参数,并将该字符串作为Python代码执行。它的语法格式为:eval(expression,globals=None,locals=None)
expression
参数:表示要执行的Python代码的字符串表示形式。
globals
参数:表示全局变量的字典,当有global参数时,eval函数就执行gobals参数字典键对应的值,它的作用域就限于globals中。
locals
参数:表示局部变量的字典,当局部变量中字典的键与全局变量中的字典的键相同时,优先执行locals参数中键对应的值。
在默认的情况下,eval()函数的作用范围为当前作用域的全局和局部变量。
具体代码如下:
na = 1
nb = 2
nc = {"na":3,"nb":1}
nd = {"na":4,"nc":5}
'''
测试expression参数
'''
eval1 = eval("na+nb")
'''
测试globals参数
'''
eval2 = eval("na+nb",nc)
'''
测试locals参数
'''
eval3 = eval("na+nc",nc,nd)
print(eval1)
print(eval2)
print(eval3)
我们常用的是eval函数和input函数的结合,input函数获取输入的值,并以字符串的形式进行返回。而这时我们的eval函数刚好能进行字符串的转换。具体代码如下:
ina = input("请输入一个整数:")
print(type(ina))
inb = eval(ina)
print(type(inb))
eval函数的使用具有不安全性,它的可以执行任意的Python代码,包括恶意代码,如果函数参数是不可信的来源提供的,那么可能导致安全漏洞。例如:如果提供一个恶意的字符串”__import__('OS').system('rm -rf/')“
,如果执行了此代码,那么会导致系统文件被删除,造成不可挽回的损失。所以在不可信的环境中我们应该避免使用eval函数,可以考虑更加安全的函数:literal_eval()函数
literal_eval函数
literal_eval()函数可以安全的评估包含字面表达式的字符串,因此不能用于解析任意的Python代码。它不会执行任何函数或导入模块,因此可以避免由于不可信代码的执行而导致的安全漏洞。literal_eval()函数使用时需要导入ast库
它的语法格式为:ast.literal_eval(node_or_string)
node_or_string
参数:表示包含要评估代码的字符或者编译过的代码对象。
具体代码如下:
import ast
s = "[2, 3, 4, 5]"
result = ast.literal_eval(s)
print(result)
exec函数
exec函数用于执行一段动态生成的代码。它接收一个字符串作为参数,字符中包含了要执行的Python代码。exec函数可以被用于动态的导入模块、定义函数、类等操作,也具有不安全性。语法格式为:exec(object, globals=None, locals=None)
objec
t参数:表示要执行的代码的字符串或和编译过的代码对象。
globals
参数:表示全局变量的字典
locals
参数:表示局部变量的字典
他的使用方法和eval函数有点相似,并且默认情况下使用当前作用域的全局和局部变量。
具体代码如下:
code = '''
for _ in range(3):
print("3")
'''
exec(code)
三者的区别
安全性:exec()和eval()函数都不具备安全性,在不可信的环境下避免使用。而literal_eval()函数具备安全性。
执行范围:exec()和eval()可以执行任意Python代码,而literal_eval()函数只能执行包括字符串、数字、元组、列表和字典等在内的字面表达式,不能执行任意Python代码(如函数和模块不能执行)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)