gpt4 book ai didi

python - functools.partial : TypeError: got multiple values for keyword argument

转载 作者:太空宇宙 更新时间:2023-11-03 16:23:50 24 4
gpt4 key购买 nike

我正在使用 functools 模块中的部分方法来将函数映射到一系列值:

def basic_rule(p,b,vx=1,**kwargs):
return (p / b) if vx != 0 else 0

def rule5(func,**kwargs):
vals = map(functools.partial(func,**kwargs), range(1,kwargs['b']+1))
return [x for i,x in enumerate(vals[:-1]) if x >= vals[i+1]] == []

rule5(basic_rule,p=100,b=10000)

这是我在第 5 行遇到的错误:

----> return map(functools.partial(func,**kwargs), range(1,kwargs['b']+1))

TypeError: basic_rule() got multiple values for keyword argument 'p'

看起来 functools.partial 正在尝试将范围分配给参数 p,即使我已经为其分配了一个值。我正在尝试将范围分配给 vx 的值。知道如何才能实现这一点吗?

编辑:向代码添加了一些额外的上下文。本质上我想要测试 5 做的是确保给定函数的结果随着 vt 的增加而增加,以便 `func(vt=1) < func(vt=2)... < func(vt =n)。

最佳答案

functools.partial生成一个将参数 receiveid 存储在 2 个属性中的部分:

  • 参数存储位置参数
  • keywords 存储所有基于关键字的参数

因此,部分可以完全按照预期调用原始函数。换句话说,当您使用一个参数(比方说 1)调用结果部分时,它将与以下内容相同:

original_func(1, **kwargs)

由于您的 kwargs 包含第一个参数 - 并且您将“1”作为位置参数传递 - 您会收到错误。

我不确定它在这种特殊情况下是否有效,但可以使用 inspect.getargspec 一个解决方案。从 kwargs 中提取可以作为位置参数传递的参数。在这种情况下,rule5 函数将类似于:

def rule5(func, **kwargs):
# let's save 'b' argument because we'll need it in the range call
b = kwargs['b']
original_args = inspect.getargspec(func).args
# extract from kwargs all arguments that can be passed as positional
new_args = [kwargs.pop(key) for key in original_args if key in kwargs]
# construct the partial passing as much positional arguments as possible
fn = functools.partial(func, *new_args, **kwargs)
# now map will pass the range result as the next positional argument
vals = map(fn, range(1, b+1))
return [x for i,x in enumerate(vals[:-1]) if x >= vals[i+1]] == []

关于python - functools.partial : TypeError: got multiple values for keyword argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38174751/

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