Python / Django - Mypy: выражение имеет тип "Type [ModelInstance]", переменная имеет тип "ModelInstance" - PullRequest
1 голос
/ 25 октября 2019

Я работаю над приложением Django, которое предоставляет API-интерфейс GraphQL для внешнего интерфейса. Я использую 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 как тип», которое встречается во всем моем коде (и, похоже, не являетсягенерирует ошибки)

Таким образом, я не совсем уверен, что я делаю здесь неправильно, поэтому любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 25 октября 2019

Тип ваших атрибутов model не сам класс, а Type. Действительно, если вы скажете model = Academy, то тип model будет type(model) == type(Academy) == Type, действительно, Academy - это , а не Academy объект , это ссылкадля класса тип такого класса (подкласс) равен Type. Кроме того, вы можете использовать Type[…] [python-doc] для указания (базового) класса типа, поэтому Type[C] означает, что это тип Cили подкласс 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,)
...