如何使用超类调用键入 Python mixin?
How to type Python mixin with superclass calls?
我正尝试在我的项目中使用 ,但我无法通过 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
类 中。仅删除超类会导致此错误:
error: "get_field_names" undefined in superclass
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
您可以引入基数 class 仅用于类型检查:
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
我正尝试在我的项目中使用 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
类 中。仅删除超类会导致此错误:
error: "get_field_names" undefined in superclass
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
您可以引入基数 class 仅用于类型检查:
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