如何结合Python的exec()与eval()执行任意代码并返回值?
如何结合exec()与eval()的功能,执行任意代码并返回结果?
核心方案:在eval中调用exec函数
你可以直接在eval()中调用内置的exec()函数(通过__import__("builtins").exec获取),将多行执行代码作为参数传给exec,再在后面跟上要返回的表达式,用分号分隔。这样eval()会先执行exec对应的多行代码,再计算并返回最后一个表达式的结果,完美结合两者的功能,且无需定义新函数,适配Pickle反序列化场景。
适配Pickle __reduce__的示例代码
def __reduce__(self): # 1. 定义需要执行的多行代码 exec_code = """with open("flag.txt", "w") as f: f.write("A flag I have left!")""" # 2. 定义最终要返回的表达式(这里是重组原始对象的逻辑) return_expr = "dict(iter(self.items()))" # 替换为你实际需要返回的对象表达式 # 3. 组合成eval可执行的代码,用repr()自动处理字符串转义 combined_code = f'__import__("builtins").exec({repr(exec_code)}); {return_expr}' # 4. 返回eval作为重组函数,参数为组合后的代码 return eval, (combined_code, ), None, None, iter(self.items())
原理说明
__import__("builtins").exec:在eval的上下文里获取内置的exec函数(直接写exec会被eval当作语句,而作为函数调用则是合法的表达式)repr(exec_code):自动将多行代码字符串转义为适合嵌入另一字符串的格式,避免引号冲突- 分号分隔两个表达式:eval会按顺序执行,先调用exec执行多行代码,再计算
return_expr并返回其结果,正好满足Pickle __reduce__对返回值的要求
注意事项
- 如果
return_expr依赖于exec代码中定义的变量,直接在表达式中引用即可,exec执行的代码会修改当前上下文的全局/局部变量 - 对于复杂的代码逻辑,确保
exec_code的格式正确,换行和缩进要符合Python语法 - 若代码中包含特殊字符,
repr()会自动处理转义,无需手动操作
内容的提问来源于stack exchange,提问作者whatf0xx
相关产品推荐
相关产品推荐

