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

2024-04-26 18:01:55 发布

您现在位置:Python中文网/ 问答频道 /正文

如何从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']类型,但在运行时,由于字符串'add'typing.Literal['add']不同,因此会引发ValueError。你知道吗

如何在运行时重用在类型级别定义的文本?你知道吗


Tags: from文本importaddtyping类型actiondo
1条回答
网友
1楼 · 发布于 2024-04-26 18:01:55

typing模块提供了一个函数get_args,用于检索初始化Literal的参数。你知道吗

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

然而,我不认为你用Literal来表达你的建议会有所收获。对我来说更有意义的是使用字符串本身,然后可能定义一个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]

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

相关问题 更多 >