【问题标题】:exec statement with/without prior compile带/不带预先编译的 exec 语句
【发布时间】:2010-10-28 18:15:00
【问题描述】:

这些周末,我一直在拆解 Michele Simionato 的 decorator module,它构建了保留签名的装饰器。这一切的核心是一个动态生成的函数,它的工作原理与此类似......

src = """def function(a,b,c) :\n    return _caller_(a,b,c)\n"""
evaldict = {'_caller_' : _caller_}
code = compile(src, '<string>', 'single')
exec code in evaldict
new_func = evaldict[function]

我发现,用这段代码胡闹,编译步骤可以完全避免,只需要一个:

exec src in evaldict

现在,我确信这有充分的理由增加这一步,但我无法找到这两种方法之间的区别。性能?

既然我在问,是否可以使用 eval 来实现类似的东西,即定义一个新函数并获取它的句柄?我试过了,但无法让它工作......

【问题讨论】:

    标签: python compilation eval exec


    【解决方案1】:

    我看到了一些不同之处。首先,compile 在面对语法错误时的语义略好于exec。我怀疑真正的原因是compile 的定义在处理换行符方面非常明确,而exec 不太精确。

    我很好奇为什么 compileexec 被用来代替内部函数。我不知道compile/exec 可以让您控制可用的全局变量。很有趣。

    【讨论】:

    • 性能怎么样?不知为何编译似乎更快?
    • 我不太确定。我猜想compile 会更快,如果您使用同一来源多次调用exec。用字符串调用exec 会将字符串编译成字节码然后执行。每次调用都会进行编译。
    【解决方案2】:

    compile() 允许您控制创建的代码对象及其名称和来源,而 exec 则不那么灵活。这样做也是值得的,因为其他人在阅读您的代码时会知道它们是单独的步骤,并在以后需要多次执行相同的代码时记住这一点(其中 compile() 一次,exec 多次将是更快),并且编写代码以教育下一个阅读它的人总是对设计选择产生有价值的影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多