Код: Выделить всё
class A:
pass
class B(A):
pass
def func_of_a(var1: A) -> None:
pass
def func_of_set_of_a(var1: set[A]) -> None:
pass
a = A()
b = B()
b1: B = B()
func_of_a(b1) # mypy does not flag this as being an issue (as expected)
set_of_a: set[A] = {a}
set_of_b: set[B] = {b}
func_of_set_of_a(set_of_a) # mypy does not flag this as being an issue (as expected)
func_of_set_of_a(set_of_b) # mypy flags this as an issue
ошибка: Аргумент 1 до «func_of_set_of_a» имеет несовместимый тип «set»; ожидается "set[A]" [arg-type]
Я не понимаю, почему это отмечено. func_of_a ожидает объект типа A, а также принимает объект любого дочернего класса A. Разве func_of_set_of_a не должна вести себя аналогичным образом? func_of_set_of_a ожидает set[A], но не должна ли она также принимать набор объектов дочернего класса A? Я знаю, что могу изменить подсказку типа на set[A] | set, но это сделало бы мой код громоздким, поскольку в моем реальном случае использования класс A имеет много дочерних классов.
Чего мне здесь не хватает ?
Я пробовал гуглить, но не нашел никакой информации по этому поводу. Если я этого не упустил, официальная документация Python также не рассматривает эту проблему.
Подробнее здесь: https://stackoverflow.com/questions/784 ... -in-python