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