#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.