函数调用报告尽管传递了有效参数,但仍给出了 0 个参数
Posted
技术标签:
【中文标题】函数调用报告尽管传递了有效参数,但仍给出了 0 个参数【英文标题】:Function call reports 0 arguments were given despite passing valid arguments 【发布时间】:2021-11-03 14:26:30 【问题描述】: @classmethod
def attribute_filter(
cls,
struct_arr: np.ndarray,
attr: str,
lb: Union[int, float, np.number, type(None)] = None,
ub: Union[int, float, np.number, type(None)] = None,
mode: str = 'fill'
):
if lb is None:
lb = struct_arr[attr].min()
if ub is None:
ub = struct_arr[attr].max()
cond1 = (struct_arr[attr] >= lb)
cond2 = (struct_arr[attr] <= ub)
print(cond1, cond2) # Prints as expected
condition = np.logical_and(x1=cond1, x2=cond2) # Fails
...
...
我有classmethod
,如上图所示。此方法正在多处理环境中使用。执行后我得到:
condition = np.logical_and(x1=cond1, x2=cond2)
TypeError: logical_and() takes from 2 to 3 positional arguments but 0 were given
造成这种情况的合理原因是什么?我该如何解决这个问题?
【问题讨论】:
【参考方案1】:强调我的
TypeError:logical_and() 接受 2 到 3 个 positional 参数,但为 0 给了
你做到了
condition = np.logical_and(x1=cond1, x2=cond2)
即使用关键字参数而不是位置参数,请尝试这样做
condition = np.logical_and(x1, x2)
【讨论】:
刚刚测试了您的建议,它似乎有效。但是,我不明白为什么会这样? documentaion 表示关键字是x1
和 x2
仅仅因为参数被命名并不意味着您可以使用关键字参数来设置它们。 Python 还支持仅位置参数。这就是签名中的/
在文档中所指示的内容:x1
和x2
仅用于定位; out
可以指定为关键字参数或第三个位置参数;其余参数仅是关键字。
谢谢@chepner。事实上,我在documentation 中的x2
之后错过了/
这个答案解决了这个问题,但没有解释为什么它不起作用。 @chepner 的评论确实如此。对我来说,这似乎比仅仅说不要那样做……这样做更有趣。
一些背景知识:/
长期以来一直在文档中用于将仅位置参数与“常规”参数分开(源于它在 Argument Clinic 中的使用,这是 CPython 源代码中用于参数的预处理器处理)。 PEP-570 概述了使用仅位置参数定义您自己的函数的能力,并在 Python 3.8 中引入。以上是关于函数调用报告尽管传递了有效参数,但仍给出了 0 个参数的主要内容,如果未能解决你的问题,请参考以下文章