from __ future __ import annotationsとは?

※ コードは説明に特化したコードであくまで例です。。 🙇‍♀️

調べるきっかけ

  • 開発していてたまたま見かけたコードで単純になんだろうと思ったので調べた

from future import annotationsとは何か?

  • Python で型ヒントを書くとき、型定義するときに必要
  • Pythonのバージョンによっては書かなくてもよい
__ future __とは?
  • Pythonが用意してくれているモジュール
  • (ちょっと詳しくはよく理解できなかったので公式ドキュメントだけ貼っときます・・)

future - Future statement definitions - Python 3.9.5 documentation

どういうときに使うのか?

1.  Python3.8以前でリストやタプルの型定義をするとき

Python3.8以前のリストやタプルの型定義のやり方

# パターン1: typing パッケージを使う
# 'List' を使う
from typing import List

number_lists: List[int] = [1, 2, 3]

# パターン2: from __future__ import annotationsを先頭に書くパターン
# 'list' を使う
from __future__ import annotations

number_lists: list[int] = [1, 2, 3]
⭐ ポイント
  • Python3.6では __future__ を使えないっぽいので、パターン1しか書けないようです
  • Python3.9以降では、 from __future__ import annotations を書かなくてもパターン2を使用することができるようです

2021年版Pythonの型ヒントの書き方 (for Python 3.9) | フューチャー技術ブログ

2. Python3.7~3.9で引数に複数の型を設定したいとき

from __future__ import annotations

def display_id(name: int | str) -> str:
  • Python3.6では、typingの Union を使用して↓のように書きます
from typing import Union

def display_id(name: Union[int, str]) -> str:

2021年版Pythonの型ヒントの書き方 (for Python 3.9) | フューチャー技術ブログ

3. Python3.7以降で自作関数を戻り値の型定義としたい時

例えば以下のようなクラスを返したい時

class User():
    def __init__(self, first_name: str, name: str, age: int):
        
        self.first_name = first_name
        self.name = name
        self.age = age

    @classmethod
    def func(cls, fullname: str, age: int) -> User:
        # fullnameとageからUserオブジェクトを返すメソッド
        # 処理は省略.
# パターン1
# from __future__ import annotationsを使う時
# 戻り値の型に、User とかけます
from __future__ import annotations

class User():
        省略

    @classmethod
    def func(cls, fullname: str, age: int) -> User:

# パターン2
# typing を使う時
# ' ' (シングルクォーテーション)が必要

class User():
        省略

    @classmethod
    def func(cls, fullname: str, age: int) -> 'User'

pythonの型ヒントで自作クラスを指定したい|teratail

他にもありそうですが、ここまでで、なんとなく存在意義を理解したのでここまで。

他は都度学んだら書くようにしようかなと思います。