Python 2 と型ヒント (Type Hints)

この記事では PEP 484 — Type Hints の更新によって提案されている Python 2 における型ヒントについての情報をまとめます.

型ヒントとは

Python 3.5 から導入された型ヒント (Type Hints) はソースコードに型注釈 (型アノテーション) を記述する標準的な方法を定義するものです. この記法は mypy で利用されていたものの影響を強く受けており, Python 3.0 で導入された関数アノテーションを利用します. 型ヒントは次のように記述します:

def add(x: int, y: int) -> int:
    """docstring here"""
    return x + y

Python 3.5 は様々な型を記述するために typing モジュールが追加されました. この typing モジュールは Python 3.5 以前でもバックポートが利用できます.

typing モジュールのバックポートが存在しても, Python 2 では関数アノテーションが利用できないため, Python 2/3 両対応のコードで関数アノテーションによる型ヒントを利用することは不可能でした.

追記: 関数アノテーションを用いない型注釈の記述方法としてスタブファイルがあります. これは Python のソースコード <source>.py に対応するスタブファイル <source>.pyi に型注釈のみを別に記述するものです.

PEP 484

PEP 484 は型ヒントの記述方法を定義した PEP です. PEP 484 は何度かの更新を経て, Python 2.7 における型ヒントの記述方法の提案 (suggested, not mandatory) が追記されました.

Python 2 における型ヒントは # type: から始まる1行のコメントとして書かれます. このコメントを関数定義の直後, docstring の前に記述します. 先ほどの Python 3 での例は Python 2 では次のように記述します.

def add(x, y):
    # type: (int, int) -> int
    """docstring here"""
    return x + y

この記法をサポートするツールでは Python 2/3 の別によらず, この記法に対応することが求められています. これにより Python 2/3 両対応のコードでも型ヒントが利用できるようになることが期待されます.

記述方法についての注意

インスタンスメソッドとクラスメソッドの第1引数以外のすべての引数に型注釈を記述する必要があります.

class TestClass(object):
    def spam(self, message):
        # type: (str) -> None
        pass

    @classmethod
    def ham(cls, message):
        # type: (str) -> None
        pass

関数アノテーションを用いる方法では返り値の型注釈を省略すると Any を指定したものと見なされますが, この記法では返り値の型注釈を省略することは出来ません.

def spam(x, y):
    # type: (str, int) -> Any
    pass

*args**kwargs の型注釈は対応する型の前に *** を追加することで記述します.

def ham(x, *eggs):
    # type: (int, *str) -> str
    pass

ツールの対応状況

mypy

2016/2/16 にリリースされた mypy 0.3 で Python 2 での型ヒントのサポートが追加されました.

PyCharm

今後リリース予定の PyCharm 5.1 で Python 2 での型ヒントのサポートが追加される予定です. 記事執筆時点では PyCharm 5.1 の EAP (Early Access Preview) で試すことが出来ます.

更新履歴

  • 2016/2/29: スタブファイルについて追記