SlideShare una empresa de Scribd logo
1 de 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
調整中
修正
開発中
試行錯誤して書いている最中
とりあえずやりたかったことができてきた
色々とよくないところがでてきて調整中
やれやれなんとかなった
(半年ぐらい放置)
型アノテーションのおかげで助かった!
不具合!
このタイミングで
複雑な部分から
型アノテーション
を付けていく
ってなったらいいね……

Más contenido relacionado

La actualidad más candente

Geometry Processingで学ぶSparse Matrix
Geometry Processingで学ぶSparse MatrixGeometry Processingで学ぶSparse Matrix
Geometry Processingで学ぶSparse Matrix
Jun Saito
 
画像認識の初歩、SIFT,SURF特徴量
画像認識の初歩、SIFT,SURF特徴量画像認識の初歩、SIFT,SURF特徴量
画像認識の初歩、SIFT,SURF特徴量
takaya imai
 
時系列分析による異常検知入門
時系列分析による異常検知入門時系列分析による異常検知入門
時系列分析による異常検知入門
Yohei Sato
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
Kota Mizushima
 
5分でわかるかもしれないglmnet
5分でわかるかもしれないglmnet5分でわかるかもしれないglmnet
5分でわかるかもしれないglmnet
Nagi Teramo
 

La actualidad más candente (20)

確率モデルを用いた3D点群レジストレーション
確率モデルを用いた3D点群レジストレーション確率モデルを用いた3D点群レジストレーション
確率モデルを用いた3D点群レジストレーション
 
Optimizer入門&最新動向
Optimizer入門&最新動向Optimizer入門&最新動向
Optimizer入門&最新動向
 
線形計画法入門
線形計画法入門線形計画法入門
線形計画法入門
 
継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する
 
簡単な算数でできる文章校正
簡単な算数でできる文章校正簡単な算数でできる文章校正
簡単な算数でできる文章校正
 
3次元計測とフィルタリング
3次元計測とフィルタリング3次元計測とフィルタリング
3次元計測とフィルタリング
 
Point net
Point netPoint net
Point net
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
ゼロから始める転移学習
ゼロから始める転移学習ゼロから始める転移学習
ゼロから始める転移学習
 
Geometry Processingで学ぶSparse Matrix
Geometry Processingで学ぶSparse MatrixGeometry Processingで学ぶSparse Matrix
Geometry Processingで学ぶSparse Matrix
 
なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論なぜコンピュータを学ばなければならないのか 21世紀の君主論
なぜコンピュータを学ばなければならないのか 21世紀の君主論
 
三次元点群を取り扱うニューラルネットワークのサーベイ
三次元点群を取り扱うニューラルネットワークのサーベイ三次元点群を取り扱うニューラルネットワークのサーベイ
三次元点群を取り扱うニューラルネットワークのサーベイ
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
画像認識の初歩、SIFT,SURF特徴量
画像認識の初歩、SIFT,SURF特徴量画像認識の初歩、SIFT,SURF特徴量
画像認識の初歩、SIFT,SURF特徴量
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
 
時系列分析による異常検知入門
時系列分析による異常検知入門時系列分析による異常検知入門
時系列分析による異常検知入門
 
Visual SLAM: Why Bundle Adjust?の解説(第4回3D勉強会@関東)
Visual SLAM: Why Bundle Adjust?の解説(第4回3D勉強会@関東)Visual SLAM: Why Bundle Adjust?の解説(第4回3D勉強会@関東)
Visual SLAM: Why Bundle Adjust?の解説(第4回3D勉強会@関東)
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
5分でわかるかもしれないglmnet
5分でわかるかもしれないglmnet5分でわかるかもしれないglmnet
5分でわかるかもしれないglmnet
 
工学系大学4年生のための論文の読み方
工学系大学4年生のための論文の読み方工学系大学4年生のための論文の読み方
工学系大学4年生のための論文の読み方
 

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

Similar a 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
 

Más de K Yamaguchi

Más de 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 と型アノテーション