Набор подсказок типа проблемы для дочерних объектов в PythonPython

Программы на Python
Anonymous
Набор подсказок типа проблемы для дочерних объектов в Python

Сообщение Anonymous »

Mypy сообщает о проблеме в моем коде, которая меня очень сбивает с толку. Вот фрагмент кода, иллюстрирующий проблему. Обратите внимание, что это работает в Python 3.12.3 и mypy 1.10.0

Код: Выделить всё

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
mypy помечает func_of_set_of_a(set_of_b) как проблематичный из-за следующей ошибки:

ошибка: Аргумент 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

Вернуться в «Python»