在Python中使用eval
我在玩Python的时候发现了一个叫eval()
的函数。我想不出这个函数有什么用处,除了可能是为了让代码看起来更简洁。有没有什么例子可以说明它的用处呢?
14 个回答
你可能想用它来让用户输入自己的“脚本片段”:小的表达式(甚至是小函数),这些可以用来定制一个复杂系统的行为。
在这种情况下,如果你不需要太担心安全问题(比如你的用户都是懂行的人),那么使用eval()可能是个不错的选择。
eval
和 exec
是一些快速且简单的方法,可以动态地获取一些源代码,可能会稍微修改一下,然后执行它们。不过,它们几乎从来不是最好的选择,尤其是在生产环境中,而不是“快速简单”的原型开发等场合。
举个例子,如果我需要处理这样的动态 Python 源代码,我会使用 ast 模块——ast.literal_eval
比 eval
安全得多(如果只是一次性使用,并且只依赖简单常量的话,可以直接在表达式的字符串上调用它,或者先用 node = ast.parse(source)
解析源代码,然后保留这个 node
,也许再用合适的访问器来修改它,比如查找变量,然后对这个节点使用 literal_eval
)——或者在把节点整理好并检查过安全问题后,我可以用 compile
将它编译成代码对象,然后从中构建一个新的函数对象。虽然这比直接使用 eval
要复杂一些(不过 ast.literal_eval
在最简单的情况下和 eval
一样简单!),但在生产级代码中更安全、更可取。
对于很多任务,我看到人们(滥)用 exec
和 eval
,其实 Python 强大的内置函数,比如 getattr
和 setattr
,还有访问 globals()
,提供了更好的、实际上往往更简单的解决方案。对于特定的用途,比如解析 JSON,像 json
这样的库模块更合适(例如,看看 SilentGhost 对 tinnitus 的回答的评论)。等等等等……