eval函数
将字符串string对象转化为有效的表达式参与求值运算返回计算结果。
>>> s='8*8'
>>> eval(s)
64
>>> eval('2+5*4')
22
>>> x=1
>>> y=4
>>> eval('x+y')
5
>>> eval('98.9')
98.9
>>> eval('9.9\n')
9.9
>>> eval('9.9\n\t\r \t\r\n')
9.9
eval可以将字符串转换成字典,列表,元组
str_list = '[1, 2, 3, 4]'
result = eval(str_list)
print(result) # [1, 2, 3, 4]
str_dict = "{'name':'python','age':20}"
result = eval(str_dict )
print(result) # {'name': 'python', 'age': 20}
ast.literal_eval
ast.literal_eval是python针对eval方法存在的安全漏洞而提出的一种安全处理方式。ast模块就是帮助Python应用来处理抽象的语法解析的,而该模块下的literal_eval()函数:则会判断需要计算的内容计算后是不是合法的Python类型,如果是则进行运算,否则就不进行运算。
import ast
x = "{'a':10,'b':20,'c':30}"
print(ast.literal_eval(x))
# {'a': 10, 'b': 20, 'c': 30}
y = "[5,10,15]"
print(ast.literal_eval(y))
# [5, 10, 15]
z = "(1,2,3)"
print(ast.literal_eval(z))
# (1, 2, 3)
出于安全考虑,对字符串进行类型转换的时候,最好使用ast.literal_eval()。
ast.literal_eval 不能执行上述 eval 函数的计算操作。
import ast
ast.literal_eval('2+6')
'''
Traceback (most recent call last):
File "d:\program files\python37\Lib\code.py", line 90, in runcode
exec(code, self.locals)
File "<input>", line 1, in <module>
File "d:\program files\python37\Lib\ast.py", line 91, in literal_eval
return _convert(node_or_string)
File "d:\program files\python37\Lib\ast.py", line 90, in _convert
return _convert_signed_num(node)
File "d:\program files\python37\Lib\ast.py", line 63, in _convert_signed_num
return _convert_num(node)
File "d:\program files\python37\Lib\ast.py", line 55, in _convert_num
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.BinOp object at 0x000001AC3D88FB70>
'''