Python 3.14 annotationlib处理本地工厂函数默认值时触发NameError
Python 3.14 annotationlib 遇 NameError:注解中使用工厂函数且指定 Format.VALUE 时无法找到全局函数
问题原因
当调用 annotationlib.get_annotations 并指定 format=annotationlib.Format.VALUE 时,函数会直接求值注解中的表达式。默认情况下,它使用的是空命名空间或受限上下文,而非目标函数所在模块的全局命名空间——即使 my_factory 和 process_data 在同一模块且定义顺序正确,求值阶段也无法找到该全局函数,最终抛出 NameError。
解决方案
需要为 get_annotations 显式传递 globals 参数,指定目标函数所在模块的全局环境。对于当前模块的函数,直接传入 globals() 即可:
修改后的可运行代码
import annotationlib def my_factory(): return dict def process_data(payload: str, settings: my_factory()): pass # 传入模块全局命名空间,确保注解表达式能正确解析 print(annotationlib.get_annotations(process_data, format=annotationlib.Format.VALUE, globals=globals()))
补充说明
- 如果目标函数定义在其他模块中,需传入对应模块的全局字典,比如
import my_module; globals=my_module.__dict__; - 若不指定
globals,get_annotations无法获知模块级别的命名上下文,自然无法解析依赖模块全局变量的注解表达式。
内容的提问来源于stack exchange,提问作者AstroBrick
相关产品推荐
相关产品推荐

