函数调用报告尽管传递了有效参数,但仍给出了 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 表示关键字是 x1x2 仅仅因为参数被命名并不意味着您可以使用关键字参数来设置它们。 Python 还支持仅位置参数。这就是签名中的/ 在文档中所指示的内容:x1x2 仅用于定位; out 可以指定为关键字参数或第三个位置参数;其余参数仅是关键字。 谢谢@chepner。事实上,我在documentation 中的x2 之后错过了/ 这个答案解决了这个问题,但没有解释为什么它不起作用。 @chepner 的评论确实如此。对我来说,这似乎比仅仅说不要那样做……这样做更有趣。 一些背景知识:/ 长期以来一直在文档中用于将仅位置参数与“常规”参数分开(源于它在 Argument Clinic 中的使用,这是 CPython 源代码中用于参数的预处理器处理)。 PEP-570 概述了使用仅位置参数定义您自己的函数的能力,并在 Python 3.8 中引入。

以上是关于函数调用报告尽管传递了有效参数,但仍给出了 0 个参数的主要内容,如果未能解决你的问题,请参考以下文章

尽管使用了 indexInBounds,但仍获得 ArrayIndexOutOfBounds

JS怎么样调用IOS并且传递参数?

python的参数传递问题!!!

尽管启用了本机代码调试,但仍无法从托管调试本机代码

在 C++ 函数中更新数组(作为参数传递)

高阶函数的参数传递