2014-10-03 49 views
2

假設我們有一個函數聲明一樣有沒有明確使用它與def(** kwargs)訪問kwargs字典的方法?

def myfunc(a=None,b=None): 
    as_dict = {"a": a, 
       "b": b, 
       } 
    print a * b 
    some_other_function_that_takes_a_dict(as_dict) 

有沒有辦法捕捉到關鍵字參數的字典不改變def myfunc(...),我的意思是我可以做

def myfunc(**kwargs): 
    print kwargs['a'] * kwargs['b'] 
    some_other_function_that_takes_a_dict(kwargs) 

但是,如果我想要保持清晰和文檔的功能簽名,我是否有任何其他方式將關鍵字參數作爲字典。我試圖尋找魔術變量等,但我可以看到任何這樣做。

只是要清楚,我尋找的東西像

def myfunc(a=None,b=None): 
    print a * b 
    some_other_function_that_takes_a_dict(__kwargs__) 

是有某種形式的在蟒蛇的神奇__kwargs__

+1

只需在你的函數中使用'locals()''kwargs = locals()' – 2014-10-03 12:37:07

+0

對!如果你讓這個答案而不是評論,我會接受它。 – ecerulm 2014-10-03 12:43:58

回答

3

如果你只在你的功能kwargs只使用locals

def my_func(a=None,b=None): 
    kwargs = locals() 
    print (kwargs["a"] * kwargs["b"]) 

In [5]: my_func(10,2) 
20 
+0

@falsetru *和*,如果您也有非關鍵字參數,您可以將此方法與falsetru的答案結合起來,找出哪些是哪個。 (falsetru,你應該取消刪除你的答案,因爲它在這種特殊情況下很有用) – goncalopp 2014-10-03 12:43:06

+0

@goncalopp,如果OP要按鍵訪問,它仍然會工作,如果有非關鍵字參數但我不確定是否是這種情況 – 2014-10-03 12:45:48

+0

事實上,它可以用於簡單訪問,但關鍵字參數列表將會是*錯誤* - 這可能或不重要,這取決於稍後使用它的方式。正如你所說,這對於OP的需求已經足夠了。 – goncalopp 2014-10-03 12:56:36

1

擴展帕德里克·坎寧安的回答與具有非關鍵字參數的函數工作:

from inspect import getargspec 

def get_function_kwargs(f, f_locals): 
    argspec= getargspec(f) 
    kwargs_keys = argspec[0][-len(argspec[3]):] #get only arguments with defaults 
    return {k:f_locals[k] for k in kwargs_keys} 

def my_func(a, b=1, c=2): 
    kwargs= get_function_kwargs(my_func, locals()) 
    print kwargs 
0

要明確。根據other需要的變量來構建字典。

def myfunc(a=None, b=None): 
    other({'a': a, 'b': b})