gpt4 book ai didi

python-3.x - 是否有可能采用这种使用字典的方法来查找/评估许多函数之一及其对应的args?

转载 作者:行者123 更新时间:2023-12-03 07:40:17 25 4
gpt4 key购买 nike

假设其中一个具有几个单独的功能来评估某些给定数据。而不是使用冗余的if/else循环,而是决定使用字典键来查找特定的函数及其对应的args。我觉得这是可能的,但我不知道如何进行这项工作。作为简化示例(我希望适合我的情况),请考虑以下代码:

def func_one(x, a, b, c=0):
""" arbitrary function """
# c is initialized since it is necessary in func_two and has no effect in func_one
return a*x + b

def func_two(x, a, b, c):
""" arbitrary function """
return a*x**2 + b*x + c

def pick_function(key, x=5):
""" picks and evaluates arbitrary function by key """
if key != (1 or 2):
raise ValueError("key = 1 or 2")

## args = a, b, c
args_one = (1, 2, 3)
args_two = (4, 5, 3)

## function dictionary
func_dict = dict(zip([1, 2], [func_one, func_two]))

## args dictionary
args_dict = dict(zip([1, 2], [args_one, args_two]))

## apply function to args
func = func_dict[key]
args = args_dict[key]

## my original attempt >> return func(x, args)
return func(x, *args) ## << EDITED SOLUTION VIA COMMENTS BELOW

print(func_one(x=5, a=1, b=2, c=3)) # prints 7

但,
print(pick_function(1)) 

返回错误信息
  File "stack_overflow_example_question.py", line 17, in pick_function
return func(x, args)
TypeError: func_one() missing 1 required positional argument: 'b'

显然,并不是所有的 args都随字典一起传递。我尝试了从 args_oneargs_two(在 pick_function中定义)添加/删除多余的括号和括号的各种组合。这种方法有成果吗?还有其他便捷的方法(在可读性和速度方面)不需要很多if/else循环吗?

最佳答案

要以最小的更改修复代码,请将return func(x, args)更改为return func(x, *args)。我认为这是Anton vBR is suggesting的注释。

但是,我认为您的代码可以通过以下方式进一步简化
像这样使用*(“splat”)和**("double-splat"?)位置/关键字argument unpacking operators:

def func_one(x, a, b, c=0):
""" arbitrary function """
# c is initialized since it is necessary in func_two and has no effect in func_one
return a*x + b

def func_two(x, a, b, c):
""" arbitrary function """
return a*x**2 + b*x + c

def func(key, *args, **kwargs):
funcmap = {1: func_one, 2: func_two}
return funcmap[key](*args, **kwargs)

def pick_function(key, x=5):
""" picks and evaluates arbitrary function by key """
argmap = {1: (1, 2, 3), 2: (4, 5, 3)}
return func(key, x, *argmap[key])

print(func_one(x=5, a=1, b=2, c=3))
# 7
print(pick_function(1))
# 7
print(func(1, 5, 1, 2, 3))
# 7
print(func(1, b=2, a=1, c=3, x=5))
# 7

关于python-3.x - 是否有可能采用这种使用字典的方法来查找/评估许多函数之一及其对应的args?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46618898/

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