有趣的问题。我认为现实生活中的大多数人都使用@Ashwini Chaudhary 方法。
我同意@Rodrigue 的观点,有时您无法修改函数的调用签名(也许是其他人的模块)。
发生这种情况时,请使用函数装饰器
from inspect import getargspec
from funtools import wraps
def allow_kwargs(foo):
argspec = getargspec(foo)
# if the original allows kwargs then do nothing
if argspec.keywords:
return foo
@wraps(foo)
def newfoo(*args, **kwargs):
#print "newfoo called with args=%r kwargs=%r"%(args,kwargs)
some_args = dict((k,kwargs[k]) for k in argspec.args if k in kwargs)
return foo(*args, **some_args)
return newfoo
# with your function:
@allow_kwargs
def foo(a = None, b=None, c=None):
return "a:%s, b:%s, c:%s " % (a,b,c)
# with someone_elses function:
from some_place import foo
foo = allow_kwargs(foo)
@wraps
from functools 保持__name__
和__doc__
字符串的完整性。您还可以:
- 从装饰器模块看,
FunctionMaker
但这应该是一种更可重用的方法。
- 修改 newfoo 以允许不传递额外的非关键字变量。