python - 在运行时从 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']
。
如何在运行时重用我在类型级别定义的文字?
解决方案
该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]
请记住,类型注释本质上是一种专门的类型定义,而不是值。它限制了允许通过的值,但它本身仅实现了一个约束——一个过滤器,它拒绝你不想允许的值。如上所示,它的参数是一组允许的值,因此仅约束仅指定它将接受哪些值,但实际值仅在您具体使用它来验证值时出现。
推荐阅读
- c++ - 如何在 MSVC 中抑制所有 3rd 方编译时警告
- python - Pycharm 中的机器人框架。变量的自动完成不起作用
- reactjs - 如何在 NextJS 中创建全局枚举
- google-maps - icCube:地理图表限制区域不起作用
- express - multer 文件上传 - 如何在路由中从 multer 获取值?
- excel - 如何正确使用 Excel VBA 中的 Like 函数?
- azure - 有没有更好的方法来导出 Azure DevOps 项目的模板(字段和状态)?
- macos - 尝试在 macOS 上安装 Qiskit 时超时
- angular - 如何将数据从一个 div 发送到另一个?
- regex - 无法使用 is text end by 设置正则表达式检查