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