gpt4 book ai didi

python - 如何通过函数传递多个函数(附加参数)并将它们输出为函数列表而不执行它们

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:09:50 24 4
gpt4 key购买 nike

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

这是我目前的尝试:

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)

最佳答案

如果我没理解错的话,你可能想使用 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()

关于python - 如何通过函数传递多个函数(附加参数)并将它们输出为函数列表而不执行它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51394631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com