我在多个地方多次看到这种情况,但从未找到令人满意的解释来解释为什么会出现这种情况。
所以,希望这里能展示一个。为什么我们(至少,一般来说)不应该使用 exec()
和 eval()
?
编辑:我看到人们假设这个问题与网络服务器有关——事实并非如此。我可以看到为什么传递给 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 和全局变量的原因。 exec 和 eval 很容易破坏这条规则。
关于python - 为什么要避免 exec() 和 eval()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1933451/