文章目录
- 一、eval() 函数是什么?
- 二、语法
- 二、基本用法
- 1. 算数运算
- 2. 判断条件表达式
- 3. 字符串转 list , dict 等其他数据类型
- 4. 通过字符串加载函数
- 三、进阶
- 1. 复杂的条件表达式判断
- 2. 通过字符串加载函数的实用场景
- 总结
一、eval() 函数是什么?
eval() 函数用来执行一个字符串表达式,并返回表达式的值。它是python自带的一个函数,执行的字符串表达式遵循python规范,可以包含Python运算符。
Python语言支持以下类型的运算符:
- 算术运算符
- 比较(关系)运算符
- 赋值运算符
- 逻辑运算符
- 位运算符
- 成员运算符
- 身份运算符
- 运算符优先级
二、语法
eval(expression[, globals[, locals]])
expression -- 表达式。
globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。
二、基本用法
1. 算数运算
代码如下(示例):
x = 7
y = eval('3 * x')
print(y) # 显示结果:21
m = 3
n = 5
r = eval('m + n')
print(r) # 显示结果:8
2. 判断条件表达式
代码如下(示例):
# 1)比较运算
num = 6
print(eval('num < 8')) # 显示结果:True
# 2)逻辑运算
a_1 = True
b_1 = False
print(eval('a_1 and b_1')) # 显示结果:False
# 3)输入数据可以是字典
dict_1 = {'a_1': True, 'b_1': False}
print(eval('a_1 and b_1', dict_1)) # 显示结果:False
3. 字符串转 list , dict 等其他数据类型
代码如下(示例):
list_1 = eval('[1,2,3,4]')
print(list_1)
print(type(list_1))
dict_1 = eval("{'a': [1, 2], 'b': False, 'c': {'x': 3, 'y': 6}}")
print(dict_1)
print(type(dict_1))
print(dict_1['c'])
print(type(dict_1['c']))
4. 通过字符串加载函数
代码如下(示例):
def addition(num_1, num_2):
return num_1 + num_2
result = eval('addition')(6, 8)
# 显示结果:14
print(result)
三、进阶
1. 复杂的条件表达式判断
代码如下(示例):
rule = "(current_medical_program=='白细胞计数') and (specimen_type in medicine_result.keys()) and " \
"(medicine_projects in ['1','2',3]) and (time < 6) and (1 < (time - medicine_projects))"
data_dict = {
'current_medical_program': '白细胞计数',
'specimen_type': '全血',
'medicine_projects': 3,
'medical_history': '',
'diagnosis': '',
'time': 5,
'medicine_result': {'全血': 1},
}
print(eval(rule, data_dict))
2. 通过字符串加载函数的实用场景
代码如下(示例):
# 有一样输入的函数可用eavl()批量执行
data_dict = {'a': True, 'b': False}
def deal_a(data_dict: dict):
if data_dict['a']:
return 'a is true'
else:
return 'a is false'
def deal_b(data_dict: dict):
if not data_dict['b']:
return 'b is not true'
else:
return 'b is not False'
result = []
fuc_name = ['a', 'b']
for i in fuc_name:
r = eval(f'deal_{i}')(data_dict)
result.append(r)
print(result)
总结
本文简单介绍了eval()的使用,eval()还可以执行系统命令,进行删除文件等操作,这些操作有一定的风险就不介绍了。
此外还有 python 自带的 ast 包只会执行合法的 Python 类型,这个包可降低使用eval的风险,不过有很大的局限性,有兴趣的可以自行学习。