Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
静的型付け言語Python
utagawa kiki
July 14, 2016
Technology
0
130
静的型付け言語Python
KMC例会講座
utagawa kiki
July 14, 2016
Tweet
Share
More Decks by utagawa kiki
See All by utagawa kiki
なんでもPull Requestにする / Kichijoji.pm 31
utgwkk
2
3k
インプットとアウトプットのサイクルを回す暮らし / Kichijoji.pm 29
utgwkk
0
6.3k
prototypeとjust epic. と私 / YAPC::Japan::Online 2022
utgwkk
0
7.2k
GraphQLを使った共同開発の心構え 〜 フロントエンドの視点から / Hatena Engineer Seminar #18
utgwkk
0
6.9k
他言語ユーザから見たPerlのおもしろさ / YAPC::Nagoya::Tiny 2019
utgwkk
1
6.7k
VJに使えそうなコマンドたち、そしてjustifyのご紹介 / YAPC::Nagoya::Tiny 2019 LT
utgwkk
0
5.2k
画像自動保存・閲覧システム「救い」によってもたらされる効能; 死にゆくTwitter Streaming APIへの別れの言葉を添えて / Sukui as a Service
utgwkk
1
2.3k
魑魅魍魎インターネット
utgwkk
0
450
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
utgwkk
0
1.1k
Other Decks in Technology
See All in Technology
エンタープライズ領域でのブロックチェーン・インターオペラビリティの発展 / Enterprise Blockchain Interoperability
gakumura
0
110
Akiba-dot-SaaS-ExtraHop
sakaitakeshi
1
100
OCIコンテナサービス関連の技術詳細 /oke-ocir-details
oracle4engineer
PRO
0
750
Multi-Cloud Gatewayでデータを統治せよ!/ Data Federation with MCG
tutsunom
1
130
インフラ技術基礎勉強会 開催概要
toru_kubota
0
140
Periodic Multi-Agent Path Planning
hziwara
0
110
Media JAWS 2023/1
matsuihidetoshi
1
100
Oktaの管理者権限を適切に移譲してみた
shimosyan
2
240
Virtual Thread - 導入の背景と、効果的な使い方 -
skrb
3
250
ラズパイとGASで加湿器の消し忘れをLINEでリマインド&操作
minako__ph
0
130
ChatGPT for Hacking
anugrahsr
0
220
IoT から見る AWS re:invent 2022 ― AWSのIoTの歴史を添えて/Point of view the AWS re:invent 2022 with IoT - with a history of IoT in AWS
ma2shita
0
210
Featured
See All Featured
5 minutes of I Can Smell Your CMS
philhawksworth
198
18k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
44
14k
Learning to Love Humans: Emotional Interface Design
aarron
263
38k
Building Better People: How to give real-time feedback that sticks.
wjessup
346
17k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
24
4.5k
Making the Leap to Tech Lead
cromwellryan
116
7.6k
Building Applications with DynamoDB
mza
85
4.9k
Support Driven Design
roundedbygravity
88
8.9k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
351
21k
Designing for Performance
lara
600
65k
Fantastic passwords and where to find them - at NoRuKo
philnash
31
1.8k
Debugging Ruby Performance
tmm1
67
11k
Transcript
静的型付け言語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