この記事では PEP 484 — Type Hints の更新によって提案されている Python 2 における型ヒントについての情報をまとめます.
型ヒントとは
Python 3.5 から導入された型ヒント (Type Hints) はソースコードに型注釈 (型アノテーション) を記述する標準的な方法を定義するものです. この記法は mypy で利用されていたものの影響を強く受けており, Python 3.0 で導入された関数アノテーションを利用します. 型ヒントは次のように記述します:
1 2 3 |
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 両対応のコードで型ヒントを利用することは不可能でした.
PEP 484
PEP 484 は型ヒントの記述方法を定義した PEP です. PEP 484 は何度かの更新を経て, Python 2.7 における型ヒントの記述方法の提案 (suggested, not mandatory) が追記されました.
Python 2 における型ヒントは # type:
から始まる1行のコメントとして書かれます. このコメントを関数定義の直後, docstring の前に記述します. 先ほどの Python 3 での例は Python 2 では次のように記述します.
1 2 3 4 |
def add(x, y): # type: (int, int) -> int """docstring here""" return x + y |
この記法をサポートするツールでは Python 2/3 の別によらず, この記法に対応することが求められています. これにより Python 2/3 両対応のコードでも型ヒントが利用できるようになることが期待されます.
記述方法についての注意
インスタンスメソッドとクラスメソッドの第1引数以外のすべての引数に型注釈を記述する必要があります.
1 2 3 4 5 6 7 8 9 |
class TestClass(object): def spam(self, message): # type: (str) -> None pass @classmethod def ham(cls, message): # type: (str) -> None pass |
関数アノテーションを用いる方法では返り値の型注釈を省略すると Any
を指定したものと見なされますが, この記法では返り値の型注釈を省略することは出来ません.
1 2 3 |
def spam(x, y): # type: (str, int) -> Any pass |
*args
や **kwargs
の型注釈は対応する型の前に *
や **
を追加することで記述します.
1 2 3 |
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) で試すことが出来ます.