文章目录

  • 一、eval() 函数是什么?
  • 二、语法
  • 二、基本用法
  • 1. 算数运算
  • 2. 判断条件表达式
  • 3. 字符串转 list , dict 等其他数据类型
  • 4. 通过字符串加载函数
  • 三、进阶
  • 1. 复杂的条件表达式判断
  • 2. 通过字符串加载函数的实用场景
  • 总结



一、eval() 函数是什么?

eval() 函数用来执行一个字符串表达式,并返回表达式的值。它是python自带的一个函数,执行的字符串表达式遵循python规范,可以包含Python运算符。
Python语言支持以下类型的运算符:

  1. 算术运算符
  2. 比较(关系)运算符
  3. 赋值运算符
  4. 逻辑运算符
  5. 位运算符
  6. 成员运算符
  7. 身份运算符
  8. 运算符优先级

二、语法

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的风险,不过有很大的局限性,有兴趣的可以自行学习。