我有一个python流,其中将选定的函数存储在变量中-我想使用此变量和从字典传递的参数来调用选定的函数。
假设我具有以下功能:
def func1(param1,param2,param3):
...
def func2(param1):
...
def func3(param2,param3):
...
在我的代码中,我首先选择要使用的函数:
if condition1:
f=func1
elif condition2:
f=func2
elif condition3:
f=func3
现在,我想使用此功能。假设我有一个字典,其中包含所有参数以防万一:
d={'param1':param1_value,'param2':param2_value,'param3':param3_value}
我知道可以使用func1(**d)
将参数传递给func1,但是,我想为func2和func3传递相同的字典。简而言之,我想调用f(**d)
-但是对于func2和func3,签名缺少某些参数。如果我按原样尝试,python将导致错误:“ TypeError:func2()恰好接受1个参数(给定3个)”
我知道我可以使这3个函数的签名相同,并强制它包含所有3个参数(但不要使用它)-但这看起来很难看,并且IDE警告我不要使用其中的参数这个案例。
您知道实现相同目标的更优雅的方式吗?例如,以字符串格式处理这种情况:
d={'name':'my name','location':1,'index':3}
print('my name is {name} and my location is {location}'.format(**d))
上面的代码导致:
my name is my name and my location is 1
即使如此,我也提供了其他论据。我可以在自己的职能中做同样的事情吗?我可以使用相对简单的功能签名来做到这一点吗?
答案 0 :(得分:0)
**d
被称为keyword arguments,它们将函数中提供的确切参数与字典的键进行匹配,如果字典中有多余的参数,则会出现TypeError: func2() takes exactly 1 arguments (3 given)
异常,如下所示:您可以在下面的一个简单示例中看到
In [39]: def func(a,b):
...: pass
...:
In [40]: d = {'a':1,'b':2}
#All arguments passed and matched against parameters
In [41]: func(**d)
In [42]: d = {'a':1}
#An argument b is missing
In [43]: func(**d)
TypeError: func() missing 1 required positional argument: 'b'
In [44]: d = {'a':1,'b':2, 'c':3}
#An extra argument c is passed
In [45]: func(**d)
TypeError: func() got an unexpected keyword argument 'c'
一种更好的方法是通过执行funcX(d)
来传递字典本身,并从函数中提取参数。
def func1(dct):
#Extract known params from the dictionary
param1 = dct.get('param1')
param2 = dct.get('param2')
param3 = dct.get('param3')
print(param1, param2, param3)
def func2(dct):
# Extract known params from the dictionary
param1 = dct.get('param1')
print(param1)
def func3(dct):
# Extract known params from the dictionary
param2 = dct.get('param2')
param3 = dct.get('param3')
print(param2, param3)
d={'param1':'param1_value','param2':'param2_value','param3':'param3_value'}
#Pass the same dictionary to all functions
func1(d)
func2(d)
func3(d)
输出将为
param1_value param2_value param3_value
param1_value
param2_value param3_value