我正在编写一些代码,其中一些函数需要许多输入变量。所以,我认为通过字典使这些输入变量可调用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
我的问题是关于调用父函数的不同方法,而父函数又调用上面定义的子函数。如果没有明确地将x
和y
放在abxy_dict
中,是否有更简单的方法可以做到这一点?此外,如果父函数调用两个不同的子函数,这两个子函数共享kwargs名称但不一定是args值,那么在给出这样的设置的情况下,我的目标仍然是可能的吗?
答案 0 :(得分: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)
如果您的函数实际上不需要访问x
和y
(因此传递它们的唯一目的是将它们传递给传递函数调用),那么只需捕获它们**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()
调用,而函数本身不需要知道这些参数是什么。您可以将其用于多个函数调用。
然后,您需要将x
和y
作为关键字参数传入,而不是作为位置参数。