PyCon JP 2020 の「Python 3.9 時代の型安全な Python の極め方」の発表資料です
1ZUIPO࣌ͷܕ҆શͳ1ZUIPOͷۃΊํখּݪΈ͖ͭ!ZBNJU[LZ
View Slide
1ZUIPO࣌ͷܕ҆શͳ1ZUIPOͷۃΊํখּݪΈ͖ͭ!ZBNJU[LZ3.10
Agenda ಋೖ جຊฤܕώϯτͷ֓ཁͱجຊจ๏ Ԡ༻ฤ ܕνΣοΫ ߴͳܕͰϞσϦϯά ϥϯλΠϜͷܕώϯτ ·ͱΊ
2ීஈɺ1ZUIPOͰܕॻ͖·͔͢ʁ1. ࠓͷඪˡʮܕॻ͖͍ͨʯˡʮ͜ΕͬͯΈΑ͏ʯ^ˡʮΒΜ͔ͬͨʯ
ɾ3.8 ࣌ʹग़൪͕ͳ͍ͷɾܧঝͷෳࡶͳ NSPͱ͔ɾจ๏*͚ͩ*͞ͳ͍͜ͱ1. ࠓͷඪ
1. ͓લɺ୭Αʁw খּݪޫو!ZBNJU[LZw +9௨৴ࣾऔక$%0w ͖ͳٕज़5ZQF4DSJQUɺ1ZUIPO ʙαʔόʔϨεɺ(SBQI2-FUDʜ˞54ϩΰ$$#:.JDSPTPGU
1. JX௨৴ࣾʹ͍ͭͯw ʮࠓى͖͍ͯΔ͜ͱΛ໌Β͔ʹ͢ΔʯใಓςΫϊϩδʔϕϯνϟʔw 1Z$PO+14JMWFS4QPOTPSw ͪΖΜʮܕʯॻ͍ͯ·͢
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. ʮܕʯͷ֓ཁmypypyrightpytypeVSCodePyCharmVimpydanticFastAPI੩తղੳ࣮ߦ࣌ͷόϦσʔγϣϯͳͲࢀߟIUUQTHJUIVCDPNUZQFEEKBOHPBXFTPNFQZUIPOUZQJOH
ɾਖ਼໊ࣜʮ5ZQF)JOUʯΛհɾ1ZUIPOಈతܕ͖ݴޠͰ͋Γɺܕώϯτڧ੍͞Εͳ͍ɾ1ZUIPOࣗମܕνΣοΫΛߦΘͳ͍ɻSEQBSUZπʔϧΛΈ߹ΘͤΔ͜͜·Ͱͷ·ͱΊ2. ʮܕʯͷ֓ཁ
ม2. ܕώϯτͷจ๏ม
ؔ2. ܕώϯτͷจ๏ؔ
Ҿ͚ͩॻ͍ͯ0,2. ܕώϯτͷจ๏ؔΓ͚ͩॻ͍ͯ0,
࣍ͷίʔυΛܕνΣοΫπʔϧͰղੳ͢Δͱʜʁ&YFSDJTF2. ܕώϯτͷจ๏ͪΖΜ0,
࣍ͷίʔυΛܕνΣοΫπʔϧͰղੳ͢Δͱʜʁ&YFSDJTF2. ܕώϯτͷจ๏ͪΖΜ/(
2. ܕώϯτͷจ๏ʮܕʯͷΤϥʔઢͰදݱ͠·͢ddddd
DMBTT2. ܕώϯτͷจ๏DMBTTˡϓϩύςΟͷఆٛˡϝιουఆٛˡมͷܕͱͯ͠ར༻
ܧঝͷѻ͍2. ܕώϯτͷจ๏DMBTTˣੜΫϥεجఈΫϥεʹೖͰ͖Δˣܧঝͯ͠ͳ͍ͱͪΖΜμϝ
ϓϩύςΟͷܕ͕Θ͔Βͳ͍ͱ͖2. ܕώϯτͷจ๏"OZˡϓϩύςΟͷఆٛˡϝιουఆٛ
҉తͳ"OZ2. ܕώϯτͷจ๏"OZˡϓϩύςΟͷఆٛˡϝιουఆٛ˺
MJTU EJDU TFU2. ܕώϯτͷจ๏σʔλߏ
2. ܕώϯτͷจ๏·Ͱͷσʔλߏʙ1ZUIPO˞ݱࡏ3$൛Ͱਖ਼ࣜϦϦʔε༧ఆ1ZUIPOʙ
-JTU<5>ͳͲͷ<>ͷ෦Λ൚༻తʹ͢Δ(FOFSJDT ˞ࠓհ͠·ͤΜ2. ࣗͰσʔλߏΛ࡞Γ͍ͨͱ͖
/POF͕ೖΔ͔͠Εͳ͍ม l͵ΔΆzࢭˡ/POF͡Όͳ͍͜ͱΛ͔֬ΊΔͱ҆શʹ͑Δˡ/POFͷՄೳੑͷࢦఠ2. ܕώϯτͷจ๏0QUJPOBM
0QUJPOBM<6TFS>ʹ/POF·ͨ6TFS2. ܕώϯτͷจ๏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$PEF1Z$IBSNͱ࿈ܞNZQZ3-1. mypy
3-1. mypy
NZQZͷ͍ํ3-1. mypyQJQJOTUBMMNZQZͯ͠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ϑΝΠϧ໊>TUVCHFO3-1. ελϒͷࣗಈੜ
ɾTUVCHFON<Ϟδϡʔϧ>Ͱ֎෦ϥΠϒϥϦɾશͰͳ͍ͷͰɺखಈमਖ਼͓͢͢ΊTUVCHFO3-1. ελϒΛॻ͘(ࣗಈੜ)ུ˞࣮ࡍɺߦΛআ͠ͳ͍ͱNZQZಈ͔ͳ͍
ɾ࡞ͬͨελϒQZQJύοέʔδʹͰ͖Δɾ044ͱͯ͠ୈࡾऀʹΑͬͯެ։͞Ε͍ͯΔɾྫCPUPTUVCTɺEKBOHPTUVCTɺFUDʜQJQJOTUBMMTUVCT3-1. ελϒύοέʔδͷΠϯετʔϧ˞ৄࡉ1&1
ɾελϒΛੜ͢Δॻ͘ɾελϒύοέʔδΛΠϯετʔϧ͢Δ࡞ΔɾఘΊΔͲ͏͢Δʁ3-1. ܕώϯτͷͳ͍ϥΠϒϥϦ
ɾJHOPSFNJTTJOHJNQPSUTΛࢦఆ͢ΔɾJNQPSUʹUZQFJHOPSFͷίϝϯτΛ͚ͭΔɾ࣮ࡍʹؔͳͲͰϥοϓͯ͠"OZͷൣғΛɹ͛ͳ͍ͷ͕େࣄͱ͖ʹɺ͖͋ΒΊ͕؊৺3-1. ϥΠϒϥϦͷܕΛఘΊΔ
ɾNJDSPTPGUQZSJHIUɾHPPHMFQZUZQFɾGBDFCPPLQZSFNZQZҎ֎ʹ݁ߏ͋Δ3-1. mypy Ҏ֎ͷܕνΣοΧʔ
3-1. ܕνΣοΧʔͷൺֱ(Ұྫ)NZQZ QZSJHIUQZUZQF QZSF˞ઃఆͰݫ͘͠ʗ؇͘Ͱ͖ΔΓͷํਪSFUVSO࿙ΕΔͱΤϥʔ ϓϩύςΟͷॳظԽνΣοΫ
˞ҾɺΓɺΫϥεϓϩύςΟͷܕॻ͘ͷ͕͓͢͢Ίܕਪ͞ΕΔͷͰܕώϯτΛॻ͔ͳͯ͘ Ұ෦ܕ҆શʹ3-1. ܕਪddddddddddddd
ͬͱܕ҆શͰɺͬͱྑ͍ϞσϦϯάΛ͠Α͏Ԡ༻ฤ03
TypedDictProtocolNewTypeLiteralܕώϯτͷެࣜػೳͷհ3-2. Advanced Type Hinting
Ϣʔεέʔεᶃʮ"1*ͷϨεϙϯεΛܕఆ͍ٛͨ͠ʯ3-2. ܕ҆શͳ dict
%JDUͷ··Ҿ͖ճ͢ͱى͜Δ͜ͱ3-2. ܕ҆શͳ dictˠ,FZ&SSPSΛܕνΣοΫ͍ͨ͠
5ZQFE%JDU3-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@@͕͋ΔϞϊ
ͦͷଞͷެࣜ1SPUPDPM3-2. ఆٛࡁΈͷ ProtocolIUUQTEPDTQZUIPOPSHKBMJCSBSZDPMMFDUJPOTBCDIUNM˞ඞͣ͠1SPUPDPMΛܧঝ͍ͯ͠ͳ͍
$BMMBCMF3-2. ఆٛࡁΈͷ Protocol*UFSBCMFؔͬΆ͍ͷ @@DBMM@@ GPSJOͰ͖Δͷ @@JUFS@@4FRVFODFഁյతมߋͰ͖ͳ͍MJTUʢࢀߟ1SPUPDPMΛ׆༻ͨ͠*NNVUBCMFͳσʔλߏʹ͍ͭͯIUUQTZBNJU[LZIBUFOBCMPHDPNFOUSZ
ϢʔεέʔεᶆJOUTUSʹʮҙຯʯΛ͍࣋ͨͤͨ3-2. ಛघͳϓϦϛςΟϒܕ
/FX5ZQF3-2. ಛघͳϓϦϛςΟϒܕΩϦ͕ͳ͍ͷͰɺ*%ͳͲฆΒΘ͍͠Ұ෦ͷܕ͚ͩਪ
-JUFSBM3-2. Ϧςϥϧܕ
ɾ5ZQFE%JDUɾ1SPUPDPMɾ*UFSBCMFͳͲͷެࣜ1SPUPDPMɾ/FX5ZQFɺ-JUFSBMհͨ͠ͷ3-2. ͬͱܕ҆શͳϞσϦϯά
ϥϯλΠϜΛͬͱศརʹ͢ΔԠ༻ฤ03
ࠓ·Ͱɿ੩తͳܕνΣοΫͷ3-3. ܕώϯτͱϥϯλΠϜ࣮ߦ࣌ ϥϯλΠϜʹܕͷใऔಘͰ͖Δ
3-3. ࣮ߦ࣌ͷܕͷใऔಘ͜ΜͳϓϩάϥϜΛॻ͍࣮ͯߦͯ͠ΈΔ{'name': , 'age': }࣮ߦ࣌ʹ@@BOOPUBUJPOT@@ʹ֨ೲ͞ΕͨܕͷใΛ׆༻Ͱ͖Δʂ˞HFU@UZQF@IJOUT ͬͨ΄͏͕ྑ͍Ͱ͢
ྫEJDUͷม3-3. __annotations__ ͷ׆༻ྫ
ྫEBUBDMBTT3-3. ඪ४ϥΠϒϥϦͷ׆༻ྫ!EBUBDMBTTσίϨʔλʔΛ͔ͭ͏ͱ࣮ߦ࣌ʹ@@JOJU@@ΛࣗಈͰఆٛͯ͘͠ΕΔ
˺EBUBDMBTTʴόϦσʔγϣϯʴγϦΞϥΠζྫQZEBOUJD3-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!