🐥

Pythonのfrom __future__ import annotationsについて

2022/01/20に公開
1

日本語情報をなかなか見つけられなかったので執筆します。
いくつか間違ってる(足りない)点があるかもしれないのでもしあったらご指摘ください。

__future__ とは?

__future__ はpythonの標準モジュールです。バージョン2.1で追加されました。
標準モジュールの中でも特殊な動きをしていて、importするとpythonに新たな構文を実装することができます。futureで使える「新たな機能」は後のバージョンにて正式に構文として実装されます。
例えばpython2から3に変わる時のprint文がprint関数になるなどの変更を2.6以降のバージョンでも
from __future__ import print_functionで実装できるようにしたり、など。
(tips: 後方互換性のためにprint_functionなどは今も残されていますが、現在のpython3ではすでにデフォルトで実装されているためこれを書いても意味はありません。)

型アノテーションについて

型アノテーションは、pythonで型の管理をするために使えるものです。

def add(one, two):
    return one + two

例えばこんな関数があったとします。
この関数に型アノテーションをつけるとこんな感じです。

def add(one: int, two: int) -> int:
    return one + two

関数の1行目が変わりましたね。引数の後の:では引数にとる値の型を、->の後ではreturnする値を指定しています。
これを使うとmypyとかの型チェッカーに引っかかりやすくなります。この型アノテーションを拡張するのが__future__のannotationsなのです。

annotationsで何ができるか

型アノテーションを使うとき、例えば「str型のリスト」を指定したいときはpython3.6では以下のようにやるしかありませんでした。

from typing import List

def stlips(obj: List[str], moji: str) -> List[List[str]]:
    return [m.split(moji) for m in obj]

typingの特別な型「List」を使用する必要があったのですが、python3.7でfutureにannotationsが追加されると次のように書くことができるようになります。

from __future__ import annotations

def stlips(obj: list[str], moji: str) -> list[list[str]]:
    ...

このように、いちいちtypingモジュールからimportする必要がなくなるのです。list, tuple, dictなどは全てimport不要になります。
ただ、Literalなどは引き続きimportが必要になるので注意してください。
Unionはpython3.10で|を使うことによってimportが不要になりました(Optionalも| Noneで実装可能です)が、それ以前のバージョンではannotationsを使ってもimportが必要です。

annotationsはいつ実装?

現状上で紹介したような機能はすでにpython3.9で実装済みです。
ですが、実はannotationsには他にもいくつか機能があります。そちらの実装はまだされていません。
これまで実装されてきたほとんどのfutureは正式に構文として実装されてきました。そして今紹介したannotationsもpython3.10で完全実装予定...でした。しかし、人気な外部モジュールにannotationsと互換性のない機能が搭載されていて、それを使っているコードは壊れてしまうということで実装は延期され、未定だそうです。

最後に

annotationsはいちいちimportする必要がなくなる便利な機能なので実装して欲しいと僕は思います。

Discussion

GuanYuSITGuanYuSIT

日本語情報を見つけられないため執筆するのは本当にありがたいです。勉強になりました。