1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】抽象メソットの書き方

Last updated at Posted at 2024-12-17

疑問

次のコードがmypyの型チェックでエラーになりました。
getメソッドはMyData型を返すとしていますが、Noneを返しているためです。

class MyClass(ABC):
    @abstractmethod
    def get(self) -> MyData:
        return None # 型ヒントと不一致

抽象メソッドには実装が存在しないことを示すべきですが、returnを書いてしまうと型チェックに引っかかります。
正しい記述方法を検討してみました。

解決方法

抽象メソッドの本体には何も実装しないことが重要です。次の記述が一般的です。

Ellipsis リテラル

class MyClass(ABC):
    @abstractmethod
    def get(self) -> MyData:
        ...

は、は未実装を示す視覚的なシンプルな記述です。Ellipsis リテラルとしてPythonに組み込まれています。

pass文

class MyClass(ABC):
    @abstractmethod
    def get(self) -> MyData:
        pass

passはPythonの伝統的な記述です。公式ドキュメントでもpassがよく用いられています。

dockstringを書く

class MyClass(ABC):
    @abstractmethod
    def get(self) -> MyData:
        """Dataを取得するを取得する."""

docstringがある場合、mypyエラーは発生しませんが、...を併用して未実装を明示してもよいとおもいます。
docstringとpassを併用すると、ruff checkPIE790('Unnecessary `pass` statement')警告となります。

どの記述がよいか?

どの記述にするかはプロジェクトのコーディングルール次第ですが、...を使う方が最近のトレンドとして増えている気がします。未実装の関数を一目で確認でき、ruffのチェックにも適合しやすいです。

まとめ

  • 抽象メソッドにreturnを書くと型チェックエラーになる
  • ...(Ellipsis)を使うと視覚的に未実装を示せる
  • passは従来の方法だが、冗長になる場合もある(ruffで警告)
  • docstringを書くだけでもエラーは避けられるが、...を追加するのも可(開発のコーディングルール次第)
class MyClass(ABC):
    @abstractmethod
    def get(self) -> MyData:
        """Dataを取得するを取得する."""
        ...

参考
https://tuxtimo.me/posts/2021/11/05/python-pass-vs.-ellipsis/
https://qiita.com/kissy24/items/d9564d1f48a310614e90

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?