python - Python:用于跨具有不同输入的函数验证键值错误的装饰器
问题描述
我正在寻找一个装饰器来进行参数验证。事情是,为了 DRY 的利益,我希望将它用于具有不同所需参数和键值参数组合的各种函数。在下面做这样的事情最pythonic的方式是什么?我什至可以,或者我应该为每种输入组合制作一个装饰器吗?
def my_decorator(func):
def func_wrapper(x, y, a, b, c, d):
# Check that inputs are valid
if a <= 0 or b <= 0 or c <= 0 or d <= 0:
raise Exception("a, b, c, & d must be positive")
if x < 0 or y < 0:
raise Exception("x & y must be non-negative")
return func(some_inputs)
return func_wrapper
@my_decorator
def my_fun_1(x, a=None, b=None):
return x ** (a + b)
@my_decorator
def my_fun_2(x, y, c=None):
return x + y - c
...
@my_decorator
def my_fun_n(y, b=None, d=None):
return y ** (b - d)
提前致谢!
解决方案
from valdec.decorators import validate
from valdec.errors import ValidationArgumentsError, ValidationReturnError
@validate
def add(a: int, b: int) -> int:
return a + b
assert add(2, 3) == 5
try:
add("s", 3)
except ValidationArgumentsError:
pass
@validate("b", "return")
def foo(a: int, b: int) -> int:
return "str"
try:
foo("s", 3)
except ValidationReturnError:
pass
推荐阅读
- python - AWS CDK S3 存储桶创建错误 - Bucket_Name 已存在
- javascript - 如何将参数传递给 Chrome 存储 get 函数,并将该参数设置为键?
- python - 错误:无法为(分开的)GRM - GCTA 64/python 分配足够的内存
- mysql - 增量功能 - 滑动一行 - mongoDb & MySQL
- java - Maven 多模块项目在 Jenkins 管道上失败,因为代理与 maven-enforcer-plugin 强制执行的操作系统不同
- c - 在数组中查找对 (c)
- r - gganimate 县人口普查区块组地图在各州之间浮动
- javascript - 从对象中提取数组?
- python - 为什么我的 tkinter 小部件不能使用粘性和列/行权重进行拉伸
- javascript - 仅删除(更新查询)数组mongodb数组中的特定元素?