Возможное определение cycli c при расширении базы, которая является обобщенной c в заглушках, но не во время выполнения - PullRequest
2 голосов
/ 14 января 2020

Вот минимальный пример, который я могу придумать:

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 (менеджеры и наборы запросов), так что это имеет больше смысла, чем "очередь" себя ".

1 Ответ

0 голосов
/ 15 января 2020

Ну, это похоже на работу:

if TYPE_CHECKING:
    class _QueueBase(Queue['Foo']): ...
else:
    class _QueueBase(Queue): ...


class Foo(_QueueBase): ...

...