Python Type Checker Comparison: Empty Container Inference
ຄຳເຫັນ
Mewayz Team
Editorial Team
ເປັນຫຍັງພາຊະນະຫວ່າງເປົ່າທຳລາຍຕົວກວດສອບປະເພດ Python — ແລະສິ່ງທີ່ເຈົ້າເຮັດໄດ້ກ່ຽວກັບມັນ
ລະບົບການພິມເທື່ອລະກ້າວຂອງ Python ໄດ້ເຕີບໃຫຍ່ຂຶ້ນຢ່າງຫຼວງຫຼາຍນັບຕັ້ງແຕ່ PEP 484 ໄດ້ແນະນໍາປະເພດຄໍາແນະນໍາໃນປີ 2015. ໃນມື້ນີ້, ນັກພັດທະນາຫຼາຍລ້ານຄົນໄດ້ອີງໃສ່ຕົວກວດສອບປະເພດຄົງທີ່ເພື່ອຈັບແມງໄມ້ກ່ອນທີ່ມັນຈະຜະລິດ. ແຕ່ມີບາງມຸມທີ່ໜ້າເສົ້າໃຈຂອງລະບົບປະເພດທີ່ຍັງໄປເຖິງບັນດາວິສະວະກອນທີ່ມີປະສົບການ: ຖັງເປົ່າມີປະເພດໃດແດ່? ເມື່ອທ່ານຂຽນ x = [] ໂດຍບໍ່ມີການ annotation, checker ປະເພດຂອງທ່ານຕ້ອງເດົາ — ແລະ checkers ທີ່ແຕກຕ່າງກັນເດົາແຕກຕ່າງກັນ. ຄວາມແຕກຕ່າງກັນນີ້ສ້າງບັນຫາທີ່ແທ້ຈິງສໍາລັບທີມທີ່ຮັກສາ codebases ຂະຫນາດໃຫຍ່, ບ່ອນທີ່ການສະຫຼັບຫຼືການລວມຕົວກວດກາປະເພດສາມາດເກີດຄວາມຜິດພາດທີ່ບໍ່ຄາດຄິດຫຼາຍຮ້ອຍຄົນໃນຄືນ.
ບົດຄວາມນີ້ແບ່ງອອກວ່າຕົວກວດສອບປະເພດ Python ຫຼັກສີ່ຢ່າງຄື mypy, pyright, pytype, pyre, ແລະ pyre — ຈັດການການອະທິຖານພາຊະນະຫວ່າງເປົ່າ, ເປັນຫຍັງເຂົາເຈົ້າບໍ່ເຫັນດີ, ແລະຍຸດທະສາດການປະຕິບັດແນວໃດທີ່ທ່ານສາມາດນໍາໃຊ້ໃນການຂຽນ Python ປະເພດທີ່ປອດໄພໂດຍບໍ່ສົນເລື່ອງຂອງການເລືອກເຄື່ອງມືຂອງທ່ານ.
ບັນຫາຫຼັກ: ບັນຈຸທີ່ຫວ່າງເປົ່າແມ່ນມີຄວາມໜ້າສົງໄສ
ພິຈາລະນາແຖວທີ່ບໍ່ມີປະໂຫຍດນີ້ຂອງ Python: ຜົນໄດ້ຮັບ = []. ຜົນໄດ້ຮັບ ເປັນ ລາຍຊື່[int] ບໍ? ລາຍຊື່[str] ບໍ? ລາຍການ[dict[str, Any]]? ຖ້າບໍ່ມີສະພາບການເພີ່ມເຕີມ, ບໍ່ມີທາງທີ່ຈະຮູ້ຢ່າງແທ້ຈິງ. Python runtime ບໍ່ສົນໃຈ - ລາຍຊື່ແມ່ນແຕກຕ່າງກັນໂດຍທໍາມະຊາດ - ແຕ່ຕົວກວດສອບປະເພດຄົງທີ່ຈໍາເປັນຕ້ອງກໍານົດປະເພດຊີມັງໃຫ້ກັບທຸກໆຕົວແປເພື່ອເຮັດວຽກຂອງພວກເຂົາ. ອັນນີ້ສ້າງຄວາມເຄັ່ງຕຶງຂັ້ນພື້ນຖານລະຫວ່າງຄວາມຍືດຫຍຸ່ນແບບເຄື່ອນໄຫວຂອງ Python ແລະການຮັບປະກັນທີ່ການວິເຄາະສະຖິດພະຍາຍາມໃຫ້.
ບັນຫາປະກອບເຂົ້າກັບວັດຈະນານຸກົມ ແລະຊຸດ. ຕົວຈິງແລ້ວ {} ຫວ່າງເປົ່າຖືກແຍກອອກເປັນ ຄຳສັ່ງ, ບໍ່ແມ່ນ ຊຸດ, ເຊິ່ງເພີ່ມຄວາມງ່າງແຈ້ງຂອງ syntactic ຢູ່ເທິງສຸດຂອງຄວາມບໍ່ຊັດເຈນໃນລະດັບປະເພດ. ແລະກ່ອງບັນຈຸ - ຄິດ defaultdict(list) ຫຼື results = {k: [] for k in keys — push engine inference to the limits. ເຄື່ອງກວດແຕ່ລະປະເພດໄດ້ພັດທະນາທິດສະດີຂອງຕົນເອງ, ແລະຄວາມແຕກຕ່າງແມ່ນມີຄວາມສໍາຄັນຫຼາຍກ່ວາຜູ້ພັດທະນາສ່ວນໃຫຍ່ຮູ້.
ໃນລະບົບການຜະລິດທີ່ປະມວນຜົນປະລິມານວຽກຕົວຈິງ — ບໍ່ວ່າຈະເປັນ CRM ຈັດການບັນທຶກລູກຄ້າ, ໂມດູນໃບແຈ້ງໜີ້ທີ່ສ້າງລາຍການແຖວ, ຫຼືຕົວວັດແທກການລວມທໍ່ຂອງການວິເຄາະ — ຖັງເປົ່າຈະປາກົດຢູ່ສະເໝີເປັນຮູບແບບການເລີ່ມຕົ້ນ. ການໄດ້ຮັບປະເພດຂອງເຂົາເຈົ້າຜິດພາດບໍ່ພຽງແຕ່ຜະລິດຄໍາເຕືອນ linter; ມັນສາມາດປິດບັງບັກແທ້ທີ່ຜ່ານໄປ runtime.
Mypy: ເລື່ອນການຊີ້ນຳໂດຍມີຄວາມໝາຍອັນໃດໜຶ່ງ
Mypy, ເຄື່ອງກວດເຊັກປະເພດ Python ທີ່ເກົ່າແກ່ທີ່ສຸດ ແລະຖືກຮັບຮອງເອົາຢ່າງກວ້າງຂວາງທີ່ສຸດ, ໃຊ້ວິທີການທີ່ຂ້ອນຂ້າງອ່ອນໂຍນຕໍ່ກັບຖັງເປົ່າ. ເມື່ອມັນພົບກັບ x = [] ໃນຂອບເຂດຟັງຊັນ, ມັນພະຍາຍາມ ເລື່ອນການຕັດສິນໃຈປະເພດ ແລະ infer ປະເພດອົງປະກອບຈາກການນໍາໃຊ້ຕໍ່ໄປ. ຖ້າເຈົ້າຂຽນ x = [] ຕາມດ້ວຍ x.append(42), mypy ຈະ infer list[int]. ຍຸດທະສາດ "ເຂົ້າຮ່ວມ" ນີ້ເຮັດວຽກໄດ້ດີຢ່າງແປກໃຈສໍາລັບກໍລະນີທີ່ກົງໄປກົງມາທີ່ບັນຈຸບັນຈຸຢູ່ໃນຂອບເຂດດຽວກັນ.
ຢ່າງໃດກໍຕາມ, ພຶດຕິກຳຂອງ mypy ມີການປ່ຽນແປງຢ່າງຫຼວງຫຼາຍຂຶ້ນກັບການຕັ້ງຄ່າສະພາບການ ແລະຄວາມເຂັ້ມງວດ. ຢູ່ໃນຂອບເຂດຂອງໂມດູນ (ລະຫັດລະດັບເທິງສຸດ), ຫຼືເມື່ອບັນຈຸຖືກສົ່ງຕໍ່ກັບຟັງຊັນອື່ນກ່ອນທີ່ຈະຖືກຕື່ມຂໍ້ມູນ, mypy ມັກຈະກັບຄືນໄປຫາ ລາຍຊື່[ອັນໃດກໍໄດ້]. ພາຍໃຕ້ທຸງ --ເຄັ່ງຄັດ, ນີ້ຈະເຮັດໃຫ້ເກີດຄວາມຜິດພາດ, ແຕ່ໃນໂໝດເລີ່ມຕົ້ນມັນຈະຜ່ານໄປຢ່າງງຽບໆ. ນີ້ໝາຍຄວາມວ່າທີມທີ່ແລ່ນ mypy ໂດຍບໍ່ມີໂຫມດທີ່ເຂັ້ມງວດສາມາດສະສົມຕູ້ບັນຈຸທີ່ພິມໄດ້ຫຼາຍສິບໜ່ວຍທີ່ເຮັດໜ້າທີ່ເປັນໝວກໜີອອກຈາກລະບົບປະເພດ, ເອົາຊະນະຈຸດປະສົງຂອງມັນ.
ໜຶ່ງພຶດຕິກຳທີ່ລະອຽດອ່ອນໂດຍສະເພາະ: ເວີຊັນ mypy ກ່ອນ 0.990 ບາງຄັ້ງອາດຈະສະຫຼຸບ ລາຍຊື່[ບໍ່ຮູ້ຈັກ] ພາຍໃນ ແລະຈາກນັ້ນຂະຫຍາຍໄປຫາ ລາຍຊື່[ອັນໃດກໍໄດ້] ໃນການມອບໝາຍ. Post-0.990, inference ໄດ້ເຄັ່ງຄັດ, ແຕ່ການປ່ຽນແປງໄດ້ທໍາລາຍຈໍານວນ codebases ໂລກທີ່ແທ້ຈິງທີ່ຫນ້າປະຫລາດໃຈທີ່ໄດ້ອີງໃສ່ພຶດຕິກໍາການອະນຸຍາດໂດຍບໍ່ຮູ້ຕົວ. ນີ້ແມ່ນຫົວຂໍ້ທີ່ເກີດຂຶ້ນຊ້ຳໆ — ການປ່ຽນແປງຕໍ່ກັບການອະສັງຫາລິມະສິດຂອງຖັງເປົ່າແມ່ນໃນບັນດາການປັບປຸງຕົວກວດສອບປະເພດທີ່ລົບກວນທີ່ສຸດ ເພາະວ່າຮູບແບບຕ່າງໆມີຢູ່ທົ່ວທຸກມຸມ.
Pyright: Strict Inference and the "Unknown" Type
Pyright, ພັດທະນາໂດຍ Microsoft ແລະໃຫ້ພະລັງງານ Pylance ໃນ VS Code, ມີຈຸດຢືນທາງປັດຊະຍາທີ່ແຕກຕ່າງກັນໂດຍພື້ນຖານ. ແທນທີ່ຈະກັບຄືນໄປຫາ ອັນໃດກໍໄດ້ ຢ່າງງຽບໆ, ສິດຈະຈຳແນກລະຫວ່າງ ບໍ່ຮູ້ຈັກ (ປະເພດທີ່ຍັງບໍ່ທັນໄດ້ຮັບການກຳນົດເທື່ອ) ແລະ ອັນໃດກໍໄດ້ (ການເລືອກອອກຈາກການກວດສອບປະເພດຢ່າງຊັດເຈນ). ເມື່ອທ່ານຂຽນ x = [] ໃນໂຫມດທີ່ເຂັ້ມງວດຂອງ pyright, ມັນ infers list[Unknown] ແລະລາຍງານການວິນິດໄສ, ບັງຄັບໃຫ້ທ່ານໃຫ້ຄໍາບັນຍາຍ.
Pyright ຍັງມີຄວາມຮຸກຮານກວ່າກ່ຽວກັບ ການຮັດແຄບໃນຂອບເຂດ. ຖ້າເຈົ້າຂຽນ:
- x = [] ຕາມດ້ວຍ x.append("hello") — pyright infers list[str]
- x = [] ຕາມດ້ວຍ x.append(1) ຈາກນັ້ນ x.append("hello") — pyright infers list[int | str]
- x = [] ຜ່ານໂດຍກົງໄປຫາຟັງຊັນທີ່ຄາດຫວັງ list[int] — pyright infers list[int] from the call-site context
- x = [] ສົ່ງຄືນມາຈາກຟັງຊັນທີ່ບໍ່ມີຄໍາບັນຍາຍປະເພດຜົນຕອບແທນ — pyright ລາຍງານຄວາມຜິດພາດຫຼາຍກວ່າການຄາດເດົາ
ການອະພິປາຍສອງທິດນີ້ (ການນໍາໃຊ້ທັງສອງການນໍາໃຊ້ຕໍ່ມາແລະປະເພດທີ່ຄາດວ່າຈະໄດ້ຈາກເວັບໄຊທ໌ໂທ) ເຮັດໃຫ້ pyright ຊັດເຈນຫຼາຍກ່ວາ mypy ສໍາລັບພາຊະນະເປົ່າຫວ່າງ. ການແລກປ່ຽນແມ່ນ verbosity: ຮູບແບບທີ່ເຂັ້ມງວດຂອງ pyright ທຸງປະມານ 30-40% ບັນຫາເພີ່ມເຕີມ ໃນ codebase ປົກກະຕິ ununnotated ເມື່ອທຽບກັບຮູບແບບທີ່ເຄັ່ງຄັດຂອງ mypy, ອີງຕາມການວິເຄາະຈາກບົດລາຍງານການຍ້າຍແຫຼ່ງເປີດຫຼາຍ. ສໍາລັບທີມງານທີ່ສ້າງລະບົບ backend ທີ່ຊັບຊ້ອນ — ເວົ້າວ່າ, ແພລະຕະຟອມທີ່ຈັດການ 207 ໂມດູນເຊື່ອມຕໍ່ກັນເຊິ່ງກວມເອົາ CRM, ເງິນເດືອນ, ແລະການວິເຄາະ - ຄວາມເຂັ້ມງວດຂອງ pyright ຈັບຕົວໂຕ້ຕອບທີ່ອ່ອນໂຍນທີ່ inference ອ່ອນໆຈະພາດ.
Pytype ແລະ Pyre: ເສັ້ນທາງທີ່ມີການເດີນທາງໜ້ອຍລົງ
pytype ຂອງ Google ອາດຈະໃຊ້ວິທີການທີ່ໜ້າສົນໃຈທີ່ສຸດ. ແທນທີ່ຈະຕ້ອງໃຫ້ຄຳອະທິບາຍປະກອບ ຫຼື ກັບຄືນໄປຫາ ອັນໃດກໍໄດ້, pytype ໃຊ້ ການວິເຄາະໂປຣແກຣມທັງໝົດ ເພື່ອຕິດຕາມວິທີການໃຊ້ container ໃນທົ່ວຂອບເຂດຂອງຟັງຊັນ. ຖ້າທ່ານສ້າງບັນຊີລາຍຊື່ຫວ່າງເປົ່າໃນຟັງຊັນຫນຶ່ງແລະສົ່ງມັນໄປຫາອີກອັນຫນຶ່ງທີ່ເພີ່ມຈໍານວນ, pytype ມັກຈະ infer list[int] ໂດຍບໍ່ມີການຄໍາອະທິບາຍໃດໆ. ການອ້າງອິງແບບຂ້າມຟັງຊັນນີ້ມີລາຄາແພງຫຼາຍ - pytype ແມ່ນຊ້າກວ່າ mypy ຫຼື pyright ໃນ codebases ຂະຫນາດໃຫຍ່ - ແຕ່ມັນຜະລິດຜົນບວກທີ່ບໍ່ຖືກຕ້ອງຫນ້ອຍລົງໃນລະຫັດທີ່ບໍ່ໄດ້ລະບຸໄວ້.
Pytype ຍັງແນະນຳແນວຄວາມຄິດຂອງ "ປະເພດບາງສ່ວນ" ສໍາລັບຖັງເປົ່າ. [] ທີ່ສ້າງຂຶ້ນໃໝ່ໄດ້ຮັບປະເພດຂອງບາງສ່ວນທີ່ປັບປຸງເປັນກ້າວໆ ເນື່ອງຈາກຕົວກວດສອບພົບການນຳໃຊ້ຫຼາຍຂຶ້ນ. ນີ້ເປັນແນວຄວາມຄິດທີ່ສະຫງ່າງາມ ແຕ່ສາມາດສ້າງຂໍ້ຄວາມຄວາມຜິດພາດທີ່ສັບສົນໄດ້ ເມື່ອປະເພດບາງສ່ວນບໍ່ສາມາດແກ້ໄຂໄດ້ເຕັມທີ່ ເຊັ່ນ: ເມື່ອກ່ອງບັນຈຸຫວ່າງເປົ່າໄຫຼຜ່ານຫຼາຍໜ້າທີ່ໂດຍທີ່ບໍ່ເຄີຍມີຂໍ້ມູນ.
💡 DID YOU KNOW?
Mewayz replaces 8+ business tools in one platform
CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.
Start Free →Meta's pyre, ໃນຂະນະດຽວກັນ, ເຂົ້າໄປໃກ້ກັບພຶດຕິກຳຂອງ mypy ແຕ່ມີຄ່າເລີ່ມຕົ້ນທີ່ເຄັ່ງຄັດກວ່າ. Pyre ປະຕິບັດຕໍ່ x = [] ເປັນ ລາຍຊື່[unknown] ແລະຕ້ອງການຄໍາບັນຍາຍໃນບໍລິບົດສ່ວນໃຫຍ່. ບ່ອນທີ່ pyre ແຍກຕົວຂອງມັນເອງຢູ່ໃນການຈັດການຂອງຕົວຫນັງສືວັດຈະນານຸກົມຫວ່າງເປົ່າທີ່ໃຊ້ເປັນ kwargs — ຮູບແບບທົ່ວໄປໃນກອບເວັບ. Pyre ມີເຫດຜົນໃນກໍລະນີພິເສດເພື່ອພິຈາລະນາປະເພດວັດຈະນານຸກົມຈາກບໍລິບົດການໂຕ້ຖຽງຄໍາຫລັກ, ຫຼຸດຜ່ອນພາລະຂອງຄໍາບັນຍາຍໃນກອບລະຫັດທີ່ຫນັກແຫນ້ນ. ເນື່ອງຈາກແອັບພລິເຄຊັ່ນໃນເວັບທີ່ທັນສະໄໝສ່ວນໃຫຍ່ກ່ຽວຂ້ອງກັບການໃຊ້ພົກພາວັດຈະນານຸກົມຢ່າງໜັກໜ່ວງເພື່ອການກຳນົດຄ່າ ແລະການຈັດການຄຳຮ້ອງຂໍ, ການປະຕິບັດຕົວຈິງນີ້ຈະຈ່າຍເງິນປັນຜົນ.
ຜົນກະທົບຂອງໂລກທີ່ແທ້ຈິງ: ເມື່ອ Inference Divergence ກັດ
ຄວາມແຕກຕ່າງລະຫວ່າງຕົວກວດສອບປະເພດອາດເບິ່ງຄືວ່າເປັນທາງວິຊາການຈົນກວ່າທ່ານຈະປະສົບກັບພວກມັນໃນຖານລະຫັດການຜະລິດ. ພິຈາລະນາເປັນຮູບແບບທົ່ວໄປໃນຄໍາຮ້ອງສະຫມັກທຸລະກິດ: ການເລີ່ມຕົ້ນໂຄງສ້າງຂໍ້ມູນທີ່ໄດ້ຮັບການປະກອບອາຊີບຕາມເງື່ອນໄຂ.
ກ່ອງບັນຈຸເປົ່າທີ່ອັນຕະລາຍທີ່ສຸດບໍ່ແມ່ນເຄື່ອງກວດເຊັກປະເພດ - ພວກມັນແມ່ນອັນທີ່ຜ່ານການພິຈາລະນາຢ່າງງຽບໆກັບປະເພດ ໃດໆ, ອະນຸຍາດໃຫ້ຂໍ້ມູນທີ່ບໍ່ເຂົ້າກັນໄດ້ສະສົມໂດຍບໍ່ມີການເຕືອນຈົນກ່ວາຟັງຊັນ downstream ຂັດຂ້ອງໃນເວລາແລ່ນດ້ວຍ ປະເພດຂໍ້ຜິດພາດ ທີ່ເກືອບເປັນໄປບໍ່ໄດ້ທີ່ຈະຕິດຕາມກັບຕົ້ນກໍາເນີດຂອງມັນ.
ຕົວຢ່າງທີ່ຊັດເຈນ: ທີມງານຢູ່ໃນການເລີ່ມຕົ້ນຂອງ fintech ໄດ້ລາຍງານວ່າໃຊ້ເວລາ ສາມມື້ເພື່ອແກ້ໄຂບັນຫາການຜະລິດ ບ່ອນທີ່ບັນຊີລາຍຊື່ຫວ່າງເປົ່າ, ເລີ່ມຕົ້ນໃນຫນ້າທີ່ປະມວນຜົນການຈ່າຍເງິນ, ໄດ້ຖືກພິຈາລະນາເປັນ ລາຍຊື່[Any] ໂດຍ mypy. ລາຍຊື່ນີ້ຄວນຈະມີວັດຖຸ ເລກຖານສະນິຍົມ ສຳລັບຈຳນວນເງິນສະກຸນເງິນ, ແຕ່ເສັ້ນທາງລະຫັດນັ້ນຖືກຕໍ່ທ້າຍຄ່າ float ແທນ. ການອ້າງອິງທີ່ອ່ອນໂຍນຂອງ Mypy ໄດ້ອະນຸຍາດໃຫ້ມັນງຽບໆ. ແມງໄມ້ດັ່ງກ່າວປາກົດຢູ່ພຽງແຕ່ເມື່ອເກີດຄວາມຜິດພາດໃນການຄິດໄລ່ເລກຄະນິດແບບລອຍຕົວເຮັດໃຫ້ເກີດຄວາມແຕກຕ່າງ $0.01 ໃນໃບແຈ້ງໜີ້ 12,000 ໂດລາ. ຖ້າພວກເຂົາໃຊ້ pyright ໃນໂຫມດທີ່ເຄັ່ງຄັດ, ຫຼືພຽງແຕ່ຂຽນຫຍໍ້ຫນ້າຫວ່າງເປົ່າເປັນ list[Decimal], bug ຈະຖືກຈັບໃນເວລາພັດທະນາ.
ທີ່ Mewayz, ບ່ອນທີ່ແພລະຕະຟອມປະມວນຜົນໃບແຈ້ງໜີ້, ການຄິດໄລ່ເງິນເດືອນ ແລະການວິເຄາະທາງດ້ານການເງິນໃນທົ່ວບັນຊີຜູ້ໃຊ້ 138,000+, ຊ່ອງຫວ່າງດ້ານຄວາມປອດໄພປະເພດນີ້ບໍ່ແມ່ນທິດສະດີ — ມັນເປັນຄວາມແຕກຕ່າງລະຫວ່າງການແລ່ນບັນຊີເງິນເດືອນທີ່ຖືກຕ້ອງແລະການຄິດໄລ່ຄືນຄ່າໃຊ້ຈ່າຍ. ລະບຽບວິໄນການພິມຢ່າງເຂັ້ມງວດກ່ຽວກັບການເລີ່ມຕົ້ນບັນຈຸແມ່ນໜຶ່ງໃນການປະຕິບັດທາງວິສະວະກໍາທີ່ "ໜ້າເບື່ອ" ທີ່ປ້ອງກັນເຫດການການຜະລິດທີ່ໜ້າຕື່ນເຕັ້ນ.
ການປະຕິບັດທີ່ດີທີ່ສຸດສໍາລັບການເລີ່ມຕົ້ນການບັນຈຸປ້ອງກັນ
ບໍ່ວ່າທີມຂອງເຈົ້າຈະໃຊ້ຕົວກວດສອບປະເພດໃດ, ມີຍຸດທະສາດທີ່ແນ່ນອນເພື່ອກຳຈັດຄວາມບໍ່ຊັດເຈນຂອງຖັງທີ່ເປົ່າຫວ່າງທັງໝົດ. ເປົ້າໝາຍແມ່ນເພື່ອບໍ່ໃຫ້ອີງໃສ່ການອ້າງອີງສຳລັບຖັງເປົ່າ — ເຮັດໃຫ້ປະເພດຈະແຈ້ງເພື່ອໃຫ້ລະຫັດຂອງເຈົ້າສາມາດເຄື່ອນຍ້າຍໄດ້ທົ່ວທຸກຕົວກວດເຊັກ ແລະສາມາດຕ້ານທານກັບການປ່ຽນແປງພຶດຕິກຳການອ້າງອີງລະຫວ່າງລຸ້ນຕ່າງໆ.
- ຂຽນຄຳບັນຍາຍຕົວແປທີ່ເປົ່າຫວ່າງສະເໝີ. ຂຽນ ຜົນໄດ້ຮັບ: list[int] = [] ແທນທີ່ຈະເປັນ results = []. ຄ່າໃຊ້ຈ່າຍໃນການສະແດງຜົນເລັກນ້ອຍແມ່ນບໍ່ມີເຫດຜົນເມື່ອທຽບກັບເວລາທີ່ບັນທຶກການດີບັກ. ການປະຕິບັດອັນດຽວນີ້ຈະລົບລ້າງປະມານ 80% ຂອງບັນຫາ inference container ເປົ່າ.
- ໃຊ້ຟັງຊັນຂອງໂຮງງານສຳລັບບັນຈຸທີ່ຊັບຊ້ອນ. ແທນ cache = {}, ຂຽນຟັງຊັນເຊັ່ນ def make_cache() -> dict[str, list[UserRecord]]: return {}. ຄໍາອະທິບາຍປະເພດກັບຄືນເຮັດໃຫ້ປະເພດທີ່ຕັ້ງໃຈບໍ່ຊັດເຈນ ແລະເປັນເອກະສານດ້ວຍຕົນເອງ.
- ມັກຕົວສ້າງແບບພິມຫຼາຍກວ່າຕົວໜັງສືສຳລັບປະເພດທີ່ບໍ່ແມ່ນເລື່ອງເລັກໆນ້ອຍໆ. ຂຽນ items: set[int] = set() ແທນທີ່ແທນທີ່ຈະອີງໃສ່ການສັງລວມຄວາມເຂົ້າໃຈທີ່ກໍານົດໄວ້. ສໍາລັບ defaultdict ແລະ Counter, ສະເຫມີໃຫ້ພາລາມິເຕີປະເພດ: counts: Counter[str] = Counter().
- ຕັ້ງຄ່າໂໝດທີ່ເຂັ້ມງວດຂອງຕົວກວດປະເພດຂອງທ່ານສຳລັບລະຫັດໃໝ່. ທັງ mypy ແລະ pyright ຮອງຮັບການກຳນົດຄ່າຕໍ່ໄຟລ໌ ຫຼືຕໍ່ໄດເຣັກທໍຣີ. ເປີດໃຊ້ການກວດສອບຢ່າງເຂັ້ມງວດໃນໂມດູນໃຫມ່ໃນຂະນະທີ່ຄ່ອຍໆຍ້າຍລະຫັດເກົ່າ. ອັນນີ້ປ້ອງກັນການສະສົມຂອງຖັງບັນຈຸທີ່ພິມແບບບໍ່ຊັດເຈນ.
- ເພີ່ມການປຽບທຽບຕົວກວດສອບປະເພດໃສ່ທໍ່ CI ຂອງເຈົ້າ. ຖ້າຮູບແບບໃດນຶ່ງຜ່ານຕົວກວດໜຶ່ງແຕ່ບໍ່ສຳເລັດອີກອັນໜຶ່ງ, ມັນເປັນສັນຍານວ່າປະເພດນັ້ນບໍ່ຈະແຈ້ງພຽງພໍ.
ຮູບທີ່ໃຫຍ່ກວ່າ: ປະເພດການກວດສອບເປັນທີມປະຕິບັດ
ການອະພິປາຍພາຊະນະທີ່ເປົ່າຫວ່າງໃນທີ່ສຸດແມ່ນ microcosm ຂອງການທ້າທາຍທີ່ໃຫຍ່ກວ່າໃນລະບົບປະເພດຂອງ Python: ຄວາມເຄັ່ງຕຶງລະຫວ່າງຄວາມສະດວກແລະຄວາມປອດໄພ. ປັດຊະຍາຂອງ Python ຂອງ "ພວກເຮົາເປັນຜູ້ໃຫຍ່ທີ່ຍອມຮັບ" ເຮັດວຽກທີ່ສວຍງາມສໍາລັບການສ້າງຕົວແບບແລະສະຄິບ, ແຕ່ລະບົບການຜະລິດທີ່ໃຫ້ບໍລິການຜູ້ໃຊ້ຫລາຍພັນຄົນຕ້ອງການການຮັບປະກັນທີ່ເຂັ້ມແຂງກວ່າ. ຄວາມຈິງທີ່ວ່າຕົວກວດປະເພດໃຫຍ່ສີ່ຕົວບໍ່ເຫັນດີກັບບາງອັນທີ່ເປັນພື້ນຖານຂອງປະເພດຂອງ [] ເນັ້ນໃສ່ວ່າລະບົບນິເວດການພິມ Python ຍັງເຕີບໃຫຍ່ຢູ່.
ສຳລັບທີມງານວິສະວະກຳກໍ່ສ້າງແພລດຟອມທີ່ຊັບຊ້ອນ — ບໍ່ວ່າທ່ານຈະຈັດການ microservices ຈໍານວນໜຶ່ງ ຫຼືລະບົບປະສົມປະສານທີ່ມີຫຼາຍຮ້ອຍໂມດູນເຊື່ອມຕໍ່ກັນເຊັ່ນ: OS ທຸລະກິດຂອງ Mewayz — ຄໍາແນະນໍາພາກປະຕິບັດແມ່ນກົງໄປກົງມາ: ຢ່າອີງໃສ່ການສະຫຼຸບສໍາລັບພາຊະນະທີ່ຫວ່າງເປົ່າ, ເລືອກຕົວກວດປະເພດແລະກໍາຫນົດຄ່າມັນຢ່າງເຂັ້ມງວດ, ແລະປະຕິບັດຄໍາບັນຍາຍປະເພດເປັນເອກະສານທີ່ເກີດຂື້ນໄດ້. ຫ້ານາທີທີ່ໃຊ້ເວລາຂຽນ ລາຍຊື່[ໃບເກັບເງິນ] ແທນ [] ຈະຊ່ວຍປະຢັດທ່ານຫຼາຍຊົ່ວໂມງໃນການດີບັ໊ກ ເມື່ອລະຫັດຖານລະຫັດຂອງທ່ານ.
ໃນຖານະເປັນ PEP 696 (ພາຣາມິເຕີປະເພດເລີ່ມຕົ້ນ) ແລະ PEP 695 (ໄວຍະກອນພາຣາມິເຕີປະເພດ) ສືບຕໍ່ຢູ່ໃນສະບັບ Python ໃໝ່ກວ່າ, ຍຸຕິທຳຂອງການພິມທີ່ຈະແຈ້ງຈະສືບຕໍ່ປັບປຸງ. ຊ່ອງຫວ່າງລະຫວ່າງ "annotated" ແລະ "unannotated" Python ຈະແຄບລົງ. ແຕ່ຈົນກ່ວາມື້ນັ້ນ, ປະເພດຕູ້ຄອນເທນເນີທີ່ຊັດເຈນຍັງຄົງເປັນຫນຶ່ງໃນການປະຕິບັດທີ່ມີ ROI ສູງສຸດໃນຊຸດເຄື່ອງມືຂອງຜູ້ພັດທະນາ Python — ລະບຽບວິໄນຂະຫນາດນ້ອຍທີ່ຈ່າຍດອກເບ້ຍປະສົມໃນທົ່ວທຸກໂມດູນ, ທຸກໆການແລ່ນ, ແລະທຸກໆການຜະລິດການຜະລິດ.
ສ້າງ OS ທຸລະກິດຂອງທ່ານໃນມື້ນີ້
ຈາກນັກງານອິດສະລະເຖິງອົງການ, Mewayz ມອບອຳນາດໃຫ້ 138,000+ ທຸລະກິດດ້ວຍ 207 ໂມດູນປະສົມປະສານ. ເລີ່ມຟຣີ, ອັບເກຣດເມື່ອທ່ານເຕີບໃຫຍ່.
ສ້າງບັນຊີຟຣີ →ຄຳຖາມທີ່ຖາມເລື້ອຍໆ
ເປັນຫຍັງຈຶ່ງບໍ່ສາມາດພິມ checkers ຕົກລົງເຫັນດີກັບປະເພດຂອງບັນຊີລາຍການເປົ່າຫວ່າງ?
ເມື່ອທ່ານຂຽນ `x = []`, ຕົວກວດສອບປະເພດຕ້ອງສະແດງປະເພດໃດໜຶ່ງໂດຍບໍ່ມີຂໍ້ແນະນຳທີ່ຊັດເຈນ. checkers ທີ່ແຕກຕ່າງກັນໃຊ້ຍຸດທະສາດທີ່ແຕກຕ່າງກັນ: ບາງ infer `list[Any]` (ບັນຊີລາຍຊື່ຂອງສິ່ງໃດແດ່), ໃນຂະນະທີ່ຄົນອື່ນອາດຈະ infer ເປັນປະເພດສະເພາະຫຼາຍແຕ່ບໍ່ຖືກຕ້ອງເຊັ່ນ: `list[None]`. ການຂາດມາດຕະຖານສາກົນນີ້ແມ່ນເຫດຜົນທີ່ພວກເຂົາບໍ່ເຫັນດີນໍາ. ສໍາລັບໂຄງການທີ່ໃຊ້ checkers ຫຼາຍ, ຄວາມບໍ່ສອດຄ່ອງນີ້ສາມາດເປັນອາການເຈັບຫົວທີ່ສໍາຄັນ, ການວິເຄາະທີ່ແຕກຫັກໃນເຄື່ອງມືຫນຶ່ງທີ່ຜ່ານໃນອີກອັນຫນຶ່ງ.
ວິທີທີ່ງ່າຍທີ່ສຸດໃນການແກ້ໄຂຄວາມຜິດພາດພາຊະນະທີ່ເປົ່າຫວ່າງແມ່ນຫຍັງ?
ການແກ້ໄຂທີ່ກົງໄປກົງມາທີ່ສຸດແມ່ນການໃຫ້ຄໍາອະທິບາຍປະເພດທີ່ຊັດເຈນ. ແທນທີ່ຈະເປັນ `my_list = []`, ຂຽນ `my_list: list[str] = []` ເພື່ອປະກາດປະເພດທີ່ຕັ້ງໃຈໄວ້ຢ່າງຈະແຈ້ງ. ນີ້ ກຳ ຈັດຄວາມບໍ່ແນ່ນອນທັງ ໝົດ ສຳ ລັບຕົວກວດປະເພດ, ຮັບປະກັນການປະພຶດທີ່ສອດຄ່ອງໃນທົ່ວເຄື່ອງມືຕ່າງໆເຊັ່ນ mypy, Pyright, ແລະ Pyre. ການປະຕິບັດນີ້ແມ່ນແນະນໍາສໍາລັບການເລີ່ມຕົ້ນກ່ອງບັນຈຸເປົ່າທັງຫມົດເພື່ອປ້ອງກັນຄວາມຜິດພາດ inference.
ຂ້ອຍຈະຈັດການກັບພາຊະນະຫວ່າງເປົ່າພາຍໃນນິຍາມຂອງຊັ້ນຮຽນແນວໃດ?
ນີ້ເປັນບັນຫາທົ່ວໄປເນື່ອງຈາກວ່າຄໍາອະທິບາຍໃນຫ້ອງຮຽນຕ້ອງການການຈັດການພິເສດ. ທ່ານຕ້ອງໃຊ້ຄຳອະທິບາຍປະກອບການນຳເຂົ້າ `from __future__ import` ຫຼືຄຳອະທິບາຍປະກອບ `ClassVar` ຖ້າລາຍການມີຈຸດປະສົງເພື່ອເປັນຄຸນລັກສະນະຂອງຊັ້ນຮຽນ. ຕົວຢ່າງ, `class MyClass: my_list: ClassVar[list[str]] = []`. ຖ້າບໍ່ມີອັນນີ້, ຕົວກວດສອບປະເພດອາດຈະພະຍາຍາມຊີ້ບອກປະເພດຢ່າງຖືກຕ້ອງ, ນໍາໄປສູ່ຄວາມຜິດພາດ.
ມີເຄື່ອງມືເພື່ອຊ່ວຍຈັດການບັນຫາການພິມເຫຼົ່ານີ້ຢູ່ໃນໂຄງການຂະຫນາດໃຫຍ່ບໍ?
ແມ່ນແລ້ວ, ເຄື່ອງກວດປະເພດຂັ້ນສູງເຊັ່ນ Pyright (ເຊິ່ງໃຫ້ອຳນາດ Pylance ໃນ VS Code) ແມ່ນດີໂດຍສະເພາະໃນການຈັດການການສັງລວມທີ່ສັບສົນ. ສໍາລັບ codebases ຂະຫນາດໃຫຍ່, ເວທີເຊັ່ນ Mewayz (ສະເຫນີ 207 ໂມດູນການວິເຄາະສໍາລັບ $19 / ເດືອນ) ສາມາດສະຫນອງການກວດສອບປະເພດທີ່ເລິກເຊິ່ງ, ສອດຄ່ອງຫຼາຍກວ່າເກົ່າແລະຊ່ວຍບັງຄັບໃຊ້ການປະຕິບັດຄໍາບັນຍາຍໃນທົ່ວທີມງານຂອງທ່ານ, ຫຼຸດຜ່ອນຄວາມບໍ່ສອດຄ່ອງທີ່ໄດ້ສົນທະນາໃນບົດຄວາມ.
Try Mewayz Free
All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.
Get more articles like this
Weekly business tips and product updates. Free forever.
You're subscribed!
Start managing your business smarter today
Join 30,000+ businesses. Free forever plan · No credit card required.
Ready to put this into practice?
Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.
Start Free Trial →Related articles
Hacker News
Tennessee grandmother jailed after AI face recognition error links her to fraud
Mar 13, 2026
Hacker News
Shall I implement it? No
Mar 12, 2026
Hacker News
Innocent woman jailed after being misidentified using AI facial recognition
Mar 12, 2026
Hacker News
An old photo of a large BBS
Mar 12, 2026
Hacker News
Runners who churn butter on their runs
Mar 12, 2026
Hacker News
White House plan to break up iconic U.S. climate lab moves forward
Mar 12, 2026
Ready to take action?
Start your free Mewayz trial today
All-in-one business platform. No credit card required.
Start Free →14-day free trial · No credit card · Cancel anytime