【问题标题】:Using exec() and eval() in python to execute arbitrary code and then return a calculated value在python中使用exec()和eval()执行任意代码然后返回一个计算值
【发布时间】:2022-12-25 01:20:57
【问题描述】:

Python 提供了内置函数execeval,它们都采用字符串格式的 Python 代码,或者执行提供的语句,不返回任何内容 (exec) 或评估单行(for 循环等)允许)并返回结果(eval)。

在某些情况下,这似乎并不令人满意,SO 已经看到一些试图找到解决方法的问题(herehere)。

这些寻求的是用exec运行一些代码,然后用eval返回结果。

基于来自 Yannic Kilcher 的一些代码,我想提出一个既有效又优雅的解决方案,使用 Python 的 return 面对 or 语句时的行为。

【问题讨论】:

    标签: python


    【解决方案1】:

    通常,Python 的eval 只会接受单行输入,并且将其输入多行会导致错误:

    >>> eval("4")
    4
    >>> eval("print('Hello')
    4")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<string>", line 2
        4
        ^
    SyntaxError: invalid syntax
    

    如果你想用 eval 返回多行表达式的结果,特别是如果你想从文件中读取一些数据,然后返回该数据,这是有问题的。 exec不能使用,因为exec不能返回值。

    我想分享的解决方案是结合使用它们: eval("exec('-code goes here, assign to a dummy variable-') or -dummy variable-")

    这允许在 exec 部分中运行任意行代码,然后由 eval 输出某种计算结果。这是一个非常简单的例子:

    >>> eval("exec('y=1+2') or y")
    3
    

    值得注意的是,这取决于两个表达式的范围是否相同,因此eval 可以“看到”用exec 创建的变量。从上面可以看出,默认情况下就是这种情况,但我想可能还有其他情况会变得更复杂。由于可以为两个表达式分配任意范围,因此可以设置相同的范围并避免此类命名空间错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2020-10-30
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2012-09-27
      相关资源
      最近更新 更多