You can pull it out of f.func_code.co_varnames, but I don't believe that's a very good approach. I tend to veer away from code objects myself.
If you know how many arguments are passed into the wrapped function when it's defined, you can write a function that returns your decorator. As an example... def validate_params(c): def the_decorator(f): def wrapper(*args): if len(args) != c: raise Exception("Bad things, Man.") return f(*args) return wrapper return the_decorator @validate_params(2) def add(a,b): return a+b add(1,2) add(1,2,3) $ ./test.py Traceback (most recent call last): File "test.py", line 16, in <module> add(1,2,3) File "test.py", line 5, in wrapper raise Exception("Bad things, Man.") Exception: Bad things, Man. Jeff On May 14, 3:31 pm, kj <so...@987jk.com.invalid> wrote: > Suppose that f is an object whose type is 'function'. > > Is there a way to find out f's list of formal arguments? > > The reason for this is that I'm trying to write a decorator and > I'd like the wrapper to be able to check the number of arguments > passed. Specifically, I'd like the wrapper to look as shown below: > > def _wrap(f): > def wrapper(self, *params): > n_expected = len(f.FORMAL_ARGS) > n_received = len(params) > if n_received is not n_expected: > raise RuntimeError("Wrong number of arguments passed " > "to %s" % f.__name__) > return self.send_jsonrpc_request(f.__name__, params) > return wrapper > > ...but I'm missing something like the hypothetical attribute > FORMAL_ARGS above. > > TIA! > > Kynn > > -- > NOTE: In my address everything before the first period is backwards; > and the last period, and everything after it, should be discarded. -- http://mail.python.org/mailman/listinfo/python-list