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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 07:33:10