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

发布于 2021-02-02 23:21:19

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

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

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

关注者
0
被浏览
169
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看