首页 > 解决方案 > 如何通过函数传递多个函数(附加参数)并将它们作为函数列表输出而不执行它们

问题描述

正如标题所述,我正在尝试创建一个将任意数量的函数作为参数(包括它们的参数)的函数。然后它将获取这些函数并将它们输出到一个准备执行的列表中,而无需预先执行它们中的任何一个。

到目前为止,这是我的尝试:

def fxn1(name, employment_status="Working"):
    return name, employement_status

def fxn2(age, job=None):
    return age, job

def output_funcs(**funcs_with_args):
    uncalled_function_list = []
    for function in funcs_with_args:
        params_list = function.__code__.co_varnames
        function_args = []
        for parameter in range(len(params_list)):
            arg = funcs_with_args[function][parameter - 1]
            function_args.append(arg)
        uncalled_function_list.append(function(function_args))
    return uncalled_function_list

output_funcs(fxn1 = {"name" : "joe", "employment_status" : "coder"}, fxn2 = {"age" : 12, "job" : "farmer"})

任何指导将不胜感激。

理想情况下,这种情况下的输出应该是:

fxn1('joe', 'coder'), fxn2(12, 'farmer')

编辑

我现在实际上已经得到了正确输出的函数,但是我不能调用这些函数,因为它们被输出为字符串(见下面的代码):

def fxn1(name, employment_status ="Working"):
    print("hi")

def fxn2(age, job=None):
    print("hello")

def output_funcs(**funcs_with_args):
    uncalled_function_list = []
    for function in funcs_with_args["function_list"]:
        fxn_string = str(function).split(" ")
        fxn_name = fxn_string[1]
        params_list = function.__code__.co_varnames
        function_args = []
        for parameter in params_list:
            arg = funcs_with_args["args"][fxn_name][parameter]
            function_args.append(arg)
        uncalled_function_list.append(f"{function}({function_args[0]}, {function_args[1]})")
    return uncalled_function_list


funcs_yo = output_funcs(function_list = [fxn1, fxn2],
             args = {"fxn1" : {"name" : "joe",
                          "employment_status" : "coder"},
                     "fxn2" : {"age" : 12,
                          "job" : "farmer"}})

for func in funcs_yo:
    print(func)

标签: pythonalgorithmfunction

解决方案


如果我理解正确,您可能想使用functools.partial.

我稍微更改了输入以接受任意数量的(function, kwarg)参数。如果您专门传入两个参数(fxn1、fxn2),则可以使用 kwargs 分配(类型错误的来源)。为了传入任意数量的函数,您需要在 function_collector 中使用*args而不是**kwargs

def function_collector(*func_kwarg_pairs):
    ready_to_call = []
    for func, kwargs in func_kwarg_pairs:
        new_function = partial(func, **kwargs)
        ready_to_call.append(new_function)
    return ready_to_call
    # as a one-line func: return [partial(func, *kwargs) for func, kwargs in func_kwarg_pairs]

# with your two funcs:
if __name__ == '__main__':
    pairs = [(fxn1, {"name" : "joe", "employment_status" : "coder"}), (fxn2, {"age" : 12, "job" : "farmer"})]
    to_be_called = function_collector(*pairs)
    for item in to_be_called:
        item()

推荐阅读