Masayan tech blog.

  1. ブログ記事一覧>
  2. Pythonでも型を意識したプログラミングを(型アノテーション)

Pythonでも型を意識したプログラミングを(型アノテーション)

公開日

環境

  • Windows 10
  • Python 3.9.4
  • VSCode

前提

pythonはそもそも動的型付け言語なので、プログラムを書いているときは型情報を明記しなくても動きます。しかしながら、コードの保守性や堅牢性などを考慮するとやはり型付けは必須になってくるかと思いますので、今回はPython3.6から導入された型アノテーションについて紹介します

変数

  • 変数名: 型の形式で記述する
  • 変数については、例えば、以下のようなHogeクラスのプロパティにvalue問う変数を定義していますが、この場合、value: strと指定
from __future__ import annotations
from dataclasses import dataclass

@dataclass
class Hoge:
    value: str

    def __init__(self, value: str):
        self.value = value

    def get_value(self) -> str:
        return str.strip(self.value)

関数

引数

  • 変数の型と同様、変数名: 型の形式で記述する
  • is_containメソッドの引数としてotherというほかの文字列をstr型で受けるように指定
from __future__ import annotations
from dataclasses import dataclass
from shared.Exception.empty_string_error import EmptyStringError

@dataclass
class Hoge:
    value: str
    def __init__(self, value: str):
        self.value = value

    def get_value(self) -> str:
        return str.strip(self.value)

    def is_contain(self, other: str) -> bool:
        return other in self.get_value()

戻り値

  • ->を使用して、def foo() -> 型 の形式で記述する
  • is_containメソッドの返り値は、otherというほかの文字列が対象の文字列に含まれているかの真偽値を返すように指定
from __future__ import annotations
from dataclasses import dataclass

@dataclass
class Hoge:
    value: str

    def __init__(self, value: str):
        self.value = value

    def get_value(self) -> str:
        return str.strip(self.value)

    def is_contain(self, other: str) -> bool:
        return other in self.get_value()

注意点

typingからインポートする必要のある型

CallableやOptionalなどはtypingからインポートする必要があります

typingモジュールは、Python 3.5で追加された標準モジュールです

以下はOptionalの例

from typing import Optional

def (x: str) -> Optional[str]:
  ・・・ # 文字列型もしくはNoneを返す何かしらの処理

※Callableは、Callable([引数型], 返り値型)のように指定します

自クラスを型として指定したい場合等

pythonではselfが該当しますが、例えばHogeクラスのメソッドに-> Hoge-> Selfのように指定してもうまくいきません。バージョンによりそれぞれ以下のように異なります

Python3.7以上

コードの先頭でfrom future import annotationsを指定する

from __future__ import annotations
from dataclasses import dataclass

@dataclass
class Hoge:
    value: str

def to_upper(self) -> Hoge:
  return Hoge(self.value.upper())

Python3.7未満

-> "Hoge"のように文字列で指定する

まとめ

いかがでしたでしょうか。本記事では、Pythonでも型を意識したプログラミングを(型アノテーション)行う方法について紹介しています。基本的な型の指定方法や初学者がハマりそうなポイント等を実際のコード例を挙げながら丁寧に解説していますので、ぜひ参考にしてみてください。