PythonでmypyにLSP違反を指摘されないように引数の型を狭めるオーバーライドを行う方法
解決したいこと
Pythonでの型安全性を担保したいと思い、プロジェクトの途中にmypyを導入しました。
ですが、既存のコード内に親クラスより子クラスのメソッドの引数の型が狭まるような書き方をしていた箇所があり、mypyにLSPの違反として指摘されてしまっています。なるべくコードの構成を変えないままリライトしたいと考えていますが、方法がわかりません。
発生している問題・エラー
Argument 1 of "load_source" is incompatible with supertype "Stream"; supertype defines the argument type as "Source"
This violates the Liskov substitution principle
See https://mypy.readthedocs.io/en/stable/common_issues.html#incompatible-overrides
コードの構造を模倣したソースコード
import abc
class Source(abc.ABC):
pass
class Stream(abc.ABC):
def load_source(self,source:Source):
pass
class SourceA(Source):
# SourceAはStreamA専用のソースクラス。
pass
class StreamA(Stream):
def load_source(self, source: SourceA):
# StreamAとしてはSourceAのみを扱える。
pass
自分で試したこと
LSPについて疎かったので軽く調べましたが有用な情報を見つけられませんでした...
0