абстрактный метод python с более конкретными аргументами

#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 правильно жалуется