Если вы настаиваете на проверке перед запуском тела декорированного метода, один из разумных способов сделать это ...:
import functools
class test(object):
def __init__(self, requiredvars):
self.reqs = requiredvars.split()
def __call__(self, f):
@functools.wraps(f)
def wrapper(wself, *a, **k):
missing = set()
for v in self.reqs:
if not hasattr(wself, v):
missing.add(v)
if missing:
msg = 'missing fields: %s' % ','.join(sorted(missing))
raise valueerror, msg
return f(wself, *a, **k)
return wrapper
class data(object):
def __init__(self, a, b):
self.a = a
@test('a b')
def sum(self):
return self.a + self.b
d = data(23, 42)
d.sum()
Это излучает, как вы, очевидно, хотите,
Traceback (most recent call last):
File "rev.py", line 29, in <module>
d.sum()
File "rev.py", line 16, in wrapper
raise ValueError, msg
ValueError: Missing fields: b