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,)
我正在开发一个为前端提供 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,)