从字典将参数传递给变量函数

时间:2019-05-19 14:01:39

标签: python

我有一个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 即使如此,我也提供了其他论据。我可以在自己的职能中做同样的事情吗?我可以使用相对简单的功能签名来做到这一点吗?

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