首页 > 解决方案 > 在运行时从 python Literal 类型中获取文字?

问题描述

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

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')

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

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

标签: pythontypesliteralstypingpython-3.8

解决方案


typing模块提供了一个函数,该函数get_args检索您Literal初始化时使用的参数。

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

但是,我认为您不会通过使用 aLiteral来获得任何建议。对我来说更有意义的是使用字符串本身,然后可能定义一个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]

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


推荐阅读