资讯专栏INFORMATION COLUMN

这不是“奇技淫巧” - Python中将字符串编译成表达式运行的方法和使用场景

ZweiZhao / 431人阅读

摘要:的自带函数提供了一个非常有趣的特性,可以将给一个字符串当做一个表达式去执行。例如这种服务器自助运维的运维任务中的定义和判断

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

cond = compile("succ_rate<99","","eval")
succ_rate = 100
print(eval(cond))

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

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

cond = compile("succ_rate<99","","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"

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44584.html

相关文章

  • 奇技淫巧第二期

    摘要:因为产生的顺序是先比较第一位,再比较第二位,并且没有很好的解决办法。这种语法的限制是,需要保证异常从属与异常。两个异常都将显示。 这个系利的初衷是回顾琐碎知识点,但...

    Rocture 评论0 收藏0
  • JavaScript 如何工作:解析、抽象语法树(AST)+ 提升编译速度5个技巧

    摘要:无论你使用的是解释型语言还是编译型语言,都有一个共同的部分将源代码作为纯文本解析为抽象语法树的数据结构。和抽象语法树相对的是具体语法树,通常称作分析树。这是引入字节码缓存的原因。 这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! 如果你错过了前面的章节,可以在这里找到它们: JavaS...

    raoyi 评论0 收藏0
  • Python基础题目大全,测试你水平,巩固知识(含答案)

    摘要:里,有两种方法获得一定范围内的数字返回一个列表,还有返回一个迭代器。在引用计数的基础上,还可以通过标记清除解决容器对象可能产生的循环引用的问题。列举常见的内置函数的作用,过滤函数,循环函数累积函数一行代码实现乘法表。 showImg(https://segmentfault.com/img/remote/1460000019294205); 1、为什么学习Python? 人生苦短?人间...

    huhud 评论0 收藏0
  • 如何给列表降维?sum()函数妙用

    摘要:上个月,学习群里的同学问了个题目,大意可理解为列表降维,例子如下想得到结果原始数据是一个二维列表,目的是获取该列表中所有元素的具体值。不经意间,函数的注意事项,竟把其它的进阶内容都联系起来了。小小的函数,竟成为学习之路上的一个枢纽。 上个月,学习群里的 S 同学问了个题目,大意可理解为列表降维 ,例子如下: oldlist = [[1, 2, 3], [4, 5]] # 想得到结果:...

    Channe 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<