gpt4 book ai didi

python - 动态定义具有不同签名的函数

转载 作者:太空狗 更新时间:2023-10-30 02:48:40 24 4
gpt4 key购买 nike

我要实现的目标:

dct = {'foo':0, 'bar':1, 'baz':2}
def func(**dct):
pass
#function signature is now func(foo=0, bar=1, baz=2)

但是,** 语法显然在展开字典(我想做的)和声明包含关键字参数的参数(我不想做的)之间发生冲突。

这可能吗?

最佳答案

根据我对您的要求的解释——您想动态定义一个函数,其签名与运行时提供的 dict 的内容相匹配——这里有两个问题使其不切实际.

  1. 如果参数是在运行时定义的,您的函数如何引用变量?您是否也计划在运行时构建函数体?
  2. dict 是无序的,因此您不能可靠地使用它们来定义位置参数

我怀疑这是一个 XY problem .如果您可以解释您想要实现的目标,那么也许我们可以提供更好的帮助。

但是,假设您正在尝试使用 dict 分配默认关键字参数,那么实现此目的的一种方法是使用 decorators .例如:

def defaultArgs(default_kw):
"decorator to assign default kwargs"
def wrap(f):
def wrapped_f(**kwargs):
kw = {}
kw.update(default_kw) # apply defaults
kw.update(kwargs) # apply from input args
f(**kw) # run actual function with updated kwargs
return wrapped_f
return wrap

然后您可以使用此装饰器将默认关键字参数分配给只需要关键字参数的函数:

defaults = {'foo':0, 'bar':1, 'baz':2}

@defaultArgs(defaults)
def func(**kwargs):
print kwargs # args accessible via the kwargs dict

结果:

func()  # prints {'baz': 2, 'foo': 0, 'bar': 1}
func(foo=2) # prints {'baz': 2, 'foo': 2, 'bar': 1}

params = {'bar':1000, 'hello':'world'}
func(**params) # prints {'baz': 2, 'foo': 0, 'bar': 1000, 'hello': 'world'}

请注意,您将无法使用位置参数:

func(1, 2, 3)   # raises TypeError

关于python - 动态定义具有不同签名的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11954037/

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