Python中如何对值为同基类子类的字典添加类型提示?
字典类型提示最优实现
你完全不需要使用Any作为值类型,这个场景有精准匹配的类型标注方案。
首先要注意一个容易踩的误区:你的字典里存的是类对象本身,不是类的实例,因此不能直接标注为Dict[str, Parent]——这个写法代表字典值是Parent的实例对象,和你存类的场景不匹配。
正确写法
因为Dev、Product、Test都继承自Parent基类,直接用type[Parent]作为值类型即可,代码示例:
from typing import Dict # 类定义保持不变 class Parent: pass class Dev(Parent): pass class Product(Parent): pass class Test(Parent): pass # 正确的类型标注 configurations: Dict[str, type[Parent]] = { "dev": Dev, "product": Product, "test": Test, }
版本兼容提示:如果你使用Python 3.8及更早版本,需要从
typing模块导入大写开头的Type,标注写法替换为Dict[str, Type[Parent]],语义完全一致;Python 3.9+可以直接使用内置的dict和小写type,不需要从typing导入对应类型,即标注可以写成dict[str, type[Parent]]。
方案说明
type[Parent]的语义是所有继承自Parent的类(包括Parent自身)的类对象,刚好完全匹配你的使用场景:
- 类型检查器(mypy、pyright等)会校验你存入字典的值,必须是Parent的子类,传入无关类时会直接报类型错误
- 从字典中取出值后,类型检查器能识别这是一个可实例化的类,实例化得到的对象会被自动推断为Parent类型,后续调用Parent的方法不会报属性不存在的错误
- 后续新增其他继承自Parent的配置类时,不需要修改类型标注,自动兼容,维护成本极低
不推荐的方案
- 不建议用
Any:会完全丢失类型校验能力,字典可以随意存入任意类型的值,取出使用时也没有任何类型提示,完全失去类型标注的意义 - 不建议手动写联合类型比如
type[Dev] | type[Product] | type[Test]:虽然能通过校验,但后续新增配置类时必须同步修改联合类型,维护成本高,没有必要
内容的提问来源于stack exchange,提问作者Eric Lee
相关产品推荐
相关产品推荐

