Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
静的型付け言語Python
Slide 2
Slide 2 text
こんにちは ● @utgw (うたがわ) ● 工学部情報学科 計算機科学コース2回生 ● 第39代副広報・root ● Twitter: @utgwkk ● GitHub: @utgw
Slide 3
Slide 3 text
アンケートです ● 動的型付け言語を書いたことがある ● Python を書いたことがある ● 型理論に詳しい
Slide 4
Slide 4 text
前置き ● 型に関する踏み込んだ話はしません(できません) ● あくまで言語機能の紹介としてやっていきます ● Python 3 系の話をします ○ Python 2 系は各位うまくやってくれ ○ https://blog.ymyzk.com/2016/02/python-2-type-hints/ とかに載ってそう
Slide 5
Slide 5 text
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 が導入された
Slide 6
Slide 6 text
動的型付け言語に静的型を導入する試み 1. TypeScript の場合 1.1. TypeScript のコードを書く 1.2. コンパイラが型チェックをする 1.3. JavaScript にコンパイルされる 2. Python + 型ヒントの場合 2.1. Python のコードに型の情報を書く 2.2. 各位うまくやってくれ!!!!!
Slide 7
Slide 7 text
各位うまくやってくれ!!!!! ● 各位うまくやっていきましょう ○ 実行時に型チェックがされるわけではない ○ そもそも言語としては動的型付け言語のまま ○ むやみに互換性を壊したくない ● 型チェックツールを使いましょう ○ mypy を使いましょう ○ そのうち PyCharm とかでも対応しそう
Slide 8
Slide 8 text
動的型付け言語に静的型を導入する試み(修正) 1. TypeScript の場合 1.1. TypeScript のコードを書く 1.2. コンパイラが型チェックをする 1.3. JavaScript にコンパイルされる 2. Python + 型ヒントの場合 2.1. Python のコードに型の情報を書く 2.2. mypy 等で型チェックをする 2.3. よさそうだったら本番投入
Slide 9
Slide 9 text
従来のコード def fib(n): a, b = 0, 1 i = 0 while i <= n: yield a a, b = b, a + b i += 1
Slide 10
Slide 10 text
型情報のあるコード 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
Slide 11
Slide 11 text
型情報のあるコード 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
Slide 12
Slide 12 text
どのようにして型情報を記述するのか ● ざっくり見ていきましょう ○ 変数の型ヒント ○ 関数の型ヒント ○ cast ○ Callable ○ ジェネリクス ○ 直和型 ○ Optional ○ Any ○ その他
Slide 13
Slide 13 text
変数の型ヒント ● 変数名 = 値 # type: 型名 ● コメントに型名を記述することで型ヒントとする ● 型名の alias が定義できる ○ 別名 = 型名
Slide 14
Slide 14 text
関数の型ヒント ● def 関数名(x: 型, y: 型, ...) -> 返り値の型: ● 引数の既定値は x: 型 = 値 のように書く
Slide 15
Slide 15 text
cast ● cast(キャストする型, 値) ● 値をある型にキャストしていることを示す ○ 実際にはキャストしない
Slide 16
Slide 16 text
Callable ● Callable[[引数の型のリスト, ...], 返り値の型] ● 呼び出し可能であることを示す
Slide 17
Slide 17 text
ジェネリクス ● T = TypeVar(‘T’) ● def hoge(val: T) -> T: ● ジェネリックなクラスが作れる
Slide 18
Slide 18 text
直和型 ● Union[A, B, ...] ● A, B, ...のいずれかの型であることを示す ● 複数の型をとりうるが、ジェネリクスほどは自由でないときに使 う
Slide 19
Slide 19 text
Optional ● Optional(X) = Union[X, None] ● X もしくは None であることを示す ● 失敗するかもしれない操作に使う? ○ それ例外処理でよくない?
Slide 20
Slide 20 text
Any ● すべての型の親 ● auto 型のような感じで使うのかな ● 型ヒント書かなきゃいいじゃん
Slide 21
Slide 21 text
その他 ● List[T]: T型のリスト ● Dict[K, V]: K型をキーとしてV型の要素を格納する辞書型 ● Iterable[T]: T型の一連の要素を持つ型 ● Container: 何らかのコンテナ ● SupportsInt: int(x) という操作ができる型
Slide 22
Slide 22 text
実演
Slide 23
Slide 23 text
まとめ ● Python は言語全体として静的型になるつもりはない ● あくまで各位うまくやってくれ ● mypy を使って型検査していこう ○ まだうまくいってない部分もありそう? ○ ぼくの型の指定がバグってたら許してくれ ● 型理論よく分かってないので戸惑った
Slide 24
Slide 24 text
ありがとうございました ● 質問など ○ 型のことは型に詳しい人に聞いてくれ
Slide 25
Slide 25 text
参考 ● 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