2016-11-12 11 views
0

後で呼び出すために、両方のargs & kwargsをタプルに格納する必要があります。その場合、タプル* argsまたはargsに適切な値が入りますか?言い換えれば、この作業になります。** kwargsとkwargs(* argsとargs)はいつ使用しますか?

def __init__(self, *args, **kwargs): 
    self._buildCalls = [ 
     (self.__init__, args, kwargs) 
    ] 
    self._building = False 

def __getattr__(self, attr): 
    if self.building(): 
     if hasmethod(self, attr): 
      return lambda *args, **kwargs: self.argSaver(attr, *args, **kwargs) 
    else: 
     return super().__getattr__(attr) 

def argSaver(self, method, *args, **kwargs): 
    self._buildCalls.append((method, args, kwargs)) 
    return method(*args, **kwargs) 
+1

試してみましたか?それはうまくいったのですか? – AChampion

+0

例題は[here](http://stackoverflow.com/q/40498298/4014959)の回答を参考にしてください。 –

+0

'*'と '**'が何をしているのかあなたが実際に理解しているとは思えません。しかし、はい、タプルに 'args'と' kwargs'を格納しなければなりません。 '* args'と' ** kwargs'はあなたが格納できる実際のものではありません(それぞれ 'args'と' kwargs'に別の演算子を実行するだけです)。 – poke

答えて

4

は、ここでのサンプル関数シグネチャです:ここで

def foo(a, b, *args, **kwargs): 

*argsが必要とされていないab後の引数は、非」のよう渡され表し名前付きの引数(foo(1, 2, 3, 4, 5))があり、関数はそれらをargsargs == (3, 4, 5)というタプルとして取得します。

**kwargsは、名前(foo(1, 2, foo=3, bar=4))によって渡され、必要とされていない引数を表し、関数が呼び出されるkwargs辞書としてそれらを取得します:kwargs == {'foo': 3, 'bar': 4}

関数定義外のスター表記法を使用すると、タプルや辞書などからデータを抽出しようとします。 *(1, 2, 3)はあなたにタプルから抽出された3つの別々の値を示し、*{'foo': 5}は、辞書のすべてのキーを抽出しますが、foo(**{'foo': 5, 'bar': 6})は、それぞれの機能foofoobar5持つと6と呼ばれる二つの引数を渡そうとします。

関連する問題