Python / Django - Mypy:表达式的类型为 "Type[ModelInstance]",变量的类型为 "ModelInstance"

Python / Django - Mypy: expression has type "Type[ModelInstance]", variable has type "ModelInstance"

我正在开发一个为前端提供 GraphQL api 的 Django 应用程序。我正在使用 mypy 进行类型检查,当 运行 mypy 遇到我不理解的错误时

当 运行 我得到以下错误:

api/schema.py:50: error: Incompatible types in assignment (expression has type "Type[Academy]", variable has type "Academy")
api/schema.py:57: error: Incompatible types in assignment (expression has type "Type[School]", variable has type "School")
api/schema.py:64: error: Incompatible types in assignment (expression has type "Type[AcademyGroup]", variable has type "AcademyGroup")

这是 mypy 正在检查的代码

class AcademyType(DjangoObjectType):
    class Meta:
        model: Academy = Academy
        filter_fields: List[str] = ['name', 'domain', 'slug']
        interfaces: Tuple = (relay.Node,)


class SchoolType(DjangoObjectType):
    class Meta:
        model: School = School
        filter_fields: List[str] = ['name', 'academy']
        interfaces: Tuple = (relay.Node,)


class AcademyGroupType(DjangoObjectType):
    class Meta:
        model: AcademyGroup = AcademyGroup
        filter_fields: List[str] = ['name', 'academy']
        interfaces: Tuple = (relay.Node,)

所以不断失败的行是 model: AcademyGroup = AcademyGroup 上的变体,但这只是一个 'Django model as type' 定义,它出现在我的代码中(并且似乎没有产生错误)

因此我不太确定我做错了什么,所以任何帮助将不胜感激。

您的 model 属性的类型不是 class 本身,而是 Type。事实上,如果你说 model = Academy,那么 model 的类型是 type(model) == type(Academy) == Type,实际上,Academy 而不是 Academy object,它是对class的引用,这样class的类型是[=11=的(subclass) ].您还可以使用 Type[…] [python-doc] 来指定类型的 (base-)class,因此 Type[C] 表示它是 C 的类型,或者子 [=32] =] 共 C 个:

因此您应该将其注释为:

from typing import <b>Type</b>

class AcademyType(DjangoObjectType):
    class Meta:
        model: <b>Type[</b>Academy<b>]</b> = Academy
        filter_fields: List[str] = ['name', 'domain', 'slug']
        interfaces: Tuple = (relay.Node,)


class SchoolType(DjangoObjectType):
    class Meta:
        model: <b>Type[</b>School<b>]</b> = School
        filter_fields: List[str] = ['name', 'academy']
        interfaces: Tuple = (relay.Node,)


class AcademyGroupType(DjangoObjectType):
    class Meta:
        model: <b>Type[</b>AcademyGroup<b>]</b> = AcademyGroup
        filter_fields: List[str] = ['name', 'academy']
        interfaces: Tuple = (relay.Node,)