在运行时从 python 文字类型中获取文字?

Getting the literal out of a python Literal type, at runtime?

如何从 typing 中获取 Literal[] 的文字值?

from typing import Literal, Union

Add = Literal['add']
Multiply = Literal['mul']
Action = Union[Add,Multiply]

def do(a: Action):
    if a == Add:
        print("Adding!")
    elif a == Multiply:
        print("Multiplying!")
    else:
        raise ValueError

do('add')

上面的代码进行类型检查,因为 'add' 的类型是 Literal['add'],但在运行时,它会引发 ValueError,因为字符串 'add' 与 [=17= 不同].

如何在运行时重用我在类型级别定义的文字?

typing 模块提供了一个函数 get_args,它检索用来初始化 Literal 的参数。

>>> from typing import Literal, get_args
>>> l = Literal['add', 'mul']
>>> get_args(l)
('add', 'mul')

但是,我认为您对您的建议使用 Literal 不会有任何好处。对我来说更有意义的是使用字符串本身,然后 maybe 定义一个 Literal 用于验证参数是否属于这组字符串的非常严格的目的。

>>> def my_multiply(*args):
...    print("Multiplying {0}!".format(args))
...
>>> def my_add(*args):
...    print("Adding {0}!".format(args))
...
>>> op = {'mul': my_multiply, 'add': my_add}
>>> def do(action: Literal[list(op.keys())]):
...    return op[action]

请记住,类型注释本质上是一个专门的 type 定义,而不是一个值。它限制了哪些值可以通过,但它本身只是实现了一个约束——一个拒绝您不想允许的值的过滤器。如上所示,它的参数是一组允许的值,因此约束本身仅指定它将接受哪些值,但实际值只有在您具体使用它来验证值时才会出现。