2011-07-17 69 views
2

我需要一些帮助来计算出Pythons *args**kwargs。这很简单,但我并没有把头围绕在他们身上。这是一个让我感到困惑的场景。一起使用可变长参数列表和命名参数

我有两个函数mainfuncwrapperfunc(这是主函数的包装函数)。它看起来像这样。

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

..但访问是有可能一些则params的从字典传递给wrapperfunc,这样我仍然可以访问unamewrapperfunc直接再通过剩余的位置参数为mainfunc。像下面的代码片段:

params = {'uname':'j.doe'} 
wrapperfunc(**params, 'john', 'doe') 

我要访问的命名参数里面直接wrapperfunc但所有的位置参数传递给mainfunc

+4

目前尚不清楚你到底想要什么。请举一些更好的例子 –

+0

您已* *直接在'wrapperfunc'内部访问'uname',并将其余的args传递给'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

你应该考虑使用装饰器功能。 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) 
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 

这种方式可以混合使用这两个经常和关键字参数。