判断对象是否为type.Literal类型

问题描述 投票:0回答:3

我需要检查对象是否是打字的后代。文字,我有这样的注释:

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,所以有人知道解决方法吗?

python type-hinting literals python-typing typing
3个回答
6
投票

typing.get_origin()
为字面后代返回
Literal
,所以我需要的基本上是

if get_origin(GameState) == Literal:
    # do sth

1
投票

typing.get_origin(tp)
才是正确的方法

它在Python 3.8中实现(与

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"

0
投票

你应该与

<class 'typing._LiteralGenericAlias'>
进行比较:

from typing import _LiteralGenericAlias
if type(GameState) == _LiteralGenericAlias:
     #do something
© www.soinside.com 2019 - 2024. All rights reserved.