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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:24:05