eval 用来执行一个字符串表达式,并返回表达式的值
-
eval() 把数据还原成它本身或者是能够转化成的数据类型,(即:可以实现从tuple 元组,list列表,dict字典型的 str字符串到元组,列表,字典的转换)
-
string <==> dict
str_dict= '{"name":"zhangsan"}' chg_dict = eval(str_dict) print(str_dict, chg_dict) print(type(str_dict), type(chg_dict))
{"name":"zhangsan"} {'name': 'zhangsan'} <class 'str'> <class 'dict'> 进程已结束,退出代码0
-
string <==> tuple
str_tuple = '(4,5,6)' chg_tuple = eval(str_tuple) print(str_tuple, chg_tuple) print(type(str_tuple), type(chg_tuple))
(4,5,6) (4, 5, 6) <class 'str'> <class 'tuple'> 进程已结束,退出代码0
-
string <==> list
str_list = '[1,2,2]' chg_list = eval(str_list) print(str_list,chg_list) print(type(str_list),type(chg_list))
[1,2,2] [1, 2, 2] <class 'str'> <class 'list'> 进程已结束,退出代码0
-
- eval() 还可以对字符串型的输入直接计算
- input
a = input("Plase input a value string:") b = input("Plase input a value string:") normal_value = a + b eval_value = eval(a) + eval(b) print("正常value输出:",normal_value) print("使用eval输出:",eval_value)
Plase input a value string:1 Plase input a value string:8 正常value输出: 18 使用eval输出: 9 进程已结束,退出代码0
- 对所有能解析的字符串都做处理(比如读取文件,路径,目录, 删除文件等)
read_path = "__import__('os').getcwd()" # read_dir = "__import__('os').system('dir')" print("正常输出:",read_path) print("转换输出:",eval(read_path)) # print(eval(read_dir))
正常输出: __import__('os').getcwd() 转换输出: Z:\Python\xxx\common 进程已结束,退出代码0
-
通过变量内容作为函数名调用 eval函数
# 赋值函数名称 a = "b" # 定义函数 def b(): print(123) # 通过变量调用函数 eval(a)()
# 赋值函数名称 a = "b()" # 定义函数 def b(): print(123) # 通过变量调用函数 eval(a)
- input
ast.literal_eval()
-
ast模块就是帮助Python应用来处理抽象的语法解析的
- literal_eval() 会判断需要计算的内容计算后是不是合法的python类型,相较于eval()较安全
- 示例1:
import ast read_path = "__import__('os').getcwd()" # read_dir = "__import__('os').system('dir')" print("正常输出:",read_path) print("eval转换输出:",eval(read_path)) try: print("asr转换输出:",ast.literal_eval(read_path)) except Exception as e: print("Exception 原因:",e) normal_value = "(1,2,3)" print("asr转换输出:",ast.literal_eval(normal_value))
正常输出: __import__('os').getcwd() eval转换输出: Z:\Python\xxxx\common Exception 原因: malformed node or string: <_ast.Call object at 0x00C70298> asr转换输出: (1, 2, 3) 进程已结束,退出代码0
-
- 示例2:
ast_tuple = "(1,2,3)" print("ast转换输出:",ast.literal_eval(ast_tuple)) ast_list = "[1,2,3]" print("ast转换输出:",ast.literal_eval(ast_list)) ast_dict = "{'name':'zhangsan'}" print("ast转换输出:",ast.literal_eval(ast_dict)) # 将dict 字段的'替换为" rep = ast_dict.replace("'",'"') print("reolace 替换",rep) print("ast转换输出:",ast.literal_eval(rep))
ast转换输出: (1, 2, 3) ast转换输出: [1, 2, 3] ast转换输出: {'name': 'zhangsan'} reolace 替换 {"name":"zhangsan"} ast转换输出: {'name': 'zhangsan'} 进程已结束,退出代码0
- 示例2: