【发布时间】:2021-02-08 02:19:47
【问题描述】:
我经常遇到只接受一组有限值的函数的场景。我知道如何在类型注释中反映这种行为,像这样使用typing.Literal:
import typing
def func(a: typing.Literal['foo', 'bar']):
pass
我想要一个装饰器@validate_literals 来验证参数是否与其类型一致:
@validate_literals
def picky_typed_function(
binary: typing.Literal[0, 1],
char: typing.Literal['a', 'b']
) -> None:
pass
以便根据参数类型定义的限制验证输入,并在违规情况下引发ValueError:
picky_typed_function(0, 'a') # should pass
picky_typed_function(2, 'a') # should raise "ValueError: binary must be one of (0, 1)')"
picky_typed_function(0, 'c') # should raise "ValueError: char must be one of ('a', 'b')"
picky_typed_function(0, char='c') # should raise "ValueError: char must be one of ('a', 'b')"
picky_typed_function(binary=2, char='c') # should raise "ValueError: binary must be one of (0, 1)"
typing 类型检查设计为静态的,不会在运行时发生。如何利用类型定义进行运行时验证?
【问题讨论】:
标签: python python-decorators python-typing code-inspection