ошибка mypy: несовместимый тип возвращаемого значения (получено «Объединение [bool_, ndarray]», ожидаемый «bool»)

#python #type-hinting #mypy

#python #подсказка типа #mypy

Вопрос:

У меня есть класс, который выглядит следующим образом:

 import numpy as np

class TestClass():

    def __init__(self, a: np.ndarray):
        self.a = a

    def __eq__(self, other: object) -> bool:
        if not isinstance(other, TestClass):
            raise TypeError
        return (np.all(self.a == other.a))
 

Mypy возвращает ошибку Incompatible return value type (got "Union[bool_, ndarray]", expected "bool") . Согласно документации для np.all эта функция должна возвращать обычное логическое значение с этими типами входных данных. Есть ли причина такого поведения?

Ответ №1:

Это ограничение статической проверки типов (или, по крайней мере, аннотации типов, для которых указаны numpy ). np.all Функция возвращает bool значение при вызове с указанными вами аргументами, но она может возвращать другие типы при вызове с другими аргументами (в частности, если вы передадите keepdims=True его, он вернет одноэлементный массив с тем же количеством измерений, что и исходный ввод).

Документация, на которую вы ссылались, показывает это:

Возвращает: все: ndarray, bool

Для ситуации, которую вы показываете, вам numpy на самом деле вообще не нужно, поскольку вы не имеете дело с массивами в первую очередь. Почему бы не использовать and оператор или встроенную all функцию?

 def __eq__(self, other: object) -> bool:
    if not isinstance(other, TestClass):
        raise TypeError
    return all((other.a, self.a))      # or bool(other.a and self.a)