在Python中使用eval

30 投票
14 回答
45605 浏览
提问于 2025-04-15 12:42

我在玩Python的时候发现了一个叫eval()的函数。我想不出这个函数有什么用处,除了可能是为了让代码看起来更简洁。有没有什么例子可以说明它的用处呢?

14 个回答

13

你可能想用它来让用户输入自己的“脚本片段”:的表达式(甚至是小函数),这些可以用来定制一个复杂系统的行为。
在这种情况下,如果你不需要太担心安全问题(比如你的用户都是懂行的人),那么使用eval()可能是个不错的选择。

17

关于 eval维基百科文章 信息量很大,里面详细介绍了它的各种用法。

文章中提到的一些用法包括:

  • 计算数学表达式
  • 编译器自举
  • 脚本编写(动态语言通常非常适合这个)
  • 语言学习助手
52

evalexec 是一些快速且简单的方法,可以动态地获取一些源代码,可能会稍微修改一下,然后执行它们。不过,它们几乎从来不是最好的选择,尤其是在生产环境中,而不是“快速简单”的原型开发等场合。

举个例子,如果我需要处理这样的动态 Python 源代码,我会使用 ast 模块——ast.literal_evaleval 安全得多(如果只是一次性使用,并且只依赖简单常量的话,可以直接在表达式的字符串上调用它,或者先用 node = ast.parse(source) 解析源代码,然后保留这个 node,也许再用合适的访问器来修改它,比如查找变量,然后对这个节点使用 literal_eval)——或者在把节点整理好并检查过安全问题后,我可以用 compile 将它编译成代码对象,然后从中构建一个新的函数对象。虽然这比直接使用 eval 要复杂一些(不过 ast.literal_eval 在最简单的情况下和 eval 一样简单!),但在生产级代码中更安全、更可取。

对于很多任务,我看到人们(滥)用 execeval,其实 Python 强大的内置函数,比如 getattrsetattr,还有访问 globals(),提供了更好的、实际上往往更简单的解决方案。对于特定的用途,比如解析 JSON,像 json 这样的库模块更合适(例如,看看 SilentGhost 对 tinnitus 的回答的评论)。等等等等……

撰写回答