2017-10-11 61 views
0

我正在编写一些代码,其中一些函数需要很多输入变量。所以,我认为通过字典使这些输入变量可调用kwargs是个好主意。我遇到函数kwargs被父函数调用时遇到问题。作为一个简单的例子,请考虑下面的代码。如何将字典项目用作父函数和子函数中的函数kwargs?

import numpy as np 

## generate some data and call function via dict 

def f(x): 
    return np.cos(x) 

data_one = np.linspace(1, 10, 10) # x 
data_two = f(data_one) # y 

xy_dict = dict(x=data_one, y=data_two) ## put x,y into dict 

def try_dict_ops(x, y): 
    c = [x[i] - y[i] for i in range(len(x)) if len(x) == len(y)] 
    return np.array(c) 

print(try_dict_ops(**xy_dict)) 
## prints array, it works 

现在我将介绍一个父函数和相应的数据字典。

abxy_dict = dict(a=1, b=4, x=data_one, y=data_two) 

def try_nested_dict_ops(a, b, x, y): 
    g = [try_dict_ops(x, y)[i] * a + b for i in range(len(x))] 
    return np.array(g) 

print(try_nested_dict_ops(**abxy_dict)) 
## prints array, it works 

我的问题是关于调用父函数的不同方法,该方法依次调用上面定义的子函数。没有明确将xy置于abxy_dict之内吗?此外,如果一个父函数调用两个不同的子函数(这两个子函数共享kwargs名称但不一定是参数值),我的目标是否仍然有可能得到这样的设置?

回答

2

使用字典传递关键字参数只是调用函数的不同拼写。 对于函数本身并不重要,它会以某种方式得到这些参数。

换句话说,功能并不关心如果使用

xy_dict = dict(x=data_one, y=data_two) 
try_dict_ops(**xy_dict) 

try_dict_ops(x=data_one, y=data_two) 

try_dict_ops(data_one, data_two) 

如果你的函数实际上不需要访问xy(s Ø通过他们的唯一目的是传授他们的传递函数调用),那么刚刚捕获这些参数在**kwargs包罗万象:

def try_nested_dict_ops(a, b, **kwargs): 
    g = [try_dict_ops(**kwargs)[i] * a + b for i in range(len(x))] 
    return np.array(g) 

现在所有额外关键字参数传递给try_nested_dict_ops()传递在调用try_dict_ops()时,函数本身不需要知道这些参数是什么。您可以将其用于多个函数调用。

然后,您需要xy作为关键字参数传递,而不是位置参数。

+0

非常有用,谢谢!作为一个快速抛开,功能是否有可能从多个字典中调用kwargs? – mikey

+0

@mikey再次,不要混淆用于调用和定义函数参数的类似语法。从Python 3.5开始,您可以在调用中使用'** name'指定多个字典。所有键值组合都传递给函数。如果它明确命名了参数和/或全部参数,则取决于函数。 –

相关问题