Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python 3.9 時代の型安全な Pythonの極め方 / Mastering Type Safety in Python 3.9 Era

90dbd6fb1763a4b5f7236b72cba16a58?s=47 Mitsuki Ogasahara
August 28, 2020
17k

Python 3.9 時代の型安全な Pythonの極め方 / Mastering Type Safety in Python 3.9 Era

PyCon JP 2020 の「Python 3.9 時代の型安全な Python の極め方」の発表資料です

90dbd6fb1763a4b5f7236b72cba16a58?s=128

Mitsuki Ogasahara

August 28, 2020
Tweet

Transcript

  1. 1ZUIPO࣌୅ͷ ܕ҆શͳ1ZUIPOͷۃΊํ খּݪΈ͖ͭ!ZBNJU[LZ

  2. 1ZUIPO࣌୅ͷ ܕ҆શͳ1ZUIPOͷۃΊํ খּݪΈ͖ͭ!ZBNJU[LZ 3.10

  3. Agenda  ಋೖ  جຊฤܕώϯτͷ֓ཁͱجຊจ๏  Ԡ༻ฤ  ܕνΣοΫ 

    ߴ౓ͳܕͰϞσϦϯά  ϥϯλΠϜͷܕώϯτ  ·ͱΊ
  4. 2ීஈɺ1ZUIPOͰܕॻ͖·͔͢ʁ 1. ࠓ೔ͷ໨ඪ ˡʮܕॻ͖͍ͨʯ ˡʮ͜Ε΋࢖ͬͯΈΑ͏ʯ ^ ˡʮ஌ΒΜ͔ͬͨʯ

  5. ɾ3.8 ࣌୅ʹग़൪͕ͳ͍΋ͷ ɾܧঝͷෳࡶͳ࿩ NSPͱ͔  ɾจ๏*͚ͩ* ࿩͞ͳ͍͜ͱ 1. ࠓ೔ͷ໨ඪ

  6. 1. ͓લɺ୭Αʁ w খּݪޫو!ZBNJU[LZ w +9௨৴ࣾऔక໾$%0 w ޷͖ͳٕज़ 5ZQF4DSJQUɺ1ZUIPO ೥ʙ

     αʔόʔϨεɺ(SBQI2-FUDʜ ˞54ϩΰ$$#:.JDSPTPGU
  7. 1. JX௨৴ࣾʹ͍ͭͯ w ʮࠓى͖͍ͯΔ͜ͱΛ໌Β͔ʹ͢Δʯ ใಓςΫϊϩδʔϕϯνϟʔ w 1Z$PO+14JMWFS4QPOTPS w ΋ͪΖΜʮܕʯॻ͍ͯ·͢

  8. Python ͷνʔϜ։ൃ΍ େن໛ͳ Python ϓϩδΣΫτ ෆຬ͕͋Γ·ͤΜ͔ʁ 1. Python ͷෆຬ

  9. 1. Python ͷෆຬ

  10. ˞ฐࣾ๭ϓϩδΣΫτʹ΋͋Γ·ͨ͠ 1. Python ͷෆຬ

  11. 1. Python ͷෆຬ ΤσΟλͷิ׬

  12. "1*௨৴Ͱฦͬͯ͘Δ಺༰͕Α͘Θ͔Βͳ͍ 1. Python ͷෆຬ

  13. ಈతܕ෇͖ݴޠͷෆຬ ʮܕʯͰղܾͰ͖·͢ 1. Python ͷෆຬ

  14. 1ZUIPOͷܕͷ֓ཁͱجຊจ๏ جຊฤ 02

  15. ɾਖ਼໊ࣜশ͸ʮ5ZQF)JOU ܕώϯτ ʯ ɾ1&1Ͱ1ZUIPO ʙ ͔Βೖͬͨจ๏ ɾ໨త੩తղੳɺϦϑΝΫλϦϯάɺίʔυੜ੒ͳͲ ɾ1ZUIPO͕੩తܕ෇͖ݴޠʹͳͬͨΘ͚Ͱ͸ͳ͘ɺ ɹ೚ҙɾޙ෇͚ͷܕγεςϜ 1ZUIPOͷܕͬͯͳΜͩΖ͏

    2. ʮܕʯͷ֓ཁ ˞͜ͷεϥΠυͰʮܕʯͱݴٴ͢Δࡍ͸ʮܕώϯτʯͷ͜ͱΛݴ͍·͢
  16. 2. ʮܕʯͷ֓ཁ ੩తղੳ ϦϑΝΫλϦϯά

  17. 1ZUIPO͸ʮ੩తܕ෇͖ݴޠʯͰ͸ͳ͍ 2. ʮܕʯͷ֓ཁ 2͜ͷίʔυ͸࣮ߦ࣌ΤϥʔʹͳΔʁ 2ܕͷ৘ใ͸TUSʁJOUʁ

  18. 1ZUIPO͸ʮ੩తܕ෇͖ݴޠʯͰ͸ͳ͍ 2. ʮܕʯͷ֓ཁ "࣮ߦ࣌ʹ͸Τϥʔ͸ൃੜ͠ͳ͍ αʔυύʔςΟʔͷπʔϧΛ૊Έ߹Θͤͯ׆༻ "UZQF ͷ໭Γ஋ͱͯ͠͸ܕώϯτ͸ແؔ܎

  19. ΤσΟλ ิ׬ͳͲ 1ZUIPOͷʮܕʯΛ औΓר͘αʔυύʔςΟʔ 2. ʮܕʯͷ֓ཁ mypy pyright pytype VSCode

    PyCharm Vim pydantic FastAPI ੩తղੳ ࣮ߦ࣌ͷόϦσʔγϣϯͳͲ ࢀߟIUUQTHJUIVCDPNUZQFEEKBOHPBXFTPNFQZUIPOUZQJOH
  20. ɾਖ਼໊ࣜʮ5ZQF)JOUʯΛ঺հ ɾ1ZUIPO͸ಈతܕ෇͖ݴޠͰ͋Γɺܕώ ϯτ͸ڧ੍͞Εͳ͍ ɾ1ZUIPOࣗମ͸ܕνΣοΫΛߦΘͳ͍ɻ SEQBSUZπʔϧΛ૊Έ߹ΘͤΔ ͜͜·Ͱͷ·ͱΊ 2. ʮܕʯͷ֓ཁ

  21. ม਺ 2. ܕώϯτͷจ๏ม਺

  22. ؔ਺ 2. ܕώϯτͷจ๏ؔ਺

  23. Ҿ਺͚ͩॻ͍ͯ΋0, 2. ܕώϯτͷจ๏ؔ਺ ໭Γ஋͚ͩॻ͍ͯ΋0,

  24. ࣍ͷίʔυΛܕνΣοΫπʔϧͰղੳ͢Δͱʜʁ &YFSDJTF 2. ܕώϯτͷจ๏ ΋ͪΖΜ0,

  25. ࣍ͷίʔυΛܕνΣοΫπʔϧͰղੳ͢Δͱʜʁ &YFSDJTF 2. ܕώϯτͷจ๏ ΋ͪΖΜ/(

  26. 2. ܕώϯτͷจ๏ ʮܕʯͷΤϥʔ͸ ੺೾ઢͰදݱ͠·͢ ddddd

  27. DMBTT 2. ܕώϯτͷจ๏DMBTT ˡϓϩύςΟͷఆٛ ˡϝιουఆٛ ˡม਺ͷܕͱͯ͠ར༻

  28. ܧঝͷѻ͍ 2. ܕώϯτͷจ๏DMBTT ˣ೿ੜΫϥε͸جఈΫϥεʹ୅ೖͰ͖Δ ˣܧঝͯ͠ͳ͍ͱ΋ͪΖΜμϝ

  29. ϓϩύςΟͷܕ͕Θ͔Βͳ͍ͱ͖ 2. ܕώϯτͷจ๏"OZ ˡϓϩύςΟͷఆٛ ˡϝιουఆٛ

  30. ҉໧తͳ"OZ 2. ܕώϯτͷจ๏"OZ ˡϓϩύςΟͷఆٛ ˡϝιουఆٛ ˺

  31. MJTU EJDU TFU 2. ܕώϯτͷจ๏σʔλߏ଄

  32. 2. ܕώϯτͷจ๏·Ͱͷσʔλߏ଄ ʙ1ZUIPO ˞ݱࡏ3$൛Ͱਖ਼ࣜϦϦʔε͸༧ఆ 1ZUIPOʙ

  33. -JTU<5>ͳͲͷ<>ͷ෦෼Λ൚༻తʹ͢Δ (FOFSJDT ˞ࠓ೔͸঺հ͠·ͤΜ 2. ࣗ෼Ͱσʔλߏ଄Λ࡞Γ͍ͨͱ͖

  34. /POF͕ೖΔ͔΋͠Εͳ͍ม਺ l͵ΔΆz๷ࢭ ˡ/POF͡Όͳ͍͜ͱΛ͔֬ΊΔͱ ҆શʹ࢖͑Δ ˡ/POFͷՄೳੑͷࢦఠ 2. ܕώϯτͷจ๏0QUJPOBM

  35. 0QUJPOBM<6TFS>ʹ/POF·ͨ͸6TFS 2. ܕώϯτͷจ๏6OJPO ʹ ਺ࣈʹJOU·ͨ͸qPBU

  36. 2. ܕώϯτͷจ๏6OJPO   1ZUIPO ʙ1ZUIPO ˞དྷ೥ ϦϦʔε༧ఆ

  37. ɾม਺ɺؔ਺ ɾDMBTTɺܧঝ ɾMJTUɺEJDUɺTFU ɾ0QUJPOBM ɾ6OJPO ɾ"OZ ͜͜·Ͱͷ·ͱΊ 2. ܕώϯτجຊฤ·ͱΊ

  38. ͳͥʮܕʯΛۃΊΔͷ͔ʁ Ԡ༻ฤ 03

  39. ɾҙਤ͠ͳ͍࣮ߦ࣌ΤϥʔΛࣄલʹ๷͛Δ ɾ͞Βʹܕ҆શʹͨ͠Γɺਖ਼͘͠ϞσϦϯάͰ͖Δ ɾϓϩάϥϜΛ%3:ʹͰ͖Δ ʮܕʯΛۃΊΔͱԿ͕Ͱ͖Δͷ͔ʁ 3. ܕώϯτԠ༻ฤ

  40. PythonϓϩάϥϜΛܕ҆શʹͯ͠ΈΑ͏ Ԡ༻ฤ 03

  41. ɾ1ZUIPO͸੩తܕ෇͖ݴޠͰ͸ͳ͍ ɾ1ZUIPOࣗମ͸ܕνΣοΫΛ͠ͳ͍ ˠπʔϧʮNZQZʯͰܕνΣοΫ 1ZUIPOͷܕώϯτͷݪଇ 3-1. ܕνΣοΫ

  42. ɾ1ZUIPOͷ੩తͳܕνΣοΫΛ͢Δπʔϧ ɾ(JU)VCͷQZUIPONZQZʹ͋Γɺ ɹ(VJEP΋ίΞνʔϜϝϯόʔ ɾ$-*ͱͯ͠΋࢖͑Δ͠ɺ74$PEF΍ 1Z$IBSNͱ΋࿈ܞ NZQZ 3-1. mypy

  43. 3-1. mypy

  44. NZQZͷ࢖͍ํ 3-1. mypy QJQJOTUBMMNZQZͯ͠ NZQZ<σΟϨΫτϦ·ͨ͸ϑΝΠϧ໊QZ>

  45. (JU-BC$*ͷྫ 3-1. mypy ΞοϓσʔτͰಥવݡ͘ͳͬͯ ಥવ$*͕௨Βͳ͘ͳΔͷͰ όʔδϣϯݻఆΛڧ͘ਪ঑

  46. ϥΠϒϥϦʹܕ͕ͳ͍ͱΤϥʔʹͳΔ 3-1. mypy ͷͭΒ͍ͱ͜Ζ ༁lCPUPzʹ͸ܕώϯτͳ͍Α ˞ܕώϯτͷͳ͍ϥΠϒϥϦ͸݁ߏଟ͍

  47. ɾελϒΛੜ੒͢Δॻ͘ ɾελϒύοέʔδΛΠϯετʔϧ͢Δ࡞Δ Ͳ͏͢Δʁ 3-1. ܕώϯτͷͳ͍ϥΠϒϥϦ

  48. ɾϓϩάϥϜϥΠϒϥϦʹ֎෇͚ͷܕఆٛ ɾ QZJͱ͍͏໊લͰɺܕͷఆ͚ٛͩهࡌ ɾୈࡾऀ͕࡞ͬͯύοέʔδԽͰ͖Δ TUVCͱ͸ 3-1. ελϒΛॻ͘ ˞5ZQF4DSJQUͷʮEUTʯʮ!UZQFT ʯ

  49. TUVCͷྫ 3-1. ελϒΛॻ͘ IPHFQZ IPHFQZJ ܕͷͳ͍ϓϩάϥϜ ରԠ͢Δελϒ

  50. ɾNZQZͱҰॹʹ͍ͭͯ͘Δࣗಈੜ੒πʔϧ ɾTUVCHFO<σΟϨΫτϦPSϑΝΠϧ໊> TUVCHFO 3-1. ελϒͷࣗಈੜ੒

  51. ɾTUVCHFON<Ϟδϡʔϧ>Ͱ֎෦ϥΠϒϥϦ΋ ɾ׬શͰ͸ͳ͍ͷͰɺखಈमਖ਼͓͢͢Ί TUVCHFO 3-1. ελϒΛॻ͘(ࣗಈੜ੒) ུ ˞࣮ࡍɺߦ໨Λ࡟আ͠ͳ͍ͱNZQZ͸ಈ͔ͳ͍

  52. ɾ࡞ͬͨελϒ͸QZQJύοέʔδʹͰ͖Δ ɾ044ͱͯ͠ୈࡾऀʹΑͬͯެ։͞Ε͍ͯΔ ɾྫ CPUPTUVCTɺEKBOHPTUVCTɺFUDʜ QJQJOTUBMM TUVCT 3-1. ελϒύοέʔδͷΠϯετʔϧ ˞ৄࡉ͸1&1

  53. ɾελϒΛੜ੒͢Δॻ͘ ɾελϒύοέʔδΛΠϯετʔϧ͢Δ࡞Δ ɾఘΊΔ Ͳ͏͢Δʁ 3-1. ܕώϯτͷͳ͍ϥΠϒϥϦ

  54. ɾJHOPSFNJTTJOHJNQPSUTΛࢦఆ͢Δ ɾJNQPSUʹUZQFJHOPSFͷίϝϯτΛ͚ͭΔ ɾ࣮ࡍʹ͸ؔ਺ͳͲͰϥοϓͯ͠"OZͷൣғΛ ɹ޿͛ͳ͍ͷ͕େࣄ ͱ͖ʹ͸ɺ͖͋ΒΊ͕؊৺ 3-1. ϥΠϒϥϦͷܕΛఘΊΔ

  55. ɾNJDSPTPGUQZSJHIU ɾHPPHMFQZUZQF ɾGBDFCPPLQZSF NZQZҎ֎ʹ΋݁ߏ͋Δ 3-1. mypy Ҏ֎ͷܕνΣοΧʔ

  56. 3-1. ܕνΣοΧʔͷൺֱ(Ұྫ) NZQZ QZSJHIUQZUZQF QZSF ˞ઃఆͰݫ͘͠ʗ؇͘Ͱ͖Δ ໭Γ஋ͷํ΋ਪ࿦ SFUVSO࿙ΕΔͱΤϥʔ ϓϩύςΟͷॳظԽνΣοΫ

  57. ˞Ҿ਺ɺ໭Γ஋ɺΫϥεϓϩύςΟͷܕ͸ॻ͘ͷ͕͓͢͢Ί ܕ͸ਪ࿦͞ΕΔͷͰ ܕώϯτΛॻ͔ͳͯ͘΋ Ұ෦ ܕ҆શʹ 3-1. ܕਪ࿦ ddddddddddddd

  58. ΋ͬͱܕ҆શͰɺ΋ͬͱྑ͍ϞσϦϯάΛ͠Α͏ Ԡ༻ฤ 03

  59. TypedDict Protocol NewType Literal ܕώϯτͷެࣜػೳͷ঺հ 3-2. Advanced Type Hinting

  60. Ϣʔεέʔεᶃ ʮ"1*ͷϨεϙϯεΛܕఆ͍ٛͨ͠ʯ 3-2. ܕ҆શͳ dict

  61. %JDUͷ··Ҿ͖ճ͢ͱى͜Δ͜ͱ 3-2. ܕ҆શͳ dict ˠ,FZ&SSPSΛܕνΣοΫ͍ͨ͠

  62. 5ZQFE%JDU 3-2. ܕ҆શͳ dict ˞ͰΞΫηε͸Ͱ͖ͳ͍ʹDMBTTʹ٧Ίସ͑ͨ΄͏͕ྑ͍৔߹΋

  63. Ϣʔεέʔεᶄ ந৅ʹґଘ͢Δઃܭʹ͍ͨ͠ 3-2. ந৅ʹґଘͨ͠ઃܭ ˡద੾ͳܕ͸ʁ

  64. Α͘ͳ͍ྫ 3-2. ந৅ʹґଘͨ͠ઃܭ ந৅ʹґଘͨ͠ྫ

  65. ྫʮந৅ΫϥεʯΛ͔ͭ͏ ந৅తͳʮ#JSEʯΛఆٛͯ͠ΈΑ͏ 3-2. ந৅ʹґଘͨ͠ઃܭ

  66. ܕ҆શʹ͸ͳ͕ͬͨʜ 3-2. ந৅Ϋϥεͷ໰୊఺ ܧঝʹϥϯλΠϜͷڍಈมԽ͕ඞཁ ಈతܕ෇͖ݴޠͷॊೈੑ͕ࣦΘΕɺ1ZUIPOJDͰͳ͍ ந৅Ϋϥε൛ ݩͷόʔδϣϯ

  67. ໊લత෦෼ܕ ʮDMBTTΛܧঝ͍ͯ͠Δ͔ʯ ந৅Ϋϥε 3-2. Protocol ʹΑΔந৅Խ ߏ଄త෦෼ܕ ʮඞཁͳϝιουΛ͍࣋ͬͯΔ͔ʯ 1SPUPDPM

  68. 3-2. Protocol ʹΑΔந৅Խ ܕ҆શ͔ͭ%VDLͷڍಈ͕มΘΒͳ͍ 1SPUPDPM

  69. Ϣʔεέʔεᶅ -JTU΍4FUͳͲʮJOʯͰ͖Δ΋ͷΛ ड͚औΓ͍ͨ 3-2. Protocol ͦͷ̎

  70. ެࣜͰ1SPUPDPM͕ఆٛ͞Ε͍ͯΔ 3-2. ఆٛࡁΈͷ Protocol ˞$POUBJOFSʹ@@DPOUBJOT@@͕͋ΔϞϊ

  71. ͦͷଞͷެࣜ1SPUPDPM 3-2. ఆٛࡁΈͷ Protocol IUUQTEPDTQZUIPOPSHKBMJCSBSZDPMMFDUJPOTBCDIUNM ˞ඞͣ͠΋1SPUPDPMΛܧঝ͍ͯ͠ͳ͍

  72. $BMMBCMF 3-2. ఆٛࡁΈͷ Protocol *UFSBCMF ؔ਺ͬΆ͍΋ͷ @@DBMM@@ GPSJOͰ͖Δ΋ͷ @@JUFS@@ 4FRVFODF

    ഁյతมߋͰ͖ͳ͍MJTU ʢࢀߟ 1SPUPDPMΛ׆༻ͨ͠*NNVUBCMFͳσʔλߏ଄ʹ͍ͭͯ IUUQTZBNJU[LZIBUFOBCMPHDPNFOUSZ
  73. Ϣʔεέʔεᶆ JOU΍TUSʹʮҙຯʯΛ͍࣋ͨͤͨ 3-2. ಛघͳϓϦϛςΟϒܕ

  74. /FX5ZQF 3-2. ಛघͳϓϦϛςΟϒܕ ΩϦ͕ͳ͍ͷͰɺ*%ͳͲฆΒΘ͍͠Ұ෦ͷܕ͚ͩਪ঑

  75. -JUFSBM 3-2. Ϧςϥϧܕ

  76. ɾ5ZQFE%JDU ɾ1SPUPDPM ɾ*UFSBCMFͳͲͷެࣜ1SPUPDPM ɾ/FX5ZQFɺ-JUFSBM ঺հͨ͠΋ͷ 3-2. ΋ͬͱܕ҆શͳϞσϦϯά

  77. ϥϯλΠϜΛ΋ͬͱศརʹ͢Δ Ԡ༻ฤ 03

  78. ࠓ·Ͱɿ੩తͳܕνΣοΫͷ࿩ 3-3. ܕώϯτͱϥϯλΠϜ ࣮ߦ࣌ ϥϯλΠϜ ʹ ܕͷ৘ใ͸औಘͰ͖Δ

  79. 3-3. ࣮ߦ࣌ͷܕͷ৘ใऔಘ ͜ΜͳϓϩάϥϜΛॻ͍࣮ͯߦͯ͠ΈΔ {'name': <class 'str'>, 'age': <class 'int'>} ࣮ߦ࣌ʹ@@BOOPUBUJPOT@@ʹ֨ೲ͞Εͨܕͷ৘ใΛ׆༻Ͱ͖Δʂ

    ˞HFU@UZQF@IJOUT ࢖ͬͨ΄͏͕ྑ͍Ͱ͢
  80. ྫ EJDU΁ͷม׵ 3-3. __annotations__ ͷ׆༻ྫ

  81. ྫ EBUBDMBTT 3-3. ඪ४ϥΠϒϥϦͷ׆༻ྫ !EBUBDMBTTσίϨʔλʔΛ͔ͭ͏ͱ ࣮ߦ࣌ʹ@@JOJU@@ΛࣗಈͰఆٛͯ͘͠ΕΔ

  82. ˺EBUBDMBTTʴόϦσʔγϣϯʴγϦΞϥΠζ ྫ QZEBOUJD 3-3. ϥϯλΠϜόϦσʔγϣϯ

  83. ྫ 'BTU"1* 3-3. API ͷόϦσʔγϣϯ ܕώϯτ෇͖ͷؔ਺Λఆ͍͚ٛͯͩ͘͠Ͱɺ όϦσʔγϣϯ͖ͭͷ"1*͕Ͱ͖Δ

  84. ܕώϯτ͔Β4XBHHFS 0QFO"1* ΋ࣗಈੜ੒ 3-3. FastAPI ˞ଞݴޠͰ΋࢖ΘΕΔ"1*࢓༷ɻ"1*ͷܕ͕ఆٛͰ͖Δ

  85. ɾ@@BOOPUBUJPOT@@ʹܕͷ৘ใؚ͕·ΕΔ ɾσίϨʔλʔɺϝλΫϥεͱ૊Έ߹ΘͤΔͱ%3:ʹ ɾܕͷಈతνΣοΫɺ"1*ͷόϦσʔγϣϯɺ4XBHHFS ఆٛͳͲ΋Ͱ͖Δ ϥϯλΠϜͰͷܕώϯτΛ঺հ 3-3. ·ͱΊ

  86. ·ͱΊ 04

  87. ܕώϯτΛॻ͘ͱ/POF΍ ܕͷϛεΛνΣοΫͰ͖Δ 4. ·ͱΊ

  88. NZQZ΍QZSJHIUͰܕνΣοΫ Ұ෦͸ਪ࿦͞ΕΔʹॻ͍ͯͳ͍ͷʹܕ҆શ 4. ·ͱΊ ddddddddddddd

  89. 1SPUPDPM΍5ZQFE%JDUͰ ʮܧঝʯʹറΒΕͳ͍ܕ҆શ 4. ·ͱΊ

  90. ʮܕʯΛॻ͚ͩ͘ͰϥϯλΠϜ͕ศརʹ 4. ·ͱΊ

  91. ࣌୅ɺ ͳͥಈతܕ෇͖ݴޠͷ1ZUIPOͰ ʮܕʯΛۃΊΔͷ͔ʁ 4. ·ͱΊ

  92. 1ZUIPOͷܕώϯτΛۃΊΔͱ ಈతܕ෇͖ݴޠͷྑ͞Λଛͳ͏͜ͱͳ͘ ҆શͰ1ZUIPOJDͳϓϩάϥϜΛ ੜ࢈ੑߴ͘ॻ͚Δ͔Β 4. ·ͱΊ ˞ҰҙݟͰ͢ɻօ༷ͷҙݟΛฉ͔͍ͤͯͩ͘͞

  93. Thank you!