SlideShare a Scribd company logo
1 of 25
Download to read offline
静的型付け言語Python
こんにちは
● @utgw (うたがわ)
● 工学部情報学科
計算機科学コース2回生
● 第39代副広報・root
● Twitter: @utgwkk
● GitHub: @utgw
アンケートです
● 動的型付け言語を書いたことがある
● Python を書いたことがある
● 型理論に詳しい
前置き
● 型に関する踏み込んだ話はしません(できません)
● あくまで言語機能の紹介としてやっていきます
● Python 3 系の話をします
○ Python 2 系は各位うまくやってくれ
○ https://blog.ymyzk.com/2016/02/python-2-type-hints/
とかに載ってそう
Pythonの型ヒントの経緯
● 2006/12/2: PEP 3107 - Function Annotations
○ Python 3.0 で関数の型ヒントだけ導入された
○ あくまでもヒント
● 2014/9/29: PEP 484 - Type Hints
○ 変数の型ヒントやジェネリクスなど、より踏み込んだ型ヒン
トに関する提案
● 2015/9/14: Python 3.5 リリース
○ PEP 484 を実現するモジュール typing が導入された
動的型付け言語に静的型を導入する試み
1. TypeScript の場合
1.1. TypeScript のコードを書く
1.2. コンパイラが型チェックをする
1.3. JavaScript にコンパイルされる
2. Python + 型ヒントの場合
2.1. Python のコードに型の情報を書く
2.2. 各位うまくやってくれ!!!!!
各位うまくやってくれ!!!!!
● 各位うまくやっていきましょう
○ 実行時に型チェックがされるわけではない
○ そもそも言語としては動的型付け言語のまま
○ むやみに互換性を壊したくない
● 型チェックツールを使いましょう
○ mypy を使いましょう
○ そのうち PyCharm とかでも対応しそう
動的型付け言語に静的型を導入する試み(修正)
1. TypeScript の場合
1.1. TypeScript のコードを書く
1.2. コンパイラが型チェックをする
1.3. JavaScript にコンパイルされる
2. Python + 型ヒントの場合
2.1. Python のコードに型の情報を書く
2.2. mypy 等で型チェックをする
2.3. よさそうだったら本番投入
従来のコード
def fib(n):
a, b = 0, 1
i = 0
while i <= n:
yield a
a, b = b, a + b
i += 1
型情報のあるコード
from typing import Iterator
def fib(n: int) -> Iterator[int]:
a, b = 0, 1
i = 0
while i <= n:
yield a
a, b = b, a + b
i += 1
型情報のあるコード
from typing import Iterator
def fib(n: int) -> Iterator[int]:
a, b = 0, 1
i = 0
while i <= n:
yield a
a, b = b, a + b
i += 1
どのようにして型情報を記述するのか
● ざっくり見ていきましょう
○ 変数の型ヒント
○ 関数の型ヒント
○ cast
○ Callable
○ ジェネリクス
○ 直和型
○ Optional
○ Any
○ その他
変数の型ヒント
● 変数名 = 値 # type: 型名
● コメントに型名を記述することで型ヒントとする
● 型名の alias が定義できる
○ 別名 = 型名
関数の型ヒント
● def 関数名(x: 型, y: 型, ...) -> 返り値の型:
● 引数の既定値は x: 型 = 値 のように書く
cast
● cast(キャストする型, 値)
● 値をある型にキャストしていることを示す
○ 実際にはキャストしない
Callable
● Callable[[引数の型のリスト, ...], 返り値の型]
● 呼び出し可能であることを示す
ジェネリクス
● T = TypeVar(‘T’)
● def hoge(val: T) -> T:
● ジェネリックなクラスが作れる
直和型
● Union[A, B, ...]
● A, B, ...のいずれかの型であることを示す
● 複数の型をとりうるが、ジェネリクスほどは自由でないときに使
う
Optional
● Optional(X) = Union[X, None]
● X もしくは None であることを示す
● 失敗するかもしれない操作に使う?
○ それ例外処理でよくない?
Any
● すべての型の親
● auto 型のような感じで使うのかな
● 型ヒント書かなきゃいいじゃん
その他
● List[T]: T型のリスト
● Dict[K, V]: K型をキーとしてV型の要素を格納する辞書型
● Iterable[T]: T型の一連の要素を持つ型
● Container: 何らかのコンテナ
● SupportsInt: int(x) という操作ができる型
実演
まとめ
● Python は言語全体として静的型になるつもりはない
● あくまで各位うまくやってくれ
● mypy を使って型検査していこう
○ まだうまくいってない部分もありそう?
○ ぼくの型の指定がバグってたら許してくれ
● 型理論よく分かってないので戸惑った
ありがとうございました
● 質問など
○ 型のことは型に詳しい人に聞いてくれ
参考
● typing — 型ヒントのサポート
○ http://docs.python.jp/3/library/typing.html
● PEP 484
○ https://www.python.org/dev/peps/pep-0484/
● PEP 3107
○ https://www.python.org/dev/peps/pep-3107/
● mypy で静的型付け Python プログラミング
○ http://t2y.hatenablog.jp/entry/2014/12/22/004525

More Related Content

What's hot

Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
 

What's hot (20)

競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについて
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
ScrapyとPhantomJSを用いたスクレイピングDSL
ScrapyとPhantomJSを用いたスクレイピングDSLScrapyとPhantomJSを用いたスクレイピングDSL
ScrapyとPhantomJSを用いたスクレイピングDSL
 
強化学習@PyData.Tokyo
強化学習@PyData.Tokyo強化学習@PyData.Tokyo
強化学習@PyData.Tokyo
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
線形計画法入門
線形計画法入門線形計画法入門
線形計画法入門
 
Kaggleのテクニック
KaggleのテクニックKaggleのテクニック
Kaggleのテクニック
 
実践イカパケット解析
実践イカパケット解析実践イカパケット解析
実践イカパケット解析
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
とある診断員とSQLインジェクション
とある診断員とSQLインジェクションとある診断員とSQLインジェクション
とある診断員とSQLインジェクション
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
Counterfaual Machine Learning(CFML)のサーベイ
Counterfaual Machine Learning(CFML)のサーベイCounterfaual Machine Learning(CFML)のサーベイ
Counterfaual Machine Learning(CFML)のサーベイ
 

Viewers also liked

Viewers also liked (10)

生活に潤いを与える技術
生活に潤いを与える技術生活に潤いを与える技術
生活に潤いを与える技術
 
Pythonistaデビュー #PyNyumon 2016/5/31
Pythonistaデビュー #PyNyumon 2016/5/31Pythonistaデビュー #PyNyumon 2016/5/31
Pythonistaデビュー #PyNyumon 2016/5/31
 
Startup Science 2017 拡大版(1750page)7/10
Startup Science 2017 拡大版(1750page)7/10Startup Science 2017 拡大版(1750page)7/10
Startup Science 2017 拡大版(1750page)7/10
 
Startup Science 2017 拡大版(1750page)8/10
Startup Science 2017 拡大版(1750page)8/10Startup Science 2017 拡大版(1750page)8/10
Startup Science 2017 拡大版(1750page)8/10
 
Startup Science 2017 拡大版(1750page)5/10
Startup Science 2017 拡大版(1750page)5/10Startup Science 2017 拡大版(1750page)5/10
Startup Science 2017 拡大版(1750page)5/10
 
Startup Science 2017 拡大版(1750page)6/10
Startup Science 2017 拡大版(1750page)6/10Startup Science 2017 拡大版(1750page)6/10
Startup Science 2017 拡大版(1750page)6/10
 
Startup Science 2017 拡大版(1750page)3/10
Startup Science 2017 拡大版(1750page)3/10Startup Science 2017 拡大版(1750page)3/10
Startup Science 2017 拡大版(1750page)3/10
 
Startup Science 2017 拡大版(1750page)4/10
Startup Science 2017 拡大版(1750page)4/10Startup Science 2017 拡大版(1750page)4/10
Startup Science 2017 拡大版(1750page)4/10
 
Startup Science 2017 拡大版(1750page)2/10
Startup Science 2017 拡大版(1750page)2/10Startup Science 2017 拡大版(1750page)2/10
Startup Science 2017 拡大版(1750page)2/10
 
Startup Science 2017 拡大版(1750page)1/10
Startup Science 2017 拡大版(1750page)1/10Startup Science 2017 拡大版(1750page)1/10
Startup Science 2017 拡大版(1750page)1/10
 

静的型付け言語Python