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

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

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

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

回答:

通常有更清晰,更直接的方法来获得相同的效果。如果构建复杂的字符串并将其传递给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可以很容易地严重破坏该规则。

以上是 Python-为什么要避免exec()和eval()? 的全部内容, 来源链接: utcz.com/qa/411003.html

回到顶部