我需要帮助找出Pythons *args
和**kwargs
。这很简单,但我没有完全包裹我的头。这是一个让我感到困惑的场景。
我有两个函数mainfunc
和wrapperfunc
(这是main函数的包装函数)。它看起来像这样。
def mainfunc(fname=None, lname=None):
print 'Firstname: ' + fname
print 'Lastname: ' + lname
def wrapperfunc(uname, *args):
print uname
mainfunc(*args)
我可以这样打wrapperfunc
:
wrapperfunc('j.doe', 'john', 'doe')
在这种方法中,所有三个参数都是位置的。由于j.doe
进入uname
,其他两个参数可由*args
..但是是否可以将一些参数从dict传递到wrapperfunc
,这样我仍然可以直接访问uname
内的wrapperfunc
,然后将剩余的位置参数传递给mainfunc
。类似下面的片段:
params = {'uname':'j.doe'}
wrapperfunc(**params, 'john', 'doe')
我想直接在wrapperfunc
内访问命名参数,但将所有位置参数传递给mainfunc
。
答案 0 :(得分:5)
关键字参数必须位于Python中的位置参数之后。
params = {'uname':'j.doe'}
wrapperfunc('john', 'doe', **params)
将在两个位置参数
之后传递关键字参数如果你想看一个参数,但是否则正常进行通话,请执行:
def wrapper(*args, **kwargs):
print kwargs["uname"]
return mainfunc(*args, **kwargs)
您可以将其概括为适用于您想要作为装饰者的任何功能。
def wrapper(f):
def wrapped(*args, **kwargs):
print kwargs["uname"]
return mainfunc(*args, **kwargs)
return wrapped
@wrapper
def foo(uname="Test"):
return uname + "bar"
# the @decorator is equivalent to `foo = wrapper(foo)`
答案 1 :(得分:1)
您应该考虑使用装饰器功能。 Here's a nice example from the python docs
这是我对你的例子的看法。是否有特定的东西,这不允许你正在寻找?
def wrapper(function):
def closure(*args, **kwargs):
print kwargs.get('uname')
function(*args)
return closure
@wrapper
def mainFunc(fname, lname):
print 'Firstname:', fname
print 'Lastname:', lname
mainFunc('john', 'doe', uname='j.doe')
kw={'uname': 'j.doe_from_dict'}
mainFunc('john', 'doe', **kw)
答案 2 :(得分:1)
这可能是你想要的:
def mainfunc(fname=None, lname=None):
print 'Firstname: ' + fname
print 'Lastname: ' + lname
def wrapperfunc(uname, *args, **kwargs):
print uname
mainfunc(*args, **kwargs)
在Python控制台中
>>> wrapperfunc('j.doe', 'john', lname='doe')
j.doe
Firstname: john
Lastname: doe
通过这种方式,您可以混合常规和关键字参数。