gpt4 book ai didi

Python:exec() 一个代码块和 eval() 最后一行

转载 作者:太空狗 更新时间:2023-10-30 00:01:50 24 4
gpt4 key购买 nike

我有一个包含一行或多行(可信)Python 代码的字符串文字,我想exec() block ,同时捕获最后一行的结果。更具体地说,我想要一个返回以下内容的函数 exec_then_eval:

code = """
x = 4
y = 5
x + y
"""

assert exec_then_eval(code) == 9

我尝试过的一些事情:

  1. 通过拆分最后一行,您可以执行第一个 block ,然后评估最后一行;例如

    def exec_then_eval(code):
    first_block = '\n'.join(code.splitlines()[:-1])
    last_line = code.splitlines()[-1]
    globals = {}
    locals = {}
    exec(first_block, globals, locals)
    return eval(last_line, globals, locals)

    这行得通,但如果最后一条语句有多行,则会失败。

  2. 如果代码本身被修改,结果被存储为一个局部变量,这个变量可以被恢复;例如

    code = """
    x = 4
    y = 5
    z = x + y
    """

    globals = {}
    locals = {}
    exec(code, globals, locals)
    assert locals['z'] == 9

    同样,这可行,但前提是您能够首先以通用方式解析代码块并对其进行适当修改。

有没有简单的方法来编写通用的exec_and_eval 函数?

最佳答案

根据@kalzekdor 关于使用ast 模块的建议,我想出了这个解决方案,它在本质上与上面发布的@vaultah 的解决方案类似:

import ast

def exec_then_eval(code):
block = ast.parse(code, mode='exec')

# assumes last node is an expression
last = ast.Expression(block.body.pop().value)

_globals, _locals = {}, {}
exec(compile(block, '<string>', mode='exec'), _globals, _locals)
return eval(compile(last, '<string>', mode='eval'), _globals, _locals)

它还通过了@vaultah 的一组不错的测试用例:

exec_then_eval('''x = 4
y = 5
x + y''')) # 9

exec_then_eval('''x = 4
y = 5;x + y''')) # 9

exec_then_eval('''x = 4
y = 5;(
x + y *

2)''') # 14

关于Python:exec() 一个代码块和 eval() 最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39379331/

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