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

Python中能否区分函数入参是字面量还是方法调用的返回值?

问题解答

基础结论

常规方法完全无法区分两种入参来源:

  • Python 中的布尔值True是全局唯一的单例对象,无论是直接传递True字面量,还是通过returns_true()返回的True,本质是内存中完全相同的一个对象。
  • 常用的相等判断==、身份判断is、内存地址查询id()都无法对二者做出区分。

仅作研究的黑魔法实现

如果不考虑实用性、仅做技术探索,可以通过解析调用栈的上层执行代码,判断调用foo时传入的参数表达式形式,实现区分效果,示例代码如下:

import inspect
import ast

def foo(obj):
    # 提取调用foo的上层栈帧信息
    caller_info = inspect.stack()[1]
    # 拿到调用行的源代码
    call_code = caller_info.code_context[0].strip()
    # 解析调用代码的语法树
    call_ast = ast.parse(call_code, mode='eval')
    # 取第一个传入参数的语法节点
    arg_node = call_ast.body.args.args[0]
    
    if isinstance(arg_node, ast.Constant) and arg_node.value is True:
        print("入参为True字面量")
    elif isinstance(arg_node, ast.Call) and getattr(arg_node.func, 'id', None) == 'returns_true':
        print("入参为returns_true()的调用结果")
    else:
        print("其他入参来源")

def returns_true():
    return True

# 测试调用
foo(True)
foo(returns_true())

运行输出:

入参为True字面量
入参为returns_true()的调用结果

局限性说明:该方案非常脆弱,仅能处理最简单的直接调用场景,如果参数先赋值给变量再传入、代码被混淆压缩、或是动态生成调用逻辑,该方案都会直接失效,完全不建议在生产环境使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:27:01