以下哪一种是django模型使用类型注释的正确方法?

from typing import TypeVar, Generic
from app.models import User

_T = TypeVar("_T", bound=User)

def func(user: Generic[_T]):
    user.name = 'John'
    user.save()

from typing import Type
from app.models import User

def func(user: Type(User)):
    user.name = 'John'
    user.save()

from app.models import User

def func(user: User):
    user.name = 'John'
    user.save()

推荐答案

如果arg应为MyModel object,则使用:

from app.models import User


def func(arg: User):
    user.name = 'John'
    user.save()

或者,如果不需要使用MyModel,可以避免导入:

from typing import TYPE_CHECKING
from __future__ import annotations

if TYPE_CHECKING:
    from app.models import User


def func(arg: 'User'):
    user.name = 'John'
    user.save()

因为仅为类型提示导入很容易导致循环导入错误.

它们也会接受subclasses,因此如果MyModel例如是abstract base model,那么子模型对于类型提示也是有效的.

使用Generic本身没有多大意义:它用于定义特定类型提示本身,例如Dict.此外,Type(MyModel)意味着您将传递类型本身,它是MyModel的子类,因此意味着您传递对MyModel类的引用,例如,不是MyModel对象.

Python相关问答推荐

python中csv. Dictreader. fieldname的类型是什么?'

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

在Admin中显示从ManyToMany通过模型的筛选结果

从旋转的DF查询非NaN值

PYTHON、VLC、RTSP.屏幕截图不起作用

在用于Python的Bokeh包中设置按钮的样式

如何求相邻对序列中元素 Select 的最小代价

如何获得3D点的平移和旋转,给定的点已经旋转?

来自Airflow Connection的额外参数

read_csv分隔符正在创建无关的空列

将像素信息写入文件并读取该文件

当lambda函数作为参数传递时,pyo3执行

将鼠标悬停在海运`pairplot`的批注/高亮显示上

保存由PYTHON在EXCEL中所做更改的问题

Python键盘模块不会立即检测到按键

在伪子进程中模拟标准输出.打开

try 理解PyTorch运行错误:try 再次向后遍历图表

自由空间里的激光...以及我如何才能检测到Line以进行进一步计算?

带参数约束的类型提示函数*args->;tuple[*args]

Python拟合线到高维点并在它们之间采样