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

路德维格

我怎样才能得到的文本值了Literal[]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')

上面类型的代码检查,因为'add'类型是Literal['add'],但是在运行时,由于字符串'add',它会引发ValueError typing.Literal['add']

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

三元组

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

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

但是,我认为您不会通过使用Literal您的建议而获得任何收益对我而言,更有意义的是使用字符串本身,然后可能Literal出于非常严格的目的定义a ,以验证参数是否属于此字符串集。

>>> 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]

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章