2016-11-12 72 views
0

我需要將參數kargs都存儲在一個元組中,以便以後調用,所以在這種情況下,元組* args或args中的值是否合適?換句話說,將這項工作:我什麼時候使用** kwargs vs kwargs(* args vs 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

您可以在答案[此處](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)給你已經從元組中提取三個獨立的值,*{'foo': 5}將提取的字典裏所有鍵,但foo(**{'foo': 5, 'bar': 6})將嘗試兩個參數叫做foobar與價值觀56分別傳遞給函數foo

相關問題