Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonではじめる今風な型プログラミング / osc21do

Peacock
June 26, 2021

Pythonではじめる今風な型プログラミング / osc21do

Open Source Conference 2021 Hokkaidoでの発表資料

Peacock

June 26, 2021
Tweet

More Decks by Peacock

Other Decks in Technology

Transcript

  1. 1. そもそも: 型ヒントとは 2. 型ヒント入門編: 小さく始める i. 関数の戻り値・引数 ii. 標準で使える組み込み型

    3. 少し発展編: typing モジュール i. Genarator, Callable, TypeVar, Genarics, etc... 4. 最近のアップデート・新機能を以前のバージョンでも使うには 今日話すこと 2 / 24
  2. 名前: Peacock / 高井 陽一 Twitter / GitHub / Facebook:

    peacock0803sz CMS コミュニケーションズでWeb なPython を書いている PyCon JP Association 関係の活動 PyCon JP 2020, 2021 スタッフ PyCon JP TV ディレクター 自己紹介 3 / 24
  3. bool , bytes , float , int , str :

    何もしなくても使える None : 何も返さない関数に使う dict , frozenset , list , set , tuple Collections は中の型を [] で書ける 3.9 以降のみ 3.7, 3.8 は from __future__ import annotaions ( 後述) を書 く 3.6 は typing ( 次項) から大文字始まりのものをimport する ex: list[str] , dict[str, int] refs: python.jp での紹介記事、公式ドキュメント( 英語) 何もimport しなくていい組み込み型 11 / 24
  4. Generics 系は3.9 までは from typing import ... を書いていた コレクション、プロトコル関係など 3.9

    からは後述する書き方になって、非推奨に (3.9 から非推奨) typing モジュールからimport する 12 / 24
  5. Union : 合併型。3.10 以降は | で表せる 例: 文字列と整数をどっちも受け入れる関数 from __future__

    import annoations # 3.7 - 3.9は必要 def normalize_year(year: int | str) -> int: if isinstance(year, int): return year # ここではyearは数値 # これ以降ではyearは文字列 if year.startswith("昭和"): return int(year[2:]) + 1925 elif year.startswith("平成"): return int(year[2:]) + 1988 elif year.startswith("令和"): return int(year[2:]) + 2018 else: raise ValueError('unsupported style') from typing import Union # for 3.6 def normalize_year(year: Union[int, str]) -> int: pass 合併型(Union) 15 / 24
  6. nullable, None とのUnion と等価 Union と同じように振る舞ってくれる 関数の戻り値とかに使うと伝播してしまうので、使い方は要注意 from typing import

    Optional age: Optional[int] age = 17 age = None # これも有効 age: int | None # 3.9以降ならこれでもいい Optional 型 16 / 24
  7. デコレーター関数など、関数を引数に取る関数を書くときに使える from collections.abc import Callable # 3.9以降 from fuctools import

    wraps from typing import Callable # 3.8以前 def validate(func: Callable) -> Callable[..., Callable | tuple[Response, Literal[400]]]: @wraps(func) def wrapper(*args, **kw) -> Callable | tuple[Response, Literal[400]]: try: j = request.json if j is None: raise BadRequest except BadRequest: return jsonify({"data": [], "errors": {"message": ERROR_MESSAGE, "code": 400}}), 400 return func(*args, **kw) return wrapper Callable( 呼び出し可能オブジェクト) 17 / 24
  8. https:/ /www.python.org/downloads/ バージョン ステータス 初回リリース EOS PEP 3.9 バグ修正 2020-10-05

    2025-10 596 3.8 バグ修正 2019-10-14 2024-10 569 3.7 セキュリティ 2018-06-27 2023-06-27 537 3.6 セキュリティ 2016-12-23 2021-12-23 494 最近のアップデート事情 19 / 24
  9. Generics 型定義( [] を使って中の型を書ける) のimport 元が変わった 3.8 までは typing からだったけど、分散した

    list , tuple , dict などの __builtins__ なら何もせずに小文字始 まりにする collections 系(deque, defaultdict) などは collections から iterable, callable などプロトコル関係は collections.abc から 正規表現は re コンテキスト関連は contextlib 3.9 から: 標準Collections 型のGenerics 22 / 24