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

dataclassを使うと幸せになれる / dataclass

dataclassを使うと幸せになれる / dataclass

dataclassを使って、(型ヒントを書いて)、書く側も見る側も幸せな世界を目指しましょう。

Avatar for Mizuki Kobayashi

Mizuki Kobayashi

September 16, 2019

Other Decks in Programming

Transcript

  1. whoami • 小林 瑞紀 ( @mizkino ) • BI チーム

    @eureka • Python / SQL / Machine Leaning • 出身 • 愛知県 • 京都大学 工学部電気電子工学科 卒 (4年) • 東京大学 情報理工学系研究科 中退 (5年) • 趣味 • DJ / テニス / ダイビング / FORTNITE / R6S 7
  2. dataclassを使う嬉しみ (1) • init でインスタンス変数を初期化する部分を追加してくれる • 結果、コードが簡潔で読みやすくなる • 副作⽤として、TypeHint を書くようになる

    • mypy で事前に構⽂のチェックができる • 他⼈が読みやすく使い回ししやすくなる namedtuple にもある強み こっちの方が 好き
  3. • immutable な変数を使う場合は named_tuple でもOK • 3.7より前から使えるので汎⽤性は⾼い • dataclass は

    dict ベースだけど named_tuple は tuple ベース • dataclass の⽅がアクセスは早い • メモリ使⽤量は named_tuple の⽅が優秀 • 参考 : https://stackoverflow.com/questions/51671699/data-classes-vs-typing-namedtuple-primary-use-cases • named_tuple は for ⽂で回せるので便利 • named_tuple は _asdict() • dataclass は dataclasses.asdict() か vars() で dict 型にできる named_tupleとの⽐較
  4. パラメータによって挙動を制御可能 • init は __init__() を⽣成するか • repr は __repr__()

    を⽣成するか • eq は __eq__() を⽣成するか • order は __lt__(), __le__(), __gt__(), __ge__() を⽣成するか • unsafe_hash は __hash__() を eq,frozen に依らず⽣成するか • frozen は immutable(不可変) にするか dataclassのパラメータ
  5. fieldの設定 個々の変数は field を使って細かく設定可能 • default / default_factory はどちらかのみ •

    両⽅与えるとValueError • repr は __repr__() の出⼒に含むかどうか • hash は __hash__() に含むかどうか • Noneだとcompareの値が使われる (推奨) • init は __init__() でインスタンス変数を初期化するか • compare は⽐較に⽤いるかどうか • metadata でサードパーティ⽤の値を持たせられる
  6. dataclassのハマりどころ (1) • mylist: List のデフォルト変数を与えたいんだけど、、、 ValueError: mutable default for

    field mylist is not allowed: use default_factory default_factoryを使う(引数なしでデフォルト値を返す関数) or Tupleにしましょう
  7. • Python3.7 以上を使ってる⼈は、 dataclass を使って欲しい • 3.7 未満の⼈は named_tuple でも

    OK とにかく、 __init__() で只管インスタンス変数初期化するのやめよう まとめ