一尘不染

Python-为什么要避免exec()和eval()?

python

我已经在多个地方多次看到过这种情况,但是从未找到令人满意的解释来说明为什么会这样。

因此,希望这里会介绍一个。为什么我们(至少通常)不使用exec()eval()

编辑:我看到人们以为这个问题与Web服务器有关,但事实并非如此。我可以exec理解为什么传递给未经处理的字符串可能很糟糕。在非Web应用程序中不好吗?


阅读 452

收藏
2020-02-12

共1个答案

一尘不染

通常有更清晰,更直接的方法来获得相同的效果。如果构建复杂的字符串并将其传递给exec,则代码将难以遵循且难以测试。

示例:我编写了读取字符串键和值并在对象中设置相应字段的代码。它看起来像这样:

for key, val in values:
    fieldName = valueToFieldName[key]
    fieldType = fieldNameToType[fieldName]
    if fieldType is int:
        s = 'object.%s = int(%s)' % (fieldName, fieldType) 
    #Many clauses like this...

exec(s)

对于简单的情况,该代码并不可怕,但是随着新类型的出现,它变得越来越复杂。当有错误时,它们总是在调用exec时触发,因此堆栈跟踪并没有帮助我找到它们。最终,我切换到了一个稍长,不太聪明的版本,该版本明确设置了每个字段。

代码清晰的第一条规则是,仅查看代码的每一行,应易于理解。这就是为什么不建议goto和global变量的原因。exec和eval可以很容易地严重破坏该规则。

2020-02-12