gpt4 book ai didi

python - 如何从 Python exec()/eval() 调用中获取结果?

转载 作者:太空宇宙 更新时间:2023-11-03 16:35:38 40 4
gpt4 key购买 nike

我想用 Python 编写一个工具,通过为每个模拟运行创建一个文件夹和一个包含一些特定于运行的参数的配置文件来准备模拟研究。

study/
study.conf
run1
run.conf
run2
run.conf

该工具应从文件中读取总体研究配置,包括 (1) 静态参数(键值对)、(2) 迭代参数列表,以及 (3) 一些小代码片段,用于计算先前的进一步参数那些。后者的运行具体取决于所使用的迭代参数的排列。

在从模板编写 run.conf 文件之前,我需要运行一些类似这样的代码,以确定该运行的代码片段中的特定键值对

code = compile(code_str, 'foo.py', 'exec')
rv=eval(code, context, { })

但是,正如 Python 文档所证实的那样,这只会导致 None 作为返回值。

示例中的代码字符串和上下文字典在其他地方填充。对于这个讨论,这个片段应该可以做到:

code_str="""import math
math.sqrt(width**2 + height**2)
"""

context = {
'width' : 30,
'height' : 10
}

我以前用 Perl 和 Java+JavaScript 做过这个。在那里,您只需将代码片段提供给某些评估函数或脚本引擎,然后从最后执行的语句中获取返回值(对象)——这不是一个大问题。

现在,在 Python 中,我遇到这样一个事实:eval() 太窄了,只允许一条语句,而 exec() 一般不返回值。我需要导入模块,有时需要做一些稍微复杂的计算,例如5行代码。

是否有我目前没有看到的更好的解决方案?

在我的研究过程中,我发现了一些关于Pyhton eval() and exec()的非常好的讨论。还有一些棘手的解决方案来规避这个问题 going via the stdout并从那里解析返回值。后者可以做到,但不是很好,而且已经 5 岁了。

最佳答案

exec 函数将修改传递给它的全局参数(字典)。所以你可以使用下面的代码

code_str="""import math
Result1 = math.sqrt(width**2 + height**2)
"""
context = {
'width' : 30,
'height' : 10
}

exec(code_str, context)

print (context['Result1']) # 31.6

创建的每个变量code_str最终都会在context字典中得到一个键:值对。所以字典就是你在 JavaScript 中提到的“对象”。

编辑1:

如果您只需要 code_str 中最后一行的结果并尝试防止类似 Result1=... 的情况,请尝试以下代码

code_str="""import math
math.sqrt(width**2 + height**2)
"""

context = { 'width' : 30, 'height' : 10 }

lines = [l for l in code_str.split('\n') if l.strip()]
lines[-1] = '__myresult__='+lines[-1]

exec('\n'.join(lines), context)
print (context['__myresult__'])

这种方法不如前一种方法强大,但应该适用于大多数情况。如果您需要以复杂的方式操作代码,请查看 Abstract Syntax Trees

关于python - 如何从 Python exec()/eval() 调用中获取结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37237034/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com