Какой из способов использования подсказок типов Python с Django Models является правильным?
Какой из этих способов является правильным для использования аннотаций типов для моделей django?
from typing import TypeVar, Generic
from app.models import MyModel
_T = TypeVar("_T", bound=MyModel)
def func(arg: Generic[_T]):
...
Or
from typing import Type
from app.models import MyModel
def func(arg: Type(MyModel)):
...
Or
from app.models import MyModel
def func(arg: MyModel):
...
Если arg
должен быть MyModel
объектом , то вы используете:
from app.models import MyModel
def func(arg: MyModel):
pass
или вы можете не импортировать MyModel
, если вам не нужно работать с ним с помощью:
from typing import TYPE_CHECKING
from __future__ import annotations
if TYPE_CHECKING:
from app.models import MyModel
def func(arg: 'MyModel'):
# …
pass
поскольку импорт только для подсказок типов может легко привести к циклическим ошибкам импорта.
Они также принимают подклассы, так что если MyModel
является, например, абстрактной базовой моделью, то подмодели также действительны для подсказок типа.
Использование Generic
само по себе не имеет особого смысла: оно используется для определения конкретного намека на тип, например Dict
. Более того, Type(MyModel)
означает, что вы передаете сам тип, который является подклассом MyModel
, это означает, что вы передаете ссылку, например, на класс MyModel
, а не объект MyModel
.