今更ながら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版)
VS Code にてインストールしたあとに、
Extention Settings -> Type Checking Modeをbasic or strictに設定
で有効になります。
おまけ
過去に書いたPythonのスクリプトに型チェックを導入してみました。
AnsibleのDynamic Inventory用のシンプルなスクリプトですが、設定できる箇所に型ヒントを記載し、GitHub Actionsでcommitごとに型チェックを実施するようにもしました。
まとめ
やっぱり明示的に型が記載してあるとコードの読みやすさ理解しやすさが違う気がしますね。