Протоколы Python и модели DjangoPython

Программы на Python
Anonymous
Протоколы Python и модели Django

Сообщение Anonymous »

Предположим, у меня есть простой протокол A и класс B, который не может реализовать этот протокол:

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

from typing import Protocol

class A(Protocol):
def foo(self) -> str: ...

class B:
pass
Mypy будет корректно сообщать об ошибке, если приведенный ниже код будет проверен по типу.

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

x: A = B()

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

mypy .
error: Incompatible types in assignment (expression has type "B", variable has type "A")
Однако если у меня есть так, что B наследуется от django.db.models.Model следующим образом

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

class A(Protocol):
def foo(self) -> str: ...

class B(models.Model):
pass

x: A = B()
mypy больше не выдает ошибку при проверке строки x: A = B(). Я ожидал, что это выдаст ошибку, поскольку B (по-видимому) не реализует протокол A. Я предполагаю, что это как-то связано с некоторыми унаследованными свойствами моделей.Model, которые заставляют mypy думать, что существует метод foo.
Кто-нибудь знает, что здесь, и у вас есть совет, как заставить mypy проверить, реализует ли модель Django протокол? Обратите внимание: я бы предпочел, чтобы модель не требовала явного подкласса протокола.

Подробнее здесь: https://stackoverflow.com/questions/770 ... ngo-models

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