1

Python的自带函数 eval 提供了一个非常有趣的特性,可以将给一个字符串当做一个表达式去执行。先上一个例子:

cond = compile('succ_rate<99','<string>','eval')
succ_rate = 100
print(eval(cond))

上面这段代码执行结果是 True

表达式执行所需的参数如果不想硬编码,也可以通过一个字典传递进去:

cond = compile('succ_rate<99','<string>','eval')
data={'succ_rate':100}
print(eval(cond,data))

看到这里大家可能会有疑问,这种“奇技淫巧”到底有什么用,表达式都是静态代码直接正常写不就行了么?实际上在大型的系统中经常会有“配置中心”之类的模块,这种模块通常是为了能够在代码不需要上线的情况下提供动态改变一些判断逻辑的功能,逻辑简单并且改动频繁的业务判断可以通过这种动态的方式来进行实现。

例如一个功能的上线以后需要筛选一部分手机设备进行逐步开启功能开关,第一批可能会提供一批设备的机型列表进行开启,随后过几天会在这个基础上增加操作系统版本号的判断,再过一段时间以后会去掉机型的限制转而根据CPU型号进行判断等等。对于这种纯体力活,我们可以将表达式存储在数据库中,需要判断的时候准备好参数 eval 一下即可,达到不需要上线代码就能完成需求的目的,甚至还可以将权限下放给产品同学自行控制。

另外一个非常适合的应用场景是可以用来实现简单的规则引擎,规则引擎的判断逻辑可以完全用python的表达式进行书写,可读性会比自己创建一种描述规则好很多,也能降低学习成本。例如这种服务器自助运维的运维任务中 criteria 的定义和判断:

criteria: succ_rate<99 and succ_rate>50
action: "service xxx restart"

channingbj
130 声望10 粉丝