在运行时从 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 定义,而不是一个值。它限制了哪些值可以通过,但它本身只是实现了一个约束——一个拒绝您不想允许的值的过滤器。如上所示,它的参数是一组允许的值,因此约束本身仅指定它将接受哪些值,但实际值只有在您具体使用它来验证值时才会出现。
如何从 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 定义,而不是一个值。它限制了哪些值可以通过,但它本身只是实现了一个约束——一个拒绝您不想允许的值的过滤器。如上所示,它的参数是一组允许的值,因此约束本身仅指定它将接受哪些值,但实际值只有在您具体使用它来验证值时才会出现。