Python中能否获取传入函数的实参的类型注解?
问题解答
先回顾你的示例代码:
# Python 3.12+ 简化语法定义类型别名 type T = int t: T = 1 # 变量t标注类型T
变量t的注解存储在其定义作用域的__annotations__中:
>>> __annotations__['t'] "T"
你的核心问题是:调用f(t)时,函数f内部能否获取原变量t的类型注解?你的判断是「函数内部无法获取」,这个结论是正确的,原因如下:
1. 类型注解的存储逻辑
变量的类型注解属于变量绑定的元数据,而非变量指向的对象的属性。它只会存储在变量被定义的作用域(全局作用域、函数局部作用域等)的__annotations__字典中,不会附加到对象本身。
2. Python参数传递的本质
调用f(t)时,Python传递的是t所指向的对象(这里是整数1)的引用,而非变量t本身。函数f的形参x只是一个新的局部变量,它仅与接收的对象绑定,和原变量t没有任何关联——原变量的名称、注解等信息,不会随对象传递到函数内部。
3. 函数局部帧的限制
函数运行时的局部帧仅包含当前作用域内的变量信息(比如形参x的名称和它指向的对象),完全不记录实参的来源变量,因此无法从局部帧中获取原变量的类型注解。
补充:不推荐的hack方案
如果非要获取原变量的注解,只能通过inspect模块解析调用栈的源代码,逆向查找调用处的变量信息。但这种方式严重依赖调用代码的写法,稳定性极差,完全不符合Python的设计意图,实际开发中绝对不建议使用。
内容的提问来源于stack exchange,提问作者mcmayer
相关产品推荐
相关产品推荐

