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

環境

  • Windows 10
  • Python 3.9.4
  • VSCode

使用するソースコード

以下の公開リポジトリに置いています

GitHub - masayan1126/tao-py-py: 作業自動化用 Python ライブラリ
作業自動化用 Python ライブラリ. Contribute to masayan1126/tao-py-py development by creating an account on GitHub.

前提

masayan
masayan

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

また、エディター上でコードの型情報に関する静的解析を行ってくれるmypyというライブラリもありますので、こちらの記事も参考にしてみてください。

【mypy】vscodeの拡張機能でPythonスクリプトの静的解析を行う方法
本記事では、vscodeの拡張機能を使用して、mypyでPythonスクリプトの静的解析を行う方法について紹介しています

変数

  • 変数名: 型の形式で記述する
  • 変数については、例えば、以下のような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からインポートする必要があります

masayan
masayan

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学習におすすめの書籍

独習Python/山田祥寛【3000円以上送料無料】
bookfan 1号店 楽天市場店
¥ 3,300(2023/01/31 18:22時点)
タイトルとURLをコピーしました