一起使用可变长度参数列表和命名参数

Mri*_*lla 2 python

我需要一些帮助来搞清楚蟒蛇*args和蟒蛇**kwargs.这很简单,但我没有完全包裹我的头.这是一个让我感到困惑的场景.

我有两个函数mainfuncwrapperfunc(这是main函数的包装函数).看起来像这样.

def mainfunc(fname=None, lname=None):
    print 'Firstname: ' + fname
    print 'Lastname: ' + lname

def wrapperfunc(uname, *args):
    print uname
    mainfunc(*args)
Run Code Online (Sandbox Code Playgroud)

我可以这样打电话wrapperfunc:

wrapperfunc('j.doe', 'john', 'doe')
Run Code Online (Sandbox Code Playgroud)

在这种方法中,所有三个参数都是位置的.自j.doe进入以来uname,可以访问其他两个参数*args

..但是有可能将一些参数传递wrapperfunc给dict,这样我仍然可以直接进入uname内部wrapperfunc,然后将剩余的位置参数传递给mainfunc.类似下面的代码片段:

params = {'uname':'j.doe'}
wrapperfunc(**params, 'john', 'doe')
Run Code Online (Sandbox Code Playgroud)

我想直接在里​​面访问命名参数,wrapperfunc但是将所有位置参数传递给mainfunc.

小智 5

关键字参数必须位于Python中的位置参数之后.

params = {'uname':'j.doe'}
wrapperfunc('john', 'doe', **params)
Run Code Online (Sandbox Code Playgroud)

将在两个位置参数之后传递关键字参数,

如果你想查看一个参数,但是否则正常进行调用,请执行以下操作:

def wrapper(*args, **kwargs):
    print kwargs["uname"]
    return mainfunc(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

您可以将其概括为适用于您想要作为装饰器的任何功能.

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)`
Run Code Online (Sandbox Code Playgroud)