SlideShare a Scribd company logo
1 of 27
PyCharmのススメ 第1部 Type Hints編
もしくは、Pythonと型アノテーション
山口健史
2017-05-19
Pythonと型アノテーション
1
型アノテーションの歴史
 Python3.0〜 (Function Annotations)
 メソッド定義の引数と返り値の型アノテーションの追加
 Python3.5〜 (Type Hints)
 typing モジュール
(ジェネリクス/型変数/型エイリアス/Any/Union/Optional/etc …)
 Python3.6〜 (Variable Annotations)
 変数アノテーション
2
Function Annotations (Python3.0)
 関数の引数と、返り値の型アノテーション
 ただしインタプリタは型アノテーションを無視する
 サードパーティ製ツールが必要
 そこで PyCharm の出番ですよ!!
3
def 関数名(引数1: 型,引数2: 型,…) -> 返り値の型:
https://www.jetbrains.com/pycharm/
Function Annotations (Python3.0)
 返り値の型アノテーションのおかげで
. を入力した時点で補完候補に型strの候補が出現する
 引数の型アノテーションのおかげで
警告が出る
4
若干の嘘が
あります
Function Annotations (Python3.0)
 型アノテーションに書けるのは1つの値(式)だけ
 list と書くと list なのは分かるけれど
そこに何が入っているのかはアノテーション
できない
 「int型 か float型」みたいな直和型が書けない
 現実的にはあまり役に立たない
5
型アノテーションの歴史
 Python3.0〜 (Function Annotations)
 メソッド定義の引数と返り値の型アノテーションの追加
 Python3.5〜 (Type Hints)
 typing モジュール
(ジェネリクス/型変数/型エイリアス/Any/Union/Optional/etc …)
 Python3.6〜 (Variable Annotations)
 変数アノテーション
6
Type Hints (Python3.5)
 Python3.5でtypingモジュール登場!!
(ただし暫定モジュール)
 ジェネリクス/型変数/型エイリアス
 Any型/Union型/Optional型
 Python3.0 の関数アノテーションで決まっていたのは
構文だけで、何をどう書くのか? の仕様はなかった
 →Python3.5で劇的に改善
7
Type Hints (Python3.5)
 ジェネリクス
 Dict[str, Tuple[int, str, List[Tuple[str, List[int]]]]] 型の
変数dがあるとき、d[’key’][2][3][0] の型は?
8
ジェネリック版のlist型ヒント
型指定を [] で括る
Type Hints (Python3.5)
 型変数
9
型変数
パラメータ化された型
Type Hints (Python3.5)
 Union型(直和型)
 どれでもいい
 Any型
 なんでもいい
 object を指定すると
object が持っている属性しか
使えなくなるからダメ
 (単純な)generator
10
警告
警告
実は……PyCharmなら昔からできました 11
PyCharm独自の
docstringによる型アノテーション
https://www.jetbrains.com/help/pycharm/2017.1/type-hinting-in-pycharm.html#legacy
実は……PyCharmは単純な型推論もできます 12
アノテーションなしで
型推論してる
型アノテーションの歴史
 Python3.0〜 (Function Annotations)
 メソッド定義の引数と返り値の型アノテーションの追加
 Python3.5〜 (Type Hints)
 typing モジュール
(ジェネリクス/型変数/型エイリアス/Any/Union/Optional/etc …)
 Python3.6〜 (Variable Annotations)
 変数アノテーション
13
Variable Annotations(Python3.6)
 変数の型アノテーション
 一度これを書いてしまうと3.5以前では実行できない
 後方互換性を壊してまで書く気はしないなぁ、と思っていたら!
14
変数名: 型 = 値
オブジェクト.属性: 型 = 値
Variable Annotations(Python3.6)
 クラススタイル NamedTuple 型付き版
15
※タプルの各要素に
添え字ではなくて
名前でアクセス
できるようになる
※他にもいろいろ
Variable Annotations(Python3.6)
 クラススタイル NamedTuple 型付き版
16
めちゃくちゃ便利!
これに気がついた直後に
Python3.6の環境を作りました
17
型アノテーションの限界
18
無理なこともある
 NamedTuple は新しい型を作るが……
 フィールドを引数に取るコンストラクタを
自動で生成する(メタプログラミング的に)
 ↓の場合code, name, wards という3引数を取るコンストラクタが
存在するけれども、それはどこにも書かれていない
 PyCharm はこのコンストラクタの存在を認識できない
19
不備もある
 普通に使うイディオムで警告が
 なにがおかしいのかわからない
(stubファイルの不備かPyCharmのバグか)
20
(いつ)使うべきなのか
21
静的型付きじゃないことの良さ
 そもそも、型をいちいち書かなくても
どんどん書き進められるのが
静的型付きでない言語のメリットなのに?
 いちいち型を書いていくんですか?
 実行時には何もしてくれないのに?
 型の復讐
22
http://qiita.com/t2y/items/f11032f98d57bc7fc5da
http://lucumr.pocoo.org/2014/8/24/revenge-of-the-types/
静的型付きじゃないことのつらさ
 かといって
Dict[str, Tuple[int, str, List[Tuple[str, List[int]]]]]
みたいな型を持つデータが登場すると死ねる
 それは極端としても
List[Tuple[int, str, List[str]]]
ぐらいなら普通
 半年後に見たときに思い出せる?
23
ありがちなサイクル 24
調整中
修正
開発中
試行錯誤して書いている最中
とりあえずやりたかったことができてきた
色々とよくないところがでてきて調整中
やれやれなんとかなった
(半年ぐらい放置)
ひさしぶりに引っ張り出してきたら覚えていない!
不具合!
いつ型ヒントを書くか 25
調整中
開発中
試行錯誤して書いている最中
とりあえずやりたかったことができてきた
色々とよくないところがでてきて調整中
このタイミングで
複雑な部分から
型アノテーション
を付けていく
いつ型ヒントを書くか 26
調整中
修正
開発中
試行錯誤して書いている最中
とりあえずやりたかったことができてきた
色々とよくないところがでてきて調整中
やれやれなんとかなった
(半年ぐらい放置)
型アノテーションのおかげで助かった!
不具合!
このタイミングで
複雑な部分から
型アノテーション
を付けていく
ってなったらいいね……

More Related Content

What's hot

Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Yusuke Uchida
 
確率モデルを用いた3D点群レジストレーション
確率モデルを用いた3D点群レジストレーション確率モデルを用いた3D点群レジストレーション
確率モデルを用いた3D点群レジストレーションKenta Tanaka
 
Amebaにおけるレコメンデーションシステムの紹介
Amebaにおけるレコメンデーションシステムの紹介Amebaにおけるレコメンデーションシステムの紹介
Amebaにおけるレコメンデーションシステムの紹介cyberagent
 
5分で分かる自己組織化マップ
5分で分かる自己組織化マップ5分で分かる自己組織化マップ
5分で分かる自己組織化マップDaisuke Takai
 
Convolutional Neural Networks のトレンド @WBAFLカジュアルトーク#2
Convolutional Neural Networks のトレンド @WBAFLカジュアルトーク#2Convolutional Neural Networks のトレンド @WBAFLカジュアルトーク#2
Convolutional Neural Networks のトレンド @WBAFLカジュアルトーク#2Daiki Shimada
 
[DL輪読会]ICLR2020の分布外検知速報
[DL輪読会]ICLR2020の分布外検知速報[DL輪読会]ICLR2020の分布外検知速報
[DL輪読会]ICLR2020の分布外検知速報Deep Learning JP
 
推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれからcyberagent
 
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情Yuta Kikuchi
 
SSII2019TS: プロジェクタ・カメラシステムが変わる! ~時間同期の制御で広がる応用~
SSII2019TS: プロジェクタ・カメラシステムが変わる! ~時間同期の制御で広がる応用~SSII2019TS: プロジェクタ・カメラシステムが変わる! ~時間同期の制御で広がる応用~
SSII2019TS: プロジェクタ・カメラシステムが変わる! ~時間同期の制御で広がる応用~SSII
 
画像キャプションの自動生成
画像キャプションの自動生成画像キャプションの自動生成
画像キャプションの自動生成Yoshitaka Ushiku
 
【DL輪読会】WIRE: Wavelet Implicit Neural Representations
【DL輪読会】WIRE: Wavelet Implicit Neural Representations【DL輪読会】WIRE: Wavelet Implicit Neural Representations
【DL輪読会】WIRE: Wavelet Implicit Neural RepresentationsDeep Learning JP
 
効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)
効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)
効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)Yusuke Kaneko
 
Domain Adaptation 発展と動向まとめ(サーベイ資料)
Domain Adaptation 発展と動向まとめ(サーベイ資料)Domain Adaptation 発展と動向まとめ(サーベイ資料)
Domain Adaptation 発展と動向まとめ(サーベイ資料)Yamato OKAMOTO
 
【メタサーベイ】Vision and Language のトップ研究室/研究者
【メタサーベイ】Vision and Language のトップ研究室/研究者【メタサーベイ】Vision and Language のトップ研究室/研究者
【メタサーベイ】Vision and Language のトップ研究室/研究者cvpaper. challenge
 
学習時に使ってはいないデータの混入「リーケージを避ける」
学習時に使ってはいないデータの混入「リーケージを避ける」学習時に使ってはいないデータの混入「リーケージを避ける」
学習時に使ってはいないデータの混入「リーケージを避ける」西岡 賢一郎
 
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築Kosuke Shinoda
 
Rdraモデリングをしよう
RdraモデリングをしようRdraモデリングをしよう
RdraモデリングをしようZenji Kanzaki
 
オープンワールド認識 (第34回全脳アーキテクチャ若手の会 勉強会)
オープンワールド認識 (第34回全脳アーキテクチャ若手の会 勉強会)オープンワールド認識 (第34回全脳アーキテクチャ若手の会 勉強会)
オープンワールド認識 (第34回全脳アーキテクチャ若手の会 勉強会)Takuma Yagi
 
グラフデータ分析 入門編
グラフデータ分析 入門編グラフデータ分析 入門編
グラフデータ分析 入門編順也 山口
 
第52回SWO研究会チュートリアル資料
第52回SWO研究会チュートリアル資料第52回SWO研究会チュートリアル資料
第52回SWO研究会チュートリアル資料Takanori Ugai
 

What's hot (20)

Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
 
確率モデルを用いた3D点群レジストレーション
確率モデルを用いた3D点群レジストレーション確率モデルを用いた3D点群レジストレーション
確率モデルを用いた3D点群レジストレーション
 
Amebaにおけるレコメンデーションシステムの紹介
Amebaにおけるレコメンデーションシステムの紹介Amebaにおけるレコメンデーションシステムの紹介
Amebaにおけるレコメンデーションシステムの紹介
 
5分で分かる自己組織化マップ
5分で分かる自己組織化マップ5分で分かる自己組織化マップ
5分で分かる自己組織化マップ
 
Convolutional Neural Networks のトレンド @WBAFLカジュアルトーク#2
Convolutional Neural Networks のトレンド @WBAFLカジュアルトーク#2Convolutional Neural Networks のトレンド @WBAFLカジュアルトーク#2
Convolutional Neural Networks のトレンド @WBAFLカジュアルトーク#2
 
[DL輪読会]ICLR2020の分布外検知速報
[DL輪読会]ICLR2020の分布外検知速報[DL輪読会]ICLR2020の分布外検知速報
[DL輪読会]ICLR2020の分布外検知速報
 
推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから推薦アルゴリズムの今までとこれから
推薦アルゴリズムの今までとこれから
 
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情
 
SSII2019TS: プロジェクタ・カメラシステムが変わる! ~時間同期の制御で広がる応用~
SSII2019TS: プロジェクタ・カメラシステムが変わる! ~時間同期の制御で広がる応用~SSII2019TS: プロジェクタ・カメラシステムが変わる! ~時間同期の制御で広がる応用~
SSII2019TS: プロジェクタ・カメラシステムが変わる! ~時間同期の制御で広がる応用~
 
画像キャプションの自動生成
画像キャプションの自動生成画像キャプションの自動生成
画像キャプションの自動生成
 
【DL輪読会】WIRE: Wavelet Implicit Neural Representations
【DL輪読会】WIRE: Wavelet Implicit Neural Representations【DL輪読会】WIRE: Wavelet Implicit Neural Representations
【DL輪読会】WIRE: Wavelet Implicit Neural Representations
 
効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)
効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)
効果のあるクリエイティブ広告の見つけ方(Contextual Bandit + TS or UCB)
 
Domain Adaptation 発展と動向まとめ(サーベイ資料)
Domain Adaptation 発展と動向まとめ(サーベイ資料)Domain Adaptation 発展と動向まとめ(サーベイ資料)
Domain Adaptation 発展と動向まとめ(サーベイ資料)
 
【メタサーベイ】Vision and Language のトップ研究室/研究者
【メタサーベイ】Vision and Language のトップ研究室/研究者【メタサーベイ】Vision and Language のトップ研究室/研究者
【メタサーベイ】Vision and Language のトップ研究室/研究者
 
学習時に使ってはいないデータの混入「リーケージを避ける」
学習時に使ってはいないデータの混入「リーケージを避ける」学習時に使ってはいないデータの混入「リーケージを避ける」
学習時に使ってはいないデータの混入「リーケージを避ける」
 
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
 
Rdraモデリングをしよう
RdraモデリングをしようRdraモデリングをしよう
Rdraモデリングをしよう
 
オープンワールド認識 (第34回全脳アーキテクチャ若手の会 勉強会)
オープンワールド認識 (第34回全脳アーキテクチャ若手の会 勉強会)オープンワールド認識 (第34回全脳アーキテクチャ若手の会 勉強会)
オープンワールド認識 (第34回全脳アーキテクチャ若手の会 勉強会)
 
グラフデータ分析 入門編
グラフデータ分析 入門編グラフデータ分析 入門編
グラフデータ分析 入門編
 
第52回SWO研究会チュートリアル資料
第52回SWO研究会チュートリアル資料第52回SWO研究会チュートリアル資料
第52回SWO研究会チュートリアル資料
 

Similar to Python と型アノテーション

Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)Tetsuya Morimoto
 
Brand new Data Processing - StreamAPI
Brand new Data Processing - StreamAPIBrand new Data Processing - StreamAPI
Brand new Data Processing - StreamAPIbitter_fox
 
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]bitter_fox
 
徹底解説!Project Lambdaのすべて[JJUG CCC 2013 Fall H-2]
徹底解説!Project Lambdaのすべて[JJUG CCC 2013 Fall H-2]徹底解説!Project Lambdaのすべて[JJUG CCC 2013 Fall H-2]
徹底解説!Project Lambdaのすべて[JJUG CCC 2013 Fall H-2]bitter_fox
 
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
徹底解説!Project Lambdaのすべて in Fukuoka #j8fkbitter_fox
 
静的型付け言語Python
静的型付け言語Python静的型付け言語Python
静的型付け言語Pythonkiki utagawa
 
エキ Py 読書会02 2章前半
エキ Py 読書会02 2章前半エキ Py 読書会02 2章前半
エキ Py 読書会02 2章前半Tetsuya Morimoto
 
Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Takayuki Shimizukawa
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementationsmasahitojp
 

Similar to Python と型アノテーション (9)

Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)
 
Brand new Data Processing - StreamAPI
Brand new Data Processing - StreamAPIBrand new Data Processing - StreamAPI
Brand new Data Processing - StreamAPI
 
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]
 
徹底解説!Project Lambdaのすべて[JJUG CCC 2013 Fall H-2]
徹底解説!Project Lambdaのすべて[JJUG CCC 2013 Fall H-2]徹底解説!Project Lambdaのすべて[JJUG CCC 2013 Fall H-2]
徹底解説!Project Lambdaのすべて[JJUG CCC 2013 Fall H-2]
 
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
徹底解説!Project Lambdaのすべて in Fukuoka #j8fk
 
静的型付け言語Python
静的型付け言語Python静的型付け言語Python
静的型付け言語Python
 
エキ Py 読書会02 2章前半
エキ Py 読書会02 2章前半エキ Py 読書会02 2章前半
エキ Py 読書会02 2章前半
 
Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 

More from K Yamaguchi

浮動小数点演算の無誤差変換と高精度計算のおはなし
浮動小数点演算の無誤差変換と高精度計算のおはなし 浮動小数点演算の無誤差変換と高精度計算のおはなし
浮動小数点演算の無誤差変換と高精度計算のおはなし K Yamaguchi
 
裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし 裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし K Yamaguchi
 
20100401 izakaya presen 2010 spring
20100401 izakaya presen 2010 spring20100401 izakaya presen 2010 spring
20100401 izakaya presen 2010 springK Yamaguchi
 
裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなしK Yamaguchi
 
20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT
20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT
20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LTK Yamaguchi
 
Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアルK Yamaguchi
 

More from K Yamaguchi (7)

浮動小数点演算の無誤差変換と高精度計算のおはなし
浮動小数点演算の無誤差変換と高精度計算のおはなし 浮動小数点演算の無誤差変換と高精度計算のおはなし
浮動小数点演算の無誤差変換と高精度計算のおはなし
 
裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし 裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし
 
20100401 izakaya presen 2010 spring
20100401 izakaya presen 2010 spring20100401 izakaya presen 2010 spring
20100401 izakaya presen 2010 spring
 
20081101 1000sp
20081101 1000sp20081101 1000sp
20081101 1000sp
 
裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし裏切られる直感と、確率と精度のはなし
裏切られる直感と、確率と精度のはなし
 
20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT
20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT
20150530 サトヤ+プロ生勉強会@マイクロソフト 東北支店 LT
 
Apache Spark チュートリアル
Apache Spark チュートリアルApache Spark チュートリアル
Apache Spark チュートリアル
 

Python と型アノテーション