Вот функциональный декоратор, который я написал для этого, а также пример использования:
def IgnoreExtraArguments(f):
import types
c = f.func_code
if c.co_flags & 0x04 or c.co_flags&0x08:
raise ValueError('function already accepts optional arguments')
newc = types.CodeType(c.co_argcount,
c.co_nlocals,
c.co_stacksize,
c.co_flags | 0x04 | 0x08,
c.co_code,
c.co_consts,
c.co_names,
c.co_varnames+('_ignore_args','_ignore_kwargs'),
c.co_filename,
c.co_name,
c.co_firstlineno,
c.co_lnotab,
c.co_freevars,
c.co_cellvars)
f.func_code = newc
return f
if __name__ == "__main__":
def f(x,y):
print x+y
g = IgnoreExtraArguments(f)
g(2,4)
g(2,5,'banana')
class C(object):
@IgnoreExtraArguments
def m(self,x,y):
print x-y
a=C()
a.m(3,5)
a.m(3,6,'apple')