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

如何为Python defaultdict编写符合DRY原则的简洁类型标注

更简洁的defaultdict类型标注方案

不需要重复书写完整的DefaultDict[键类型, 值类型]泛型参数,目前主流Python类型检查器(mypy 1.0+、pyright 1.1.200+)都支持泛型部分推断,根据使用的Python版本可以选择以下两种无冗余写法:

通用兼容写法(适配Python 3.8+所有版本)

在类型标注中使用_作为泛型通配符,该位置的类型会由检查器从右侧赋值语句自动推断,你只需要手动指定缺失的键类型即可:

from collections import defaultdict
# Python 3.8及更早版本需要从typing导入DefaultDict,3.9+可直接用collections.defaultdict
from typing import DefaultDict

# 仅手动指定键类型为str,值类型从传入的default_factory(int)自动推断为int
my_dict: DefaultDict[str, _] = defaultdict(int)

# Python 3.9+ 可直接使用内置泛型别名,写法更短
my_dict: defaultdict[str, _] = defaultdict(int)

这里的_不需要额外导入,类型检查器会自动将其识别为「待推断类型」占位符,不会像Any一样丢失类型安全性。

极简写法(Python 3.9+ 支持,可省略变量注解)

Python 3.9 版本之后泛型类支持在构造器层面传入泛型参数,你可以只在构造器的方括号中指定键类型,值类型由检查器从传入的构造参数自动推断,连变量后的冒号注解都不需要写:

from collections import defaultdict

# 仅指定键类型为str,其余类型信息自动推断
my_dict = defaultdict[str](int)

这种写法完全没有重复的类型声明,符合DRY原则,linter不会抛出任何类型警告。

注意事项

  • 上述特性依赖类型检查器的泛型部分推断能力,如果使用过程中出现报错,将mypy/pyright升级到2023年之后发布的稳定版本即可支持。
  • 不要将通配符替换为Any,Any会关闭对应位置的类型检查,而_会推导出准确的类型,不会破坏类型安全。

内容的提问来源于stack exchange,提问作者BeeOnRope

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:12:18