import os
from ast import literal_eval
test_a = '{"name":1}'
print(eval(test_a), type(eval(test_a)))
# {'name': 1} <class 'dict'>
print(literal_eval(test_a), type(literal_eval(test_a)))
# {'name': 1} <class 'dict'>
try:
test_a = "__import__('os').remove('1.txt')"
print(eval(test_a)) # None
print(os.path.exists('1.txt')) # False
except Exception as e:
print("eval", ValueError(e))
try:
test_a = "__import__('os').remove('2.txt')"
print(literal_eval(test_a))
print(os.path.exists('2.txt'))
except Exception as e:
print("literal_eval", ValueError(e)) # literal_eval malformed node or string: <ast.Call object at 0x000001FA43202EE0>
执行前
执行后
控制台输出
eval()
简单来说就是回去指定任意类型的命令。无论是转换类型 还是 python 语句.
ast.literal_eval
https://peps.python.org/pep-0518/
这是介绍地址.
https://docs.python.org/3/library/ast.html#ast.literal_eval
literal_eval部分说明
https://stackoverflow.com/questions/15197673/using-pythons-eval-vs-ast-literal-eval
有讨论组
其中还是建议升级高版本的python.
总结
ast. literal_eval
并没有说明是绝对安全的,只是申明了更安全一些,所以在使用过程中还是需要进行注意.