Как набрать Python mixin с вызовами суперкласса? - PullRequest
2 голосов
/ 11 июля 2019

Я пытаюсь использовать FieldMixin из этого ответа в моем проекте, но у меня возникают проблемы с его прохождением mypy проверок. Текущий код:

class DynamicFieldsMixin(Serializer):
    context: Dict[str, Any]

    def get_field_names(
        self, declared_fields: OrderedDict, info: FieldInfo
    ) -> Set[str]:
        field_names: Set[str] = self.context.get(
            "fields",
            super().get_field_names(declared_fields, info)
        )
        return field_names

Наследование от rest_framework.serializers.Serializer кажется странным, и мне интересно, есть ли способ избежать этого, поскольку он предназначен для смешивания с реальными Serializer классами. Просто удаление суперкласса приводит к этой ошибке:

ошибка: "get_field_names" не определено в суперклассе

mypy конфигурация:

[mypy]
check_untyped_defs = true
disallow_untyped_defs = true
ignore_missing_imports = true
no_implicit_optional = true
warn_redundant_casts = true
warn_return_any = true
warn_unused_ignores = true

1 Ответ

2 голосов
/ 11 июля 2019

Вы можете ввести базовый класс только для проверки типов:

import typing
from typing import Any, Dict, List, Mapping, TypeVar
from rest_framework.fields import Field
from rest_framework.serializers import ModelSerializer
from rest_framework.utils.model_meta import FieldInfo


if typing.TYPE_CHECKING:
    _Base = ModelSerializer
else:
    _Base = object


class DynamicFieldsMixin(_Base):
    context: Dict[str, Any]

    def get_field_names(self, declared_fields: Mapping[str, Field], info: FieldInfo) -> List[str]:
        field_names = super().get_field_names(declared_fields, info)
        # Revealed type is 'builtins.list[builtins.str]'
        reveal_type(field_names)
        return field_names
...