業務でも趣味でもPythonを書くときはPython3.8を使っている。
Python3.8から使えるTypedDict
とPyCharmを組合わせた開発体験が素晴らしいので紹介する。
TL;DR
TypedDeict
はPEP589で提案され、Python3.8から使える型ヒント- 辞書型のキーとセットをクラスとして厳密に定義できる
- PyCharmと組み合わせると以下の恩恵が受けられる
- オブジェクト生成時に不足キーがわかる
- Keyを設定するときに型が異なることがわかる
- Valueアクセスの際にキーが存在するかわかる
- Valueの型情報に対して補完が可能
class UserDict(TypedDict):
user_name: str
email: str
なお、この記事は以下の環境を使っている。
- Python 3.8.0
- Pycharm 2019.3.1 PROFESSIONAL
事前準備
Python3.8の実行環境は次のように用意する。
まず、pipenv
やpyenv
を事前に準備し、テスト用のディレクトリを作ってpipenv
でPython3.8環境を作っておく。
# 私はMacなのでbrewでインストール
$ brew install pipenv pyenv
$ pipenv --python 3.8
Pipfileが生成できたら、PyCharmで対象ディレクトリを開く。
PycharmのPython実行環境は、Preferenceの中から「Project: xxx」→ 「Project Interpreter」を開いてPython3.8を認識している状態にしておく。
TypedDictを使ったクラス定義とPyacharm
最近のPythonは型ヒントを使って型付けをしているかのようにコーディングができる。
- typing — 型ヒントのサポート
TypedDict
はPEP589でPython3.8から追加された型ヒントだ。TypedDict
を使うことで辞書型の型ヒント内容をかなり厳密に定義できる。
今回はサンプルとして以下のUserDict
クラスを定義した。
class UserDict(TypedDict):
"""Typed User definition."""
user_name: str
email: str
このクラスを使うと、どれくらいの型ヒント情報が得られるのかPyCharmを使って検証する。
キーが不足していることを検知できる
まず、インスタンス生成時にキーの指定が不足していることを検知できる。
以下のような初期化はemail
キーの初期化が不足していると警告が出る。
user = UserDict(
user_name='John Due,
) # Parameter 'email' unfilled
なお、このキーの不足の許可はクラス宣言時のTottaly
オプション(total=False
)でオフにすることもできる。
class Movie(TypedDict, total=False):
name: str
year: int
キーの型が間違っていることを検知できる
キーをすべて満たした初期化をしても、間違った型で要素を初期化していると警告される。
user2 = UserDict(
user_name=20, # Expected type 'str', got 'int' instead
email='user@exmaple.com',
)
定義していないキーへの参照を検知できる
TypedDict
を使ったクラスのインスタンスに対して、宣言時に定義しなかったキー名を指定すると警告を受ける。
辞書型にするとドット
でフィールドを呼び出せなくなるが、これでタイポに気づかずエラーを出してしまうことはないだろう。
print(user['phone']) # TypedDict "UserDict" has no key 'phone'
Valueの型情報を使って補完ができる
すこし拡張した以下のUserDict
を用意する。
from datetime import datetime
class UserDict(TypedDict):
"""Typed User definition."""
user_name: str
email: str
created: datetime
updated: datetime
created
キーはdatetime
型なので、UserDict
インスタンスを使ってuser['created'].
と書くとそのままdatetime
型のメソッド一覧が補完される。
終わりに
TypedDict
は型ヒントなので、違反していても実行は出来てしまうし、IDEを使っていないと恩恵を受けられない。
しかし、Pythonというと「ゆるふわなスクリプト言語」のイメージしかなかったので、ここまで厳密にできるのは驚いた。