2015-07-19 65 views
2

說明

說我有以下的功能,這使得另一個函數的調用:的Python:把所有函數參數爲** kwargs自動

def f1(arg1, arg2, arg3): 
    f2(...) 

f1f2的參數是相同的或f2可能是這樣的:

def f2(**kwargs) 
    pass # whatever 

客戶端代碼將定義和調用f1,並且要求f1的簽名明確定義了所有參數,因此不允許**kwargs用於f1

因此,爲了從內部f1我不得不這樣做是爲了f2呼叫:

def f1(arg1, arg2, arg3): 
    f2(arg1, arg2, arg3) 

問題

有沒有一種方法,我可以傳遞參數f2沒有明確地寫呢?理想情況下,我認爲它應該看起來像這樣:

def f1(arg1, arg2, arg3): 
     kwargs = <Some Magic Here> 
     f2(**kwargs) 

任何魔法?

UPDATE

可能的解決方案

有沒有一種方法,我可以結合locals()inspect.getargspec()聚集我的**kwargs

回答

2

一般來說

好了,你可以創建kwargs爲所有參數的字典,f2()接受和傳遞。雖然我沒有看到任何利益,在使用 -

def f1(arg1, arg2, arg3): 
    f2(arg1=arg1, arg2=arg2, arg3=arg3) 

看起來好像沒什麼問題,並且會比建立字典,把它作爲**kwargs容易。

反正做到這一點的方法是 -

>>> def a(a,b,c): 
...  kwargs = {'a':a , 'b':b , 'c':c} 
...  d(**kwargs) 
... 
>>> def d(**kwargs): 
...  print(kwargs) 
... 
>>> a(1,2,3) 
{'c': 3, 'a': 1, 'b': 2} 

爲您的使用情況

的問題是,F1是要由客戶端,爭論的處理被定義對於所有人來說都很常見,所以我想隱藏處理細節,以便客戶端將所有參數傳遞給實現。此外,我想放寬定義並自動傳遞所有參數,而不是明確指定它們。

locals()函數內部返回當時函數中局部變量作爲字典的副本。如果在你的問題中,如果f1()f2()的定義是相同的,你可以使用locals(),通過在函數的開始處調用它,然後在任何其他代碼之前調用它。示例 -

>>> def a(a,b,c): 
...  lcl = locals() 
...  print(lcl) 
...  d(**lcl) 
...  e = 123 
...  print(locals()) 
... 
>>> def d(**kwargs): 
...  print(kwargs) 
... 
>>> a(1,2,3) 
{'c': 3, 'a': 1, 'b': 2} 
{'c': 3, 'a': 1, 'b': 2} 
{'c': 3, 'a': 1, 'e': 123, 'lcl': {...}, 'b': 2} 
+0

感謝您的回答。我更新了我的問題。問題是'f1'將由客戶端定義,參數的處理對所有人來說都是通用的,所以我想隱藏處理細節,以便客戶端將所有參數傳遞給實現。此外,我想放寬定義並自動傳遞所有參數,而不是明確指定它們。 – bagrat

+0

在這種情況下,你可以使用'locals()'。 'a'中的 –

+0

我可以撥打'd',在'd'中我可以使用'inspect'來獲得'a',這是'locals'。使用'inspect.getargspec'另外驗證'locals'是否有意義? – bagrat

1

你想在這裏是通過父函數的參數的封閉function.So拳頭我必須說,你不能使用local()因爲local是包含本地變量是包含參數和什麼你必須在你的函數的好友定義,但所有的局部變量,如果你只是想獲得所有的參數時,他們是動態的,喜歡你的榜樣,我建議在父母的功能使用*args

def f1(*args): 

但有這裏有一點,因爲你想使用**kwargs,它用於收集你需要的任意關鍵字參數,以便爲你的參數初始名稱。

例如,你可以使用字典理解像以下:

def f1(*args): 
     kwargs = {'arg{}'.format(i):j for i,j in enumerate(args,1)} 
     f2(**kwargs) 

此外,如果你相信,有您的函數的好友沒有局部變量專門定義,你可以使用locals封閉函數之前:

例子:

>>> globsl_a=8 
>>> def fun(arg1,arg2,arg3): 
... print locals() 
... 
>>> fun(5,[3,4],'text') 
{'arg1': 5, 'arg2': [3, 4], 'arg3': 'text'} 
>>> 
+0

對於'locals()'你是對的,但是可以在函數的開始處調用'locals()',這種情況下我認爲它只包含參數,我是對的?至於用'* args'定義'f1',我不想那麼做,爲了代碼完成。 – bagrat

+0

@ n9code是的,請檢查編輯! – Kasramvd

+0

非常感謝@Kasra,但[Anand S Kumar的回答](http://stackoverflow.com/a/31502848/3264192)對我更好。 – bagrat

相關問題