我需要检查对象是否是打字的后代。文字,我有这样的注释:
GameState: Literal['start', 'stop']
我需要检查
GameState
注释类型:
def parse_values(ann)
if isinstance(ann, str):
# do sth
if isinstance(ann, int):
# do sth
if isinstance(ann, Literal):
# do sth
但是它会导致错误,所以我将最后一个交换为:
if type(ann) == Literal:
# do sth
但它永远不会返回 True,所以有人知道解决方法吗?
typing.get_origin()
为字面后代返回Literal
,所以我需要的基本上是
if get_origin(GameState) == Literal:
# do sth
typing.get_origin(tp)
才是正确的方法
typing.Literal
相同)
文档字符串非常有指导意义:
def get_origin(tp):
"""Get the unsubscripted version of a type.
This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
and Annotated. Return None for unsupported types. Examples::
get_origin(Literal[42]) is Literal
get_origin(int) is None
get_origin(ClassVar[int]) is ClassVar
get_origin(Generic) is Generic
get_origin(Generic[T]) is Generic
get_origin(Union[T, int]) is Union
get_origin(List[Tuple[T, T]][int]) == list
"""
在您的用例中它将是:
from typing import Literal, get_origin
def parse_values(ann):
if isinstance(ann, str):
return "str"
elif isinstance(ann, int):
return "int"
elif get_origin(ann) is Literal:
return "Literal"
assert parse_values("foo") == "str"
assert parse_values(5) == "int"
assert parse_values(Literal["bar", 6]) == "Literal"
你应该与
<class 'typing._LiteralGenericAlias'>
进行比较:
from typing import _LiteralGenericAlias
if type(GameState) == _LiteralGenericAlias:
#do something