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

Python中f-string自定义函数输出问题:如何保留表达式原文?

解决方法

问题的核心是:调用myprn(a > b)时,a > b会先被求值为结果再传给函数,函数内部只能看到参数名text,拿不到原始表达式。而直接用f-string时,Python在编译阶段就保留了表达式的文本信息,所以能输出a > b = ...。

要让函数输出原始表达式,我们可以借助inspect模块获取调用处的源代码,解析出表达式后再求值输出:

示例代码

import inspect
import numpy as np

def myprn():
    # 获取调用函数的上下文帧
    caller_frame = inspect.currentframe().f_back
    # 提取调用处的源代码行
    caller_line = inspect.getframeinfo(caller_frame).code_context[0].strip()
    # 解析出括号内的表达式(处理单行调用的情况)
    expr_start = caller_line.find('(') + 1
    expr_end = caller_line.rfind(')')
    expr = caller_line[expr_start:expr_end].strip()
    # 在调用者的全局/局部命名空间中求值表达式
    result = eval(expr, caller_frame.f_globals, caller_frame.f_locals)
    # 按要求格式输出
    print(f'{expr} = {result}')

# 测试
a = np.array([1,3,2,0])
b = np.array([2,2,2,2])
myprn(a > b)

运行后会输出:

a > b = array([False,  True, False, False])

注意事项

  • 这个实现只支持单行调用,如果调用时表达式跨行(比如把a > b拆成多行写在括号里),解析逻辑会失效,需要更复杂的代码处理多行场景。
  • eval函数会执行解析出的表达式,确保调用时传入的表达式是安全的,避免注入风险。

内容的提问来源于stack exchange,提问作者dEitY719

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:25:23