如何在Python中从常量字典获取字符串字面量联合类型的键?
在Python中从常量字典自动推断键的字面量联合类型
方案1:用Final标记字典+自动推导字面量类型
把字典标记为Final后,类型检查器会将其视为不可变常量,再通过tuple()转换键集合来生成Literal联合类型:
from typing import Final, Literal # 只读常量字典 CONST_DICT: Final = { 'a': 1, 'b': 2, 'c': 3 } # 自动生成键的字面量联合类型 KeyType = Literal[tuple(CONST_DICT.keys())]
Python 3.10+及主流类型检查器(如pyright、mypy)能正确识别这个推导,无需手动枚举每个键。
方案2:借助枚举间接实现约束
如果字典键固定,先定义枚举再生成字典,既能保证键的一致性,又能获得强类型约束:
from enum import Enum from typing import Final, Dict class DictKeys(Enum): A = 'a' B = 'b' C = 'c' CONST_DICT: Final[Dict[DictKeys, int]] = { DictKeys.A: 1, DictKeys.B: 2, DictKeys.C: 3 } # 使用时直接用枚举成员,类型检查会自动限制输入 def get_value(key: DictKeys): return CONST_DICT[key]
方案3:利用TypeAlias简化类型定义
结合TypeAlias可以让类型推导更清晰,同样依赖Final标记的常量字典:
from typing import Final, TypeAlias from typing_extensions import Literal CONST_DICT: Final = { 'x': 'foo', 'y': 'bar', 'z': 'baz' } KeyType: TypeAlias = Literal[tuple(CONST_DICT.keys())]
注意:不同类型检查器对推导的支持有细微差别,pyright对这类自动推导的兼容性最好,mypy可能需要开启部分严格模式才能完全识别。
内容的提问来源于stack exchange,提问作者Landon
相关产品推荐
相关产品推荐

