這裏是一個函數裝飾我寫來做到這一點,與使用情況的一個例子沿:
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')
爲什麼'MYFUNC(* ARG)'不夠好? – interjay 2010-02-10 23:45:56
我猜yuri沒有(還)知道* arg – Dana 2010-02-10 23:50:09
實現需要myfunc是一個傳遞給另一個函數的回調函數,它嘗試在傳遞參數的列表理解中調用它。所以我沒有控制回調實現,用戶不能有意地忽略'* args'(在代碼中我關心這個事件) – yuri 2010-02-10 23:51:37