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

