Python中如何为Literal类型对象添加正确的类型注解?
正确为接受Literal类型对象的参数添加类型注解
你遇到的问题是要注解接受Literal类型本身(而非Literal取值)的参数,直接用Literal或Type[Literal]都不符合需求:
Literal注解是用来约束参数的取值为Literal定义的枚举值,而非接受Literal类型对象;Type[Literal]是约束参数为Literal类本身,而不是它的泛型实例(比如Literal["a", "b"])。
正确解法:使用TypeVar绑定Literal
通过定义绑定到Literal的类型变量,结合Type注解,可以让类型检查器识别参数为任意的Literal泛型实例:
from typing import Literal, TypeVar, get_args, Type # 定义类型变量,限定为Literal及其泛型实例 TLiteral = TypeVar('TLiteral', bound=Literal) def func1(cls_literal: Type[TLiteral]) -> None: print(get_args(cls_literal)) MyLiteral = Literal["a", "b"] func1(cls_literal=MyLiteral) # 类型检查正常通过
原理说明
TLiteral是一个类型变量,bound=Literal限定它只能是Literal或其泛型实例;Type[TLiteral]表示参数是TLiteral类型的类对象,正好匹配MyLiteral = Literal["a", "b"]这种类型实例。
如果不需要严格的类型约束,也可以直接用type作为注解,但这会丢失类型检查的能力,不推荐在需要类型提示的场景使用。
内容的提问来源于stack exchange,提问作者Wang
相关产品推荐
相关产品推荐

