Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Python 3.9 時代の型安全な Pythonの極め方 / Mastering Type...
Search
Mitsuki Ogasahara
August 28, 2020
35
28k
Python 3.9 時代の型安全な Pythonの極め方 / Mastering Type Safety in Python 3.9 Era
PyCon JP 2020 の「Python 3.9 時代の型安全な Python の極め方」の発表資料です
Mitsuki Ogasahara
August 28, 2020
Tweet
Share
More Decks by Mitsuki Ogasahara
See All by Mitsuki Ogasahara
Utility-first な CSS-in-JS 〜Tailwind CSS と Chakra UI を添えて〜 / Utility-First CSS-in-JS
yamitzky
5
1.2k
今から始める型安全 Python / Start Python Type Hints
yamitzky
13
4.7k
技術が好きで好きで好きでたまらないエンジニアが「取締役」になって思う、マネジメントキャリアパス / My Manager's Path
yamitzky
2
930
なぜサーバーレスとDockerなのか 〜 インフラ運用を最小化するサービス開発 〜 / Why We Choose Serverless AND Docker
yamitzky
0
3.8k
サーバーレスを活用して少数精鋭で開発するニュースアプリ #devsumi
yamitzky
4
2.8k
ここが辛いよサーバーレス だが私は乗り越えた #builderscon
yamitzky
14
7.6k
会社の開発合宿で Electron-vueで Slackクライアント作ってみた
yamitzky
0
2.6k
GitLabのSlack連携を魔改造して作る開発を楽しくする仕組み
yamitzky
1
2.4k
Dockerfileを素早く書くtips&ライブデモ
yamitzky
2
1.8k
Featured
See All Featured
Speed Design
sergeychernyshev
18
400
Intergalactic Javascript Robots from Outer Space
tanoku
268
26k
A Philosophy of Restraint
colly
202
16k
What's in a price? How to price your products and services
michaelherold
241
11k
Building Better People: How to give real-time feedback that sticks.
wjessup
359
18k
Fashionably flexible responsive web design (full day workshop)
malarkey
400
65k
Automating Front-end Workflow
addyosmani
1365
200k
RailsConf 2023
tenderlove
26
790
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
157
15k
Product Roadmaps are Hard
iamctodd
PRO
48
10k
GraphQLの誤解/rethinking-graphql
sonatard
65
9.7k
How to name files
jennybc
75
97k
Transcript
1ZUIPO࣌ͷ ܕ҆શͳ1ZUIPOͷۃΊํ খּݪΈ͖ͭ!ZBNJU[LZ
1ZUIPO࣌ͷ ܕ҆શͳ1ZUIPOͷۃΊํ খּݪΈ͖ͭ!ZBNJU[LZ 3.10
Agenda ಋೖ جຊฤܕώϯτͷ֓ཁͱجຊจ๏ Ԡ༻ฤ ܕνΣοΫ
ߴͳܕͰϞσϦϯά ϥϯλΠϜͷܕώϯτ ·ͱΊ
2ීஈɺ1ZUIPOͰܕॻ͖·͔͢ʁ 1. ࠓͷඪ ˡʮܕॻ͖͍ͨʯ ˡʮ͜ΕͬͯΈΑ͏ʯ ^ ˡʮΒΜ͔ͬͨʯ
ɾ3.8 ࣌ʹग़൪͕ͳ͍ͷ ɾܧঝͷෳࡶͳ NSPͱ͔ ɾจ๏*͚ͩ* ͞ͳ͍͜ͱ 1. ࠓͷඪ
1. ͓લɺ୭Αʁ w খּݪޫو!ZBNJU[LZ w +9௨৴ࣾऔక$%0 w ͖ͳٕज़ 5ZQF4DSJQUɺ1ZUIPO ʙ
αʔόʔϨεɺ(SBQI2-FUDʜ ˞54ϩΰ$$#:.JDSPTPGU
1. JX௨৴ࣾʹ͍ͭͯ w ʮࠓى͖͍ͯΔ͜ͱΛ໌Β͔ʹ͢Δʯ ใಓςΫϊϩδʔϕϯνϟʔ w 1Z$PO+14JMWFS4QPOTPS w ͪΖΜʮܕʯॻ͍ͯ·͢
Python ͷνʔϜ։ൃ େنͳ Python ϓϩδΣΫτ ෆຬ͕͋Γ·ͤΜ͔ʁ 1. Python ͷෆຬ
1. Python ͷෆຬ
˞ฐࣾϓϩδΣΫτʹ͋Γ·ͨ͠ 1. Python ͷෆຬ
1. Python ͷෆຬ ΤσΟλͷิ
"1*௨৴Ͱฦͬͯ͘Δ༰͕Α͘Θ͔Βͳ͍ 1. Python ͷෆຬ
ಈతܕ͖ݴޠͷෆຬ ʮܕʯͰղܾͰ͖·͢ 1. Python ͷෆຬ
1ZUIPOͷܕͷ֓ཁͱجຊจ๏ جຊฤ 02
ɾਖ਼໊ࣜশʮ5ZQF)JOU ܕώϯτ ʯ ɾ1&1Ͱ1ZUIPO ʙ ͔Βೖͬͨจ๏ ɾత੩తղੳɺϦϑΝΫλϦϯάɺίʔυੜͳͲ ɾ1ZUIPO͕੩తܕ͖ݴޠʹͳͬͨΘ͚Ͱͳ͘ɺ ɹҙɾޙ͚ͷܕγεςϜ 1ZUIPOͷܕͬͯͳΜͩΖ͏
2. ʮܕʯͷ֓ཁ ˞͜ͷεϥΠυͰʮܕʯͱݴٴ͢Δࡍʮܕώϯτʯͷ͜ͱΛݴ͍·͢
2. ʮܕʯͷ֓ཁ ੩తղੳ ϦϑΝΫλϦϯά
1ZUIPOʮ੩తܕ͖ݴޠʯͰͳ͍ 2. ʮܕʯͷ֓ཁ 2͜ͷίʔυ࣮ߦ࣌ΤϥʔʹͳΔʁ 2ܕͷใTUSʁJOUʁ
1ZUIPOʮ੩తܕ͖ݴޠʯͰͳ͍ 2. ʮܕʯͷ֓ཁ "࣮ߦ࣌ʹΤϥʔൃੜ͠ͳ͍ αʔυύʔςΟʔͷπʔϧΛΈ߹Θͤͯ׆༻ "UZQF ͷΓͱͯ͠ܕώϯτແؔ
ΤσΟλ ิͳͲ 1ZUIPOͷʮܕʯΛ औΓר͘αʔυύʔςΟʔ 2. ʮܕʯͷ֓ཁ mypy pyright pytype VSCode
PyCharm Vim pydantic FastAPI ੩తղੳ ࣮ߦ࣌ͷόϦσʔγϣϯͳͲ ࢀߟIUUQTHJUIVCDPNUZQFEEKBOHPBXFTPNFQZUIPOUZQJOH
ɾਖ਼໊ࣜʮ5ZQF)JOUʯΛհ ɾ1ZUIPOಈతܕ͖ݴޠͰ͋Γɺܕώ ϯτڧ੍͞Εͳ͍ ɾ1ZUIPOࣗମܕνΣοΫΛߦΘͳ͍ɻ SEQBSUZπʔϧΛΈ߹ΘͤΔ ͜͜·Ͱͷ·ͱΊ 2. ʮܕʯͷ֓ཁ
ม 2. ܕώϯτͷจ๏ม
ؔ 2. ܕώϯτͷจ๏ؔ
Ҿ͚ͩॻ͍ͯ0, 2. ܕώϯτͷจ๏ؔ Γ͚ͩॻ͍ͯ0,
࣍ͷίʔυΛܕνΣοΫπʔϧͰղੳ͢Δͱʜʁ &YFSDJTF 2. ܕώϯτͷจ๏ ͪΖΜ0,
࣍ͷίʔυΛܕνΣοΫπʔϧͰղੳ͢Δͱʜʁ &YFSDJTF 2. ܕώϯτͷจ๏ ͪΖΜ/(
2. ܕώϯτͷจ๏ ʮܕʯͷΤϥʔ ઢͰදݱ͠·͢ ddddd
DMBTT 2. ܕώϯτͷจ๏DMBTT ˡϓϩύςΟͷఆٛ ˡϝιουఆٛ ˡมͷܕͱͯ͠ར༻
ܧঝͷѻ͍ 2. ܕώϯτͷจ๏DMBTT ˣੜΫϥεجఈΫϥεʹೖͰ͖Δ ˣܧঝͯ͠ͳ͍ͱͪΖΜμϝ
ϓϩύςΟͷܕ͕Θ͔Βͳ͍ͱ͖ 2. ܕώϯτͷจ๏"OZ ˡϓϩύςΟͷఆٛ ˡϝιουఆٛ
҉తͳ"OZ 2. ܕώϯτͷจ๏"OZ ˡϓϩύςΟͷఆٛ ˡϝιουఆٛ ˺
MJTU EJDU TFU 2. ܕώϯτͷจ๏σʔλߏ
2. ܕώϯτͷจ๏·Ͱͷσʔλߏ ʙ1ZUIPO ˞ݱࡏ3$൛Ͱਖ਼ࣜϦϦʔε༧ఆ 1ZUIPOʙ
-JTU<5>ͳͲͷ<>ͷ෦Λ൚༻తʹ͢Δ (FOFSJDT ˞ࠓհ͠·ͤΜ 2. ࣗͰσʔλߏΛ࡞Γ͍ͨͱ͖
/POF͕ೖΔ͔͠Εͳ͍ม l͵ΔΆzࢭ ˡ/POF͡Όͳ͍͜ͱΛ͔֬ΊΔͱ ҆શʹ͑Δ ˡ/POFͷՄೳੑͷࢦఠ 2. ܕώϯτͷจ๏0QUJPOBM
0QUJPOBM<6TFS>ʹ/POF·ͨ6TFS 2. ܕώϯτͷจ๏6OJPO ʹ ࣈʹJOU·ͨqPBU
2. ܕώϯτͷจ๏6OJPO 1ZUIPO ʙ1ZUIPO ˞དྷ ϦϦʔε༧ఆ
ɾมɺؔ ɾDMBTTɺܧঝ ɾMJTUɺEJDUɺTFU ɾ0QUJPOBM ɾ6OJPO ɾ"OZ ͜͜·Ͱͷ·ͱΊ 2. ܕώϯτجຊฤ·ͱΊ
ͳͥʮܕʯΛۃΊΔͷ͔ʁ Ԡ༻ฤ 03
ɾҙਤ͠ͳ͍࣮ߦ࣌ΤϥʔΛࣄલʹ͛Δ ɾ͞Βʹܕ҆શʹͨ͠Γɺਖ਼͘͠ϞσϦϯάͰ͖Δ ɾϓϩάϥϜΛ%3:ʹͰ͖Δ ʮܕʯΛۃΊΔͱԿ͕Ͱ͖Δͷ͔ʁ 3. ܕώϯτԠ༻ฤ
PythonϓϩάϥϜΛܕ҆શʹͯ͠ΈΑ͏ Ԡ༻ฤ 03
ɾ1ZUIPO੩తܕ͖ݴޠͰͳ͍ ɾ1ZUIPOࣗମܕνΣοΫΛ͠ͳ͍ ˠπʔϧʮNZQZʯͰܕνΣοΫ 1ZUIPOͷܕώϯτͷݪଇ 3-1. ܕνΣοΫ
ɾ1ZUIPOͷ੩తͳܕνΣοΫΛ͢Δπʔϧ ɾ(JU)VCͷQZUIPONZQZʹ͋Γɺ ɹ(VJEPίΞνʔϜϝϯόʔ ɾ$-*ͱͯ͑͠Δ͠ɺ74$PEF 1Z$IBSNͱ࿈ܞ NZQZ 3-1. mypy
3-1. mypy
NZQZͷ͍ํ 3-1. mypy QJQJOTUBMMNZQZͯ͠ NZQZ<σΟϨΫτϦ·ͨϑΝΠϧ໊QZ>
(JU-BC$*ͷྫ 3-1. mypy ΞοϓσʔτͰಥવݡ͘ͳͬͯ ಥવ$*͕௨Βͳ͘ͳΔͷͰ όʔδϣϯݻఆΛڧ͘ਪ
ϥΠϒϥϦʹܕ͕ͳ͍ͱΤϥʔʹͳΔ 3-1. mypy ͷͭΒ͍ͱ͜Ζ ༁lCPUPzʹܕώϯτͳ͍Α ˞ܕώϯτͷͳ͍ϥΠϒϥϦ݁ߏଟ͍
ɾελϒΛੜ͢Δॻ͘ ɾελϒύοέʔδΛΠϯετʔϧ͢Δ࡞Δ Ͳ͏͢Δʁ 3-1. ܕώϯτͷͳ͍ϥΠϒϥϦ
ɾϓϩάϥϜϥΠϒϥϦʹ֎͚ͷܕఆٛ ɾ QZJͱ͍͏໊લͰɺܕͷఆ͚ٛͩهࡌ ɾୈࡾऀ͕࡞ͬͯύοέʔδԽͰ͖Δ TUVCͱ 3-1. ελϒΛॻ͘ ˞5ZQF4DSJQUͷʮEUTʯʮ!UZQFT ʯ
TUVCͷྫ 3-1. ελϒΛॻ͘ IPHFQZ IPHFQZJ ܕͷͳ͍ϓϩάϥϜ ରԠ͢Δελϒ
ɾNZQZͱҰॹʹ͍ͭͯ͘Δࣗಈੜπʔϧ ɾTUVCHFO<σΟϨΫτϦPSϑΝΠϧ໊> TUVCHFO 3-1. ελϒͷࣗಈੜ
ɾTUVCHFON<Ϟδϡʔϧ>Ͱ֎෦ϥΠϒϥϦ ɾશͰͳ͍ͷͰɺखಈमਖ਼͓͢͢Ί TUVCHFO 3-1. ελϒΛॻ͘(ࣗಈੜ) ུ ˞࣮ࡍɺߦΛআ͠ͳ͍ͱNZQZಈ͔ͳ͍
ɾ࡞ͬͨελϒQZQJύοέʔδʹͰ͖Δ ɾ044ͱͯ͠ୈࡾऀʹΑͬͯެ։͞Ε͍ͯΔ ɾྫ CPUPTUVCTɺEKBOHPTUVCTɺFUDʜ QJQJOTUBMM TUVCT 3-1. ελϒύοέʔδͷΠϯετʔϧ ˞ৄࡉ1&1
ɾελϒΛੜ͢Δॻ͘ ɾελϒύοέʔδΛΠϯετʔϧ͢Δ࡞Δ ɾఘΊΔ Ͳ͏͢Δʁ 3-1. ܕώϯτͷͳ͍ϥΠϒϥϦ
ɾJHOPSFNJTTJOHJNQPSUTΛࢦఆ͢Δ ɾJNQPSUʹUZQFJHOPSFͷίϝϯτΛ͚ͭΔ ɾ࣮ࡍʹؔͳͲͰϥοϓͯ͠"OZͷൣғΛ ɹ͛ͳ͍ͷ͕େࣄ ͱ͖ʹɺ͖͋ΒΊ͕؊৺ 3-1. ϥΠϒϥϦͷܕΛఘΊΔ
ɾNJDSPTPGUQZSJHIU ɾHPPHMFQZUZQF ɾGBDFCPPLQZSF NZQZҎ֎ʹ݁ߏ͋Δ 3-1. mypy Ҏ֎ͷܕνΣοΧʔ
3-1. ܕνΣοΧʔͷൺֱ(Ұྫ) NZQZ QZSJHIUQZUZQF QZSF ˞ઃఆͰݫ͘͠ʗ؇͘Ͱ͖Δ Γͷํਪ SFUVSO࿙ΕΔͱΤϥʔ ϓϩύςΟͷॳظԽνΣοΫ
˞ҾɺΓɺΫϥεϓϩύςΟͷܕॻ͘ͷ͕͓͢͢Ί ܕਪ͞ΕΔͷͰ ܕώϯτΛॻ͔ͳͯ͘ Ұ෦ ܕ҆શʹ 3-1. ܕਪ ddddddddddddd
ͬͱܕ҆શͰɺͬͱྑ͍ϞσϦϯάΛ͠Α͏ Ԡ༻ฤ 03
TypedDict Protocol NewType Literal ܕώϯτͷެࣜػೳͷհ 3-2. Advanced Type Hinting
Ϣʔεέʔεᶃ ʮ"1*ͷϨεϙϯεΛܕఆ͍ٛͨ͠ʯ 3-2. ܕ҆શͳ dict
%JDUͷ··Ҿ͖ճ͢ͱى͜Δ͜ͱ 3-2. ܕ҆શͳ dict ˠ,FZ&SSPSΛܕνΣοΫ͍ͨ͠
5ZQFE%JDU 3-2. ܕ҆શͳ dict ˞ͰΞΫηεͰ͖ͳ͍ʹDMBTTʹ٧Ίସ͑ͨ΄͏͕ྑ͍߹
Ϣʔεέʔεᶄ நʹґଘ͢Δઃܭʹ͍ͨ͠ 3-2. நʹґଘͨ͠ઃܭ ˡదͳܕʁ
Α͘ͳ͍ྫ 3-2. நʹґଘͨ͠ઃܭ நʹґଘͨ͠ྫ
ྫʮநΫϥεʯΛ͔ͭ͏ நతͳʮ#JSEʯΛఆٛͯ͠ΈΑ͏ 3-2. நʹґଘͨ͠ઃܭ
ܕ҆શʹͳ͕ͬͨʜ 3-2. நΫϥεͷ ܧঝʹϥϯλΠϜͷڍಈมԽ͕ඞཁ ಈతܕ͖ݴޠͷॊೈੑ͕ࣦΘΕɺ1ZUIPOJDͰͳ͍ நΫϥε൛ ݩͷόʔδϣϯ
໊લత෦ܕ ʮDMBTTΛܧঝ͍ͯ͠Δ͔ʯ நΫϥε 3-2. Protocol ʹΑΔநԽ ߏత෦ܕ ʮඞཁͳϝιουΛ͍࣋ͬͯΔ͔ʯ 1SPUPDPM
3-2. Protocol ʹΑΔநԽ ܕ҆શ͔ͭ%VDLͷڍಈ͕มΘΒͳ͍ 1SPUPDPM
Ϣʔεέʔεᶅ -JTU4FUͳͲʮJOʯͰ͖ΔͷΛ ड͚औΓ͍ͨ 3-2. Protocol ͦͷ̎
ެࣜͰ1SPUPDPM͕ఆٛ͞Ε͍ͯΔ 3-2. ఆٛࡁΈͷ Protocol ˞$POUBJOFSʹ@@DPOUBJOT@@͕͋ΔϞϊ
ͦͷଞͷެࣜ1SPUPDPM 3-2. ఆٛࡁΈͷ Protocol IUUQTEPDTQZUIPOPSHKBMJCSBSZDPMMFDUJPOTBCDIUNM ˞ඞͣ͠1SPUPDPMΛܧঝ͍ͯ͠ͳ͍
$BMMBCMF 3-2. ఆٛࡁΈͷ Protocol *UFSBCMF ؔͬΆ͍ͷ @@DBMM@@ GPSJOͰ͖Δͷ @@JUFS@@ 4FRVFODF
ഁյతมߋͰ͖ͳ͍MJTU ʢࢀߟ 1SPUPDPMΛ׆༻ͨ͠*NNVUBCMFͳσʔλߏʹ͍ͭͯ IUUQTZBNJU[LZIBUFOBCMPHDPNFOUSZ
Ϣʔεέʔεᶆ JOUTUSʹʮҙຯʯΛ͍࣋ͨͤͨ 3-2. ಛघͳϓϦϛςΟϒܕ
/FX5ZQF 3-2. ಛघͳϓϦϛςΟϒܕ ΩϦ͕ͳ͍ͷͰɺ*%ͳͲฆΒΘ͍͠Ұ෦ͷܕ͚ͩਪ
-JUFSBM 3-2. Ϧςϥϧܕ
ɾ5ZQFE%JDU ɾ1SPUPDPM ɾ*UFSBCMFͳͲͷެࣜ1SPUPDPM ɾ/FX5ZQFɺ-JUFSBM հͨ͠ͷ 3-2. ͬͱܕ҆શͳϞσϦϯά
ϥϯλΠϜΛͬͱศརʹ͢Δ Ԡ༻ฤ 03
ࠓ·Ͱɿ੩తͳܕνΣοΫͷ 3-3. ܕώϯτͱϥϯλΠϜ ࣮ߦ࣌ ϥϯλΠϜ ʹ ܕͷใऔಘͰ͖Δ
3-3. ࣮ߦ࣌ͷܕͷใऔಘ ͜ΜͳϓϩάϥϜΛॻ͍࣮ͯߦͯ͠ΈΔ {'name': <class 'str'>, 'age': <class 'int'>} ࣮ߦ࣌ʹ@@BOOPUBUJPOT@@ʹ֨ೲ͞ΕͨܕͷใΛ׆༻Ͱ͖Δʂ
˞HFU@UZQF@IJOUT ͬͨ΄͏͕ྑ͍Ͱ͢
ྫ EJDUͷม 3-3. __annotations__ ͷ׆༻ྫ
ྫ EBUBDMBTT 3-3. ඪ४ϥΠϒϥϦͷ׆༻ྫ !EBUBDMBTTσίϨʔλʔΛ͔ͭ͏ͱ ࣮ߦ࣌ʹ@@JOJU@@ΛࣗಈͰఆٛͯ͘͠ΕΔ
˺EBUBDMBTTʴόϦσʔγϣϯʴγϦΞϥΠζ ྫ QZEBOUJD 3-3. ϥϯλΠϜόϦσʔγϣϯ
ྫ 'BTU"1* 3-3. API ͷόϦσʔγϣϯ ܕώϯτ͖ͷؔΛఆ͍͚ٛͯͩ͘͠Ͱɺ όϦσʔγϣϯ͖ͭͷ"1*͕Ͱ͖Δ
ܕώϯτ͔Β4XBHHFS 0QFO"1* ࣗಈੜ 3-3. FastAPI ˞ଞݴޠͰΘΕΔ"1*༷ɻ"1*ͷܕ͕ఆٛͰ͖Δ
ɾ@@BOOPUBUJPOT@@ʹܕͷใؚ͕·ΕΔ ɾσίϨʔλʔɺϝλΫϥεͱΈ߹ΘͤΔͱ%3:ʹ ɾܕͷಈతνΣοΫɺ"1*ͷόϦσʔγϣϯɺ4XBHHFS ఆٛͳͲͰ͖Δ ϥϯλΠϜͰͷܕώϯτΛհ 3-3. ·ͱΊ
·ͱΊ 04
ܕώϯτΛॻ͘ͱ/POF ܕͷϛεΛνΣοΫͰ͖Δ 4. ·ͱΊ
NZQZQZSJHIUͰܕνΣοΫ Ұ෦ਪ͞ΕΔʹॻ͍ͯͳ͍ͷʹܕ҆શ 4. ·ͱΊ ddddddddddddd
1SPUPDPM5ZQFE%JDUͰ ʮܧঝʯʹറΒΕͳ͍ܕ҆શ 4. ·ͱΊ
ʮܕʯΛॻ͚ͩ͘ͰϥϯλΠϜ͕ศརʹ 4. ·ͱΊ
࣌ɺ ͳͥಈతܕ͖ݴޠͷ1ZUIPOͰ ʮܕʯΛۃΊΔͷ͔ʁ 4. ·ͱΊ
1ZUIPOͷܕώϯτΛۃΊΔͱ ಈతܕ͖ݴޠͷྑ͞Λଛͳ͏͜ͱͳ͘ ҆શͰ1ZUIPOJDͳϓϩάϥϜΛ ੜ࢈ੑߴ͘ॻ͚Δ͔Β 4. ·ͱΊ ˞ҰҙݟͰ͢ɻօ༷ͷҙݟΛฉ͔͍ͤͯͩ͘͞
Thank you!