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
相关产品推荐
相关产品推荐

