有没有办法从字典中提取函数参数?

时间:2019-05-07 17:47:39

标签: python-3.x

我正在尝试在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

当前结果是正确的,但是当我遇到很多情况时,我需要对指定函数的每个参数进行硬编码。因此,这就是为什么我想知道是否可以根据需要传递配置对象(例如,当xi时使用0),然后只做一些事情像这样:

def a(i: int, config: dict):
    function_array = [function1, function2, function3]
    result = function_array[i](config)
    return result

2 个答案:

答案 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]]