Вот минимальный пример, который я могу придумать:
from typing import TYPE_CHECKING
from queue import Queue
if TYPE_CHECKING:
queue_base = Queue['Foo'] # line 7
else:
queue_base = Queue
class Foo(queue_base): ...
b = Foo()
if TYPE_CHECKING:
reveal_type(b) # line 18
print(b)
Это работает нормально (с обычным python), но mypy выдает ошибки:
this. py: 7: ошибка: не удается разрешить имя "queue_base" (возможное определение cycli c)
this.py: 7: error: невозможно разрешить имя "Foo" (возможное определение cycli c)
this.py: 18: note: Раскрытым типом является 'this.Foo'
Если я определю Foo
class как class Foo(Queue['Foo']): ...
, тогда он будет работать в mypy, но выдает ошибку в время выполнения:
TypeError: объект 'type' не может быть подписан
Почти так же, как описано в Использование классов, которые являются обобщенными c в заглушках, но не во время выполнения , разница в том, что я пытаюсь передать "self-type" в generi c. Можно ли это сделать?
Это самый простой пример, который я могу придумать, но на практике классы из Django (менеджеры и наборы запросов), так что это имеет больше смысла, чем "очередь" себя ".