当前位置: 首页 > 面试题库 >

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

马冯浩
2023-03-14
问题内容

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

因此,希望这里会介绍一个。为什么我们(至少通常)不使用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可以很容易地严重破坏该规则。



 类似资料:
  • 问题内容: 通常我会尽可能避免转换类型,因为我认为这是不良的编码实践,并且可能会导致性能下降。 但是,如果有人要我解释为什么会这样,我可能会像前灯中的鹿一样看它们。 那么,为什么/何时铸造不好? 它对于Java,C#,C ++是通用的,还是每个不同的运行时环境都按照自己的方式处理? 欢迎使用任何语言的细节,例如为什么在c ++中不好? 问题答案: 您已经用三种语言标记了这三种语言,答案在三种语言之

  • 在React中,我尝试了两种方法: 然后更改状态this.setState(this.state) 克隆状态,更改状态克隆,然后更改此.setState(stateClone) 它们都起作用,产生相同的结果。为什么建议(在文档中)设置为状态克隆(使用Object.assign),而不是设置为状态本身?状态的对象标识在React中重要吗(没有Redux)?似乎只要调用setState,不管状态对象标

  • 问题内容: Process p = Runtime.getRuntime().exec(command); is = p.getInputStream(); byte[] userbytes = new byte[1024]; is.read(userbytes); 我想从java在linux os中执行shell命令。但是Pmd报告说不要使用Java Runtime.exec()。为什么?是什么

  • 问题内容: 假设我们在页面上有一个DIV ,并且想要将该DIV的内容复制(“复制粘贴”)到另一个DIV中。我们可以这样做: 或使用jQuery: 但是,看来此方法不是一个好主意,应避免使用。 (1)为什么要避免这种方法? (2)应该怎么做呢? 更新: 为了解决这个问题,我们假设DIV中没有ID为ID的元素。 (对不起,我忘了在原始问题中介绍此案。) 结论: 我已经在下面发布了我对这个问题的答案(如

  • 我的公司不允许使用Mockito。在单元测试中验证。甚至有一个定制的声纳规则 规则如下 应该通过断言来验证结果,而不是使用“验证到执行”过程验证。因为如果我们验证流程,在流程更改后需要更多的努力来维护测试,但输入和输出保持不变。确保每一行代码都对结果有影响,并断言结果以证明逻辑正确 不合规代码示例 合规解决方案 对于数据库或中间件操作,断言使用嵌入式数据库或中间件成功写入数据。 对于restful

  • 为什么可能是这种测试要避免的事情。 我在对这个答案的评论中读到了这一点:https://stackoverflow.com/a/21172873/516167 标记应在其上进行注射的字段。 允许速记模拟和间谍注入 最小化重复模拟和间谍注入 参考:@InjectMocks JavaDoc。