如何在python中将特定参数传递给装饰器

MK.*_*MK. 3 python function decorator

我想写一个python函数装饰器,测试函数的某些参数是否通过了一些标准.例如,假设我想测试一些参数总是偶数,那么我希望能够做这样的事情(不是有效的python代码)

def ensure_even( n )  :
  def decorator( function ) :
    @functools.wraps( function )
    def wrapper(*args, **kwargs):
      assert(n % 2 == 0)
      return function(*args, **kwargs)
    return wrapper
   return decorator


@ensure_even(arg2)
def foo(arg1, arg2, arg3) : pass

@ensure_even(arg3)
def bar(arg1, arg2, arg3) : pass
Run Code Online (Sandbox Code Playgroud)

但我无法想象如何实现上述目标.有没有办法将特定参数传递给装饰器?(比如arg2 for foo和arg3 for bar in)

谢谢!

jca*_*219 11

你可以这样做:

def ensure_even(argnum):
  def fdec(func):
    def f(*args, **kwargs):
      assert(args[argnum] % 2 == 0)  #or assert(not args[argnum] % 2)
      return func(*args, **kwargs)
    return f
  return fdec
Run Code Online (Sandbox Code Playgroud)

那么:

@ensure_even(1)  #2nd argument must be even
def test(arg1, arg2):
  print(arg2)

test(1,2) #succeeds
test(1,3) #fails
Run Code Online (Sandbox Code Playgroud)