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

标签 python python-exec

我在多个地方多次看到这种情况,但从未找到令人满意的解释来解释为什么会出现这种情况。

所以,希望这里能展示一个。为什么我们(至少,一般来说)不应该使用 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/

相关文章:

python - Python 是否具有与 java.lang.Math.nextUp 等效的功能?

python - Keras 2 上具有自定义(无)损失的三元组嵌入层

python - (R-->R) 函数的简单自动分类

python - python 中 exec 内的赋值

python - 在 C 中自定义实现 "tail -f"功能

python - 如何更改 __builtins__ 模块变量?

python - 如果嵌套在函数中,listcomp 无法访问 exec 调用的代码中定义的局部变量

python - 在焕然一新的 Python 环境中以编程方式从 Python 内部执行 Python 文件

python - 如何根据条件创建成对的列名?