Python:使用与目标函数相同的签名动态定义验证函数?

时间:2016-07-27 23:14:19

标签: python

我有一个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 ...

这三种方法都存在问题:

  • 方法1:虽然简单,但这使我的代码可读性降低。对于具有许多参数的函数,验证可能很长。当我试图理解这个功能的作用时,我不需要看到这个。
  • 方法2:通过获取实际验证代码解决方法1的问题,但需要多次写出参数2次。
  • 方法3:简单地比方法2好,但我仍然需要写两次函数签名。

我知道我也可以使用*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)使用通用签名,使访问参数更加冗长。

有可能吗?

0 个答案:

没有答案