【问题标题】:Function call reports 0 arguments were given despite passing valid arguments函数调用报告尽管传递了有效参数,但仍给出了 0 个参数
【发布时间】: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

造成这种情况的合理原因是什么?我该如何解决这个问题?

【问题讨论】:

    标签: python numpy multiprocessing


    【解决方案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 中引入。
    猜你喜欢
    • 2012-09-26
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2019-08-19
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多