Python如何判断函数是被shell直接调用还是作为表达式子项调用
Python交互式REPL函数调用场景区分实现方案
实现思路
核心是通过inspect模块读取调用栈上层的代码行内容,判断交互式环境下的调用行是否为独立的函数调用语句,排除赋值、作为表达式子项的场景。
完整实现代码
import inspect def search_for_five(): # 第一步:判断是否从交互式shell调用 if inspect.stack()[1].filename == '<stdin>': # 获取调用行的原始代码内容 call_frame = inspect.getframeinfo(inspect.stack()[1][0]) call_line = call_frame.code_context[0].strip() # 预处理行内容:移除REPL提示符、所有空白字符 processed_line = call_line.replace('>>>', '').replace(' ', '').strip() # 判断是否为独立的函数调用语句 if processed_line == 'search_for_five()': print('你的结果是5!!!') # 可选返回None,避免REPL额外打印默认返回值5 return # 非直接调用场景统一返回业务值 return 5
效果验证
- 独立直接调用:
>>> search_for_five()会输出你的结果是5!!!,符合预期 - 赋值调用:
>>> a = search_for_five()无打印输出,变量a取值为5 - 表达式子项调用:
>>> print(search_for_five() + 6)无打印输出,最终计算结果11正常输出
拓展优化说明
如果函数需要支持带参数的调用场景,可以用正则匹配替换简单的字符串相等判断,示例逻辑如下:
import re # 匹配是否为独立的search_for_five调用,允许括号内带任意参数 if re.fullmatch(r'search_for_five\(.*\)', processed_line): print('你的结果是5!!!') return
该调整可以兼容带参数的调用场景,比如>>> search_for_five("查询关键词")也能正常触发打印。
注意:该方案依赖Python REPL的实现特性,非常规Python语法标准,仅适合本地工具类函数使用,不建议在生产环境代码中引入。
内容的提问来源于stack exchange,提问作者Arnon Falkov
相关产品推荐
相关产品推荐

