有没有办法访问kwargs dict而没有明确地使用def(** kwargs)?

时间:2014-10-03 12:22:52

标签: python keyword-argument

让我们说我们有一个像

这样的函数声明
def myfunc(a=None,b=None):
    as_dict = {"a": a,
               "b": b,
              }
    print a * b
    some_other_function_that_takes_a_dict(as_dict)

有没有办法将关键字参数捕获为dict而不更改def myfunc(...),我的意思是我可以做

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

但是如果我想保持函数签名的清晰度和文档,我还有其他方法可以将关键字参数作为dict。我试图搜索魔法变量等,但我可以看到任何这样做。

要清楚我要搜索类似

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

在python中有某种神奇的__kwargs__吗?

3 个答案:

答案 0 :(得分:3)

如果您的函数中只有kwargs,请使用locals

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

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

答案 1 :(得分:1)

扩展Padraic Cunningham的答案,使用具有非关键字参数的函数:

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

答案 2 :(得分:0)

明确。仅从other需要的那些变量构建字典。

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