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

关于Python函数__annotations__删除未触发AttributeError的疑问

关于Python 3.10中函数__annotations__删除行为的疑问解答

你观察到的现象是符合Python 3.10+实际实现的,官方文档的描述未跟进后续的实现变更,具体原因如下:

  • 对于无注解的函数(比如fn1):在Python 3.10及以后版本中,执行del fn1.__annotations__不会因字典未创建而抛出AttributeError。当前实现里,函数的__annotations__是一个"虚拟"属性——哪怕从未访问或设置过它,删除操作会自动将其重置为空字典,而非真正删除该属性。
  • 对于有注解的函数(比如fn2):第一次删除会移除已有注解字典;再次执行删除时,同样触发重置逻辑将其设为空字典,因此也不会抛出异常。

官方文档提到的"未创建该字典就删除会触发AttributeError"是更早Python版本(如3.8及之前)的行为。3.9之后CPython优化了函数__annotations__的属性处理逻辑,目的是让该属性行为更一致,避免因是否提前访问过属性导致异常差异。

你可以用以下代码验证:

def fn1():
    pass

# 第一次删除无异常
del fn1.__annotations__
# 再次删除依然无异常
del fn1.__annotations__
# 查看属性为空字典
print(fn1.__annotations__)  # 输出 {}

def fn2(x: int) -> str:
    pass

print(fn2.__annotations__)  # 输出 {'x': <class 'int'>, 'return': <class 'str'>}
del fn2.__annotations__
print(fn2.__annotations__)  # 输出 {}
del fn2.__annotations__
print(fn2.__annotations__)  # 依然输出 {}

简言之,现在的实现逻辑是:函数的__annotations__属性永远不会被真正删除,删除操作本质是将其重置为空字典,因此无论执行多少次删除,都不会触发AttributeError。

内容的提问来源于stack exchange,提问作者S.B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:42:39