Вызов функции сообщает, что было приведено 0 аргументов, несмотря на передачу допустимых аргументов

#python #numpy #multiprocessing

Вопрос:

     @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:

Акцент мой

Ошибка типа: logical_and() принимает от 2 до 3 позиционных аргументов, но было задано 0

Ты сделал

 condition = np.logical_and(x1=cond1, x2=cond2)
 

т. е. использовал аргументы ключевых слов вместо позиционных, пожалуйста, попробуйте сделать

 condition = np.logical_and(x1, x2)
 

Комментарии:

1. Просто проверил ваше предложение, и оно, кажется, работает. Однако я не понимаю, почему это так? В документе говорится , что ключевыми словами являются x1 и x2

2. То, что параметры имеют имена, не означает, что вы можете использовать аргументы ключевых слов для их установки. Python также поддерживает только позиционные параметры. Это то, что указано / в подписи в документации: x1 и x2 являются только позиционными; out могут быть указаны в качестве аргумента ключевого слова или в качестве 3-го позиционного аргумента; остальные параметры являются только ключевыми словами.

3. Спасибо @chepner. Действительно, я пропустил / сразу после x2 в документации

4. Этот ответ решает проблему, но не дает объяснения, почему он не работает. Комментарий @chepner делает это. Мне это кажется более интересным, чем просто сказать: » Не делай этого… делай это «.

5. Некоторая предыстория: / уже давно используется в документации для отделения параметров только для позиционных параметров от «обычных» параметров (вытекающих из его использования в Argument Clinic, препроцессоре, используемом в исходном коде CPython для обработки аргументов). Возможность определять свои собственные функции только с позиционными параметрами была описана в PEP-570 и введена в Python 3.8.