如何在Python代码中实现类似Jupyter的变量值与类型获取功能?
如何通过exec获取代码片段最后一行表达式的值与类型?
在Jupyter笔记本中运行以下代码时,会直接输出最后一行表达式的结果:
x = 1 y = x + 1 y
但如果将这段代码存入字符串变量后用exec执行,由于exec本身返回None,无法直接拿到最后一行的结果和类型:
lines = """x = 1 y = x + 1 y""" exec(lines, globals(), locals())
以下是两种可行的解决方法:
方法一:拆分代码行,分离最后一行表达式
将代码按行拆分,先执行前面的语句,再用eval单独执行最后一行表达式:
lines = """x = 1 y = x + 1 y""" # 清理代码行:去除空行、注释和首尾空格 code_lines = [ line.strip() for line in lines.split('\n') if line.strip() and not line.strip().startswith('#') ] # 执行除最后一行外的所有代码 exec('\n'.join(code_lines[:-1]), globals(), locals()) # 用eval执行最后一行,获取结果 result = eval(code_lines[-1], globals(), locals()) print(f"结果值: {result}") print(f"结果类型: {type(result)}")
这种方法简单直接,但如果最后一行是多行表达式(比如用括号包裹的跨行代码)会失效。
方法二:使用AST解析代码(更健壮)
通过Python的ast模块解析代码结构,精准识别最后一个表达式节点,避免行拆分的局限性:
import ast lines = """x = 1 y = x + 1 y""" # 解析代码为抽象语法树 tree = ast.parse(lines) if tree.body: # 执行除最后一个节点外的所有代码 exec(compile(ast.Module(body=tree.body[:-1]), filename='<ast>', mode='exec'), globals(), locals()) # 判断最后一个节点是否为表达式 last_node = tree.body[-1] if isinstance(last_node, ast.Expr): # 编译并执行该表达式 result = eval( compile(ast.Expression(body=last_node.value), filename='<ast>', mode='eval'), globals(), locals() ) print(f"结果值: {result}") print(f"结果类型: {type(result)}")
这种方法能正确处理复杂的语法结构,比如多行表达式、嵌套代码块等,适用性更广。
内容的提问来源于stack exchange,提问作者ps0604
相关产品推荐
相关产品推荐

