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
29k
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
コスト管理から向き合う技術的負債 / Accounting for Technical Debt Through Cost Management
yamitzky
0
3
Utility-first な CSS-in-JS 〜Tailwind CSS と Chakra UI を添えて〜 / Utility-First CSS-in-JS
yamitzky
5
1.3k
今から始める型安全 Python / Start Python Type Hints
yamitzky
13
4.7k
技術が好きで好きで好きでたまらないエンジニアが「取締役」になって思う、マネジメントキャリアパス / My Manager's Path
yamitzky
2
960
なぜサーバーレスとDockerなのか 〜 インフラ運用を最小化するサービス開発 〜 / Why We Choose Serverless AND Docker
yamitzky
0
3.9k
サーバーレスを活用して少数精鋭で開発するニュースアプリ #devsumi
yamitzky
4
2.8k
ここが辛いよサーバーレス だが私は乗り越えた #builderscon
yamitzky
14
7.7k
会社の開発合宿で Electron-vueで Slackクライアント作ってみた
yamitzky
0
2.6k
GitLabのSlack連携を魔改造して作る開発を楽しくする仕組み
yamitzky
1
2.5k
Featured
See All Featured
The Cult of Friendly URLs
andyhume
78
6.1k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Become a Pro
speakerdeck
PRO
26
5k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
The Cost Of JavaScript in 2023
addyosmani
45
7k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
170
What's in a price? How to price your products and services
michaelherold
243
12k
Thoughts on Productivity
jonyablonski
67
4.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
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!