我有一个Python函数,它需要相对大量的参数。该函数是公共接口的一部分,我需要对其参数执行参数验证/规范化。我可以想到三种方法:
# METHOD 1: front-loading the function
def func(a1, a2, a3=1, a4=2...):
# validation code here ...
# func code here ...
def func_validator(a1, a2, a3=1, a4=2...):
# validation code here ...
# METHOD 2: passing args to a different function
def func(a1, a2, a3=1, a4=2...):
func_validator(a1, a2, a3=1, a4=2...)
# func code here ...
# METHOD 3: decorator
@validator(func_validator)
def func(a1, a2, a3=1, a4=2...):
# func code here ...
# validator decorator definition ...
这三种方法都存在问题:
我知道我也可以使用*args
和**kwargs
,但这会增加我在主函数体中访问参数的开销。
我理想的实现允许我编写一个外部验证函数,其参数签名绑定到目标函数,并将其应用于装饰器。像这样:
def func_validator(????): # how can I tie the argspec to `func`?
# validation code here ...
# can access arguments just as if it were inside `func`
@validator(func_validator)
def func(a1, a2, a3=1, ap=2...):
# func code here...
让我先发制人地说我知道这样的事情可能会被滥用,但我并不认为我所概述的用例完全是混淆的。这个想法只是将长验证代码移出主函数体并进入相邻函数,而不需要(a)复制签名(b)使用通用签名,使访问参数更加冗长。
有可能吗?