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

时间:2011-07-17 18:54:16

标签: python

我需要帮助找出Pythons *args**kwargs。这很简单,但我没有完全包裹我的头。这是一个让我感到困惑的场景。

我有两个函数mainfuncwrapperfunc(这是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

3 个答案:

答案 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

通过这种方式,您可以混合常规和关键字参数。