我已经在多个地方多次看到过这种情况,但是从未找到令人满意的解释来说明为什么会这样。
因此,希望这里会介绍一个。为什么我们(至少通常)不使用exec()和eval()?
exec()
eval()
编辑:我看到人们以为这个问题与Web服务器有关,但事实并非如此。我可以exec理解为什么传递给未经处理的字符串可能很糟糕。在非Web应用程序中不好吗?
exec
通常有更清晰,更直接的方法来获得相同的效果。如果构建复杂的字符串并将其传递给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可以很容易地严重破坏该规则。