Мой предыдущий ответ пропустил суть вашего вопроса.
Вот более длинное решение:
def ensure_even(*argvars):
def fdec(func):
def f(*args,**kwargs):
for argvar in argvars:
try:
assert(not args[func.func_code.co_varnames.index(argvar)] % 2)
except IndexError:
assert(not kwargs[argvar] % 2)
return func(*args,**kwargs)
return f
return fdec
, и поэтому это использование:
@ensure_even('a','b')
def both_even(a,b):
print a,b
@ensure_even('even')
def first_even(even, arg2):
print even, arg2
both_even(2,2)
first_even(2,3)
both_even(2,1) #fails
хотяЯ не уверен, что это будет работать во всех ситуациях.