2011-07-17 16 views
2

Pythons *args**kwargsを理解する上で助けが必要です。それはシンプルだけど、私は全部自分の頭を包んでいない。ここに私に驚くべきシナリオの1つがあります。可変長引数リストと名前付きパラメータを一緒に使用する

私は2つの関数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') 

をこの方法では、すべての3つのパラメータが位置しています。 j.doeunameになるので、他の二つのparamsは、私はまだ直接wrapperfunc内部unameにアクセスし、次に渡すことができるように、辞書からwrapperfuncへのparamsの一部を通過することが可能である..but *args

によってアクセスすることができます残りの位置パラメータはmainfuncに送信されます。次のコードのような何か:私は直接wrapperfunc内の名前付きパラメータへのアクセスが、mainfuncに、すべての位置パラメータを渡したい

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

+4

正確に何が必要なのかはっきりしません。より良い例を挙げてください –

+0

あなたは 'wrapperfunc'の中で' uname'に直接アクセスし、残りのargsを 'mainfunc'に渡しています。説明してください。 –

+0

私は編集をしました。見てください。私の質問に明快さの欠如のため申し訳ありません。 –

答えて

5

キーワード引数は、Pythonの位置引数の後に指定する必要があります。

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

、2つの位置引数の後にキーワード引数を渡します

あなたは引数を見て、それ以外は通常の通話を行いたい場合は、操作を行います。

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 

あなたが定期的とキーワード引数の両方を混在させることができ、このように

関連する問題