🙆

【Python】インターフェイスの型ヒントを実現する

2022/11/06に公開

Pythonは動的型付けなのでダックタイピング(同名で呼び出せるなら)が可能です。

しかし、型ヒントの需要が増している現在ではインターフェイス的な型定義が欲しくなってきます。

そんなときに使えるのが typing.Protocol です。
https://docs.python.org/ja/3.8/library/typing.html#typing.Protocol

使い方

from typing import Protocol

class Proto(Protocol):
    def meth(self) -> int:
        ...


class C:
    def meth(self) -> int:
        return 0


def func(x: Proto) -> int:
    return x.meth()


print(func(C()))  # 0 が表示される

# 以下は型チェックのエラーが出る
print(func(""))  # AttributeError: 'str' object has no attribute 'meth'
print(func(Proto()))  # TypeError: Protocols cannot be instantiated

公式ドキュメントに書いてあるとおり typing.Protocol を親にしたらOKです。

C クラスは Proto と継承関係にないですが型チェックが実現できています。

GitHubで編集を提案

Discussion