我正在尝试在Python中创建更多的功能代码,我想知道是否可以转换字典(键,值)作为函数参数传递。
我目前正在以一种更强制性的方式执行此操作,即先过滤然后根据过滤结果手动提取每个键。我当前的代码:
def a(i: int, config: dict):
function_array = [function1, function2, function3]
selected = function_array[i]
if (i == "0"):
result = selected(x = config['x'])
elif (i == "1"):
result = selected(y = config['y'])
elif (i == "2"):
result = selected(z = config['z'])
return result
当前结果是正确的,但是当我遇到很多情况时,我需要对指定函数的每个参数进行硬编码。因此,这就是为什么我想知道是否可以根据需要传递配置对象(例如,当x
为i
时使用0
),然后只做一些事情像这样:
def a(i: int, config: dict):
function_array = [function1, function2, function3]
result = function_array[i](config)
return result
答案 0 :(得分:1)
将字典中的项目作为函数参数传递的语法只是selected(**config)
因此,在您的示例中,它看起来像这样:
def function1(x=0):
return x + 1
def function2(y=42):
return y * 2
def function3(z=100):
return z
def a(i, config):
function_array = [function1, function2, function3]
selected = function_array[i]
return selected(**config)
config = {x: 10}
a(0, config) # calls function1(x=10)
config = {y: 20}
a(1, config) # calls function2(y=20)
config = {}
a(2, config) # calls function3()
答案 1 :(得分:0)
可以指示每个python函数使用关键字词典。参见例如https://www.pythoncheatsheet.org/blog/python-easy-args-kwargs。 (来自https://docs.python.org/3/reference/compound_stmts.html#function-definitions的官方消息,但很难阅读。)
您可以这样做:
def a(i: int, keyword: str, **kwargs: dict):
if keyword in kwargs:
result = kwargs[keyword](i)
,您将使用以下命令运行它:
a(5, "func3", func1=print, func2=sum, func3=all)
或者,您可以将字典本身传递给函数:
def a(i: int, keyword: str, config: dict)
if keyword in config:
result = config[keyword](i)
这将与以下内容一起运行:
a(5, "func3", {"func1": print, "func2": sum, "func3": all})
唯一的区别是,函数声明中的**
告诉python使用显式关键字自动创建字典。在第二个示例中,您自己制作字典。
这里幕后发生了一件重要的事情。函数和其他函数一样被传递。在python中,函数仍然是对象。您可以像传递int一样容易地传递函数。因此,如果您想拥有一个列表列表,其中每个内部列表都是一个带有一些参数的函数,则可以轻松地做到这一点:
things_to_do = [[sum, 5, 7, 9], [any, 1, 0], [all, 1, 0]]
for thing_list in things_to_do:
function = thing_list[0]
args = thing_list[1:]
print(function(args))
您将得到以下结果:
21
True
False
(还要注意,所有这些函数都采用可迭代方式,例如列表。如果要单独传递每个参数,则应使用*args
而不是args
。)
您也可以使用已定义的函数来执行此操作。如果有
def foo1(arg1):
pass
def foo2(arg1, arg2):
pass
您可以轻松拥有
things_to_do = [[sum, 5, 7, 9], [foo1, 'a'], [foo2, 0, None]]