You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:52:36