#python #types #interface #mypy #abstract-methods
#python #типы #интерфейс #mypy #абстрактные методы
Вопрос:
Я получаю предупреждение о типе при реализации abstractmethod
более явным образом, почему это неправильно?
У меня есть следующий интерфейс
from typing import Any
from abc import abstractmethod, ABCMeta
class SaveDataInterface(metaclass=ABCMeta):
@abstractmethod
def save_data(self, data: Any, *args, **kwargs):
...
При реализации следующего FileSaver
класса mypy выдает ошибку
error: Signature of "save_data" incompatible with supertype "SaveDataInterface"
class FileSaver(SaveDataInterface):
def save_data(self, data: str, file_path: str, *args, **kwargs):
with open(file_path, 'w') as file:
file.write(data)
Мне не кажется, что это каким-то FileSaver.save_data
образом нарушает abstractmethod
save_data
функциональность, есть ли другой способ реализовать более явную сигнатуру функции?
Комментарии:
1. Если тип S является подтипом типа T, то вы хотите иметь возможность заменять T везде на S без изменения поведения (т. Е. Принцип подстановки Лискова). В вашем случае, поскольку родительский класс SaveDataInterface принимает более общие типы аргументов , вы не можете использовать дочерний класс, который принимает менее общие типы аргументов . Таким образом, переопределенные методы должны быть противоположными (или совместными) вариантами в этих типах аргументов , но не в их возвращаемых типах . Смотрите: en.wikipedia.org/wiki /…
2. Итак, в Python вы можете делать это свободно, но это небезопасно для типов, и mypy правильно жалуется