2010-04-30 135 views
0

我的函數調用幾層,身邊掠過的關鍵字參數的普通詞典:Python的關鍵字參數

def func1(**qwargs): 
    func2(**qwargs) 
    func3(**qwargs) 

我想在一些後續的函數調用提供一些默認參數,這樣的事情:

def func1(**qwargs): 
    func2(arg = qwargs.get("arg", default), **qwargs) 
    func3(**qwargs) 

這種方法的問題是,如果arg是內qwargs,一個TypeError引發與「爲關鍵字參數有多個值」。

我不想將qwargs [「arg」]設置爲默認值,因爲func3無需授權即可獲取此參數。我可以製作一個qwargs的copy.copy,並在副本中設置「arg」,但qwargs可能有大數據結構,我不想複製它們(也許copy.copy不會,只有copy.deepcopy ?)。

什麼是pythonic在這裏做什麼?

+1

'qwargs'聽起來像數據和'func *'聽起來像方法。你有沒有想過把這兩個包裝成一個班級?如果你這樣做,那麼'func2'的簽名可能被簡化爲'func2(self,arg = default)'...... – unutbu 2010-04-30 15:40:08

回答

2

簡單的建造和使用其他字典調用func2的目的,離開原來單獨爲後來調用func3

def func1(**qwargs): 
    d = dict(arg=default) 
    d.update(qwqargs) 
    func2(**d) 
    func3(**qwargs) 

這是,如果你想爲argqwargs設置覆蓋default 。否則(如果你想default來覆蓋arg任何可能設定在qwargs):

def func1(**qwargs): 
    d = dict(qwargs, arg=default) 
    func2(**d) 
    func3(**qwargs) 

由於關鍵字參數dict覆蓋在位置參數的值,如果有的話。

1

要創建一個新的字典具有相同鍵和值可以使用

newdict=dict(qwargs) 

如果qwargs不包含真正個鍵的便宜。

如果可能的話,你可以重寫函數,把它們的參數當作dict,而不是多個參數。