2014-10-03 39 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})