koh’s blog

Sys Admin who loves automation

今更ながらPythonの型ヒントを試す

Pythonは基本的に動的型付けなのでコードを書いているときに明示的に型を記載することはないのですが、やはり他人の書いたコードを読むときや自分の過去のコードを読むときには型が書いてあると嬉しいですね。
ということで今更ですがPythonの型ヒントを試していきます。
※Python3.8.0で確認しています。3.6前後で文法が異なる部分が多いのでお気をつけください。

型ヒント(Type Hints)とは

typing — Support for type hints — Python 3.8.4rc1 documentation

Pythonの実行時には何も影響を与えないが、専用のツールやIDEと組み合わせることで型のチェックを行うことができます。

def f(num: int) -> int:
    return num ** 2

上記の場合受け取る変数num がint, 関数が返却する値がintであることを示しています。

型の指定方法

mypyのドキュメントにあるチートシートがわかりやすいのでおすすめです。

https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html

型の指定方法について下記にいくつか簡単な例を記載します。

変数

下記の2通りで型を指定できます

a: int
a = 5

b: str = 'this is str'

関数

受け取る変数についてはコロン(:)のあとに型を記載、矢印(->)のあとに返却する値の型を指定します。

def f(num: int) -> int:
    return num ** 2

エイリアス

複雑な型を指定する際や配列や辞書の中身の要素の型を指定する際には型エイリアスを使用します。

d: Dict[str, int] = {'aa': 2, 'bb': 5}

MyList = List[str]
l: MyList = ['aaa', 'bbb', 'ccc']

型チェック方法

先に記載したとおりにツールやIDEで型のチェックをする必要がありますがその方法をいくつか紹介します。

Mypy

型チェック用のCLIツールです。

https://mypy.readthedocs.io/en/latest/index.html

pipでインストール可能です

pip install mypy

引数に対象のPythonスクリプトを指定することで実行できます

[koh@kohs-MBP]
% cat main.py
b: int
b = 'aaa'

print(b)
[koh@kohs-MBP]
% mypy main.py
main.py:2: error: Incompatible types in assignment (expression has type "str", variable has type "int")
Found 1 error in 1 file (checked 1 source file)
[koh@kohs-MBP]
%

Pylance

Visual Studio Codeのextentionの一つです。 (7/4時点ではpreview版)

marketplace.visualstudio.com

VS Code にてインストールしたあとに、
Extention Settings -> Type Checking Modeをbasic or strictに設定
で有効になります。

f:id:koh-sh:20200704221446p:plain

おまけ

過去に書いたPythonスクリプトに型チェックを導入してみました。

github.com

AnsibleのDynamic Inventory用のシンプルなスクリプトですが、設定できる箇所に型ヒントを記載し、GitHub Actionsでcommitごとに型チェックを実施するようにもしました。

まとめ

やっぱり明示的に型が記載してあるとコードの読みやすさ理解しやすさが違う気がしますね。