Hacker News

Python Type Checker Comparison: Empty Container Inference

ຄຳເຫັນ

2 min read Via pyrefly.org

Mewayz Team

Editorial Team

Hacker News

ເປັນ​ຫຍັງ​ພາ​ຊະນະ​ຫວ່າງ​ເປົ່າ​ທຳລາຍ​ຕົວ​ກວດ​ສອບ​ປະ​ເພດ 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+, ຊ່ອງຫວ່າງດ້ານຄວາມປອດໄພປະເພດນີ້ບໍ່ແມ່ນທິດສະດີ — ມັນເປັນຄວາມແຕກຕ່າງລະຫວ່າງການແລ່ນບັນຊີເງິນເດືອນທີ່ຖືກຕ້ອງແລະການຄິດໄລ່ຄືນຄ່າໃຊ້ຈ່າຍ. ລະບຽບວິໄນການພິມຢ່າງເຂັ້ມງວດກ່ຽວກັບການເລີ່ມຕົ້ນບັນຈຸແມ່ນໜຶ່ງໃນການປະຕິບັດທາງວິສະວະກໍາທີ່ "ໜ້າເບື່ອ" ທີ່ປ້ອງກັນເຫດການການຜະລິດທີ່ໜ້າຕື່ນເຕັ້ນ.

ການປະຕິບັດທີ່ດີທີ່ສຸດສໍາລັບການເລີ່ມຕົ້ນການບັນຈຸປ້ອງກັນ

ບໍ່​ວ່າ​ທີມ​ຂອງ​ເຈົ້າ​ຈະ​ໃຊ້​ຕົວ​ກວດ​ສອບ​ປະ​ເພດ​ໃດ, ມີ​ຍຸດ​ທະ​ສາດ​ທີ່​ແນ່​ນອນ​ເພື່ອ​ກຳ​ຈັດ​ຄວາມ​ບໍ່​ຊັດ​ເຈນ​ຂອງ​ຖັງ​ທີ່​ເປົ່າ​ຫວ່າງ​ທັງ​ໝົດ. ເປົ້າໝາຍແມ່ນເພື່ອບໍ່ໃຫ້ອີງໃສ່ການອ້າງອີງສຳລັບຖັງເປົ່າ — ເຮັດໃຫ້ປະເພດຈະແຈ້ງເພື່ອໃຫ້ລະຫັດຂອງເຈົ້າສາມາດເຄື່ອນຍ້າຍໄດ້ທົ່ວທຸກຕົວກວດເຊັກ ແລະສາມາດຕ້ານທານກັບການປ່ຽນແປງພຶດຕິກຳການອ້າງອີງລະຫວ່າງລຸ້ນຕ່າງໆ.

  1. ຂຽນ​ຄຳ​ບັນ​ຍາຍ​ຕົວ​ແປ​ທີ່​ເປົ່າ​ຫວ່າງ​ສະເໝີ. ຂຽນ ຜົນ​ໄດ້​ຮັບ: list[int] = [] ແທນ​ທີ່​ຈະ​ເປັນ results = []. ຄ່າໃຊ້ຈ່າຍໃນການສະແດງຜົນເລັກນ້ອຍແມ່ນບໍ່ມີເຫດຜົນເມື່ອທຽບກັບເວລາທີ່ບັນທຶກການດີບັກ. ການປະຕິບັດອັນດຽວນີ້ຈະລົບລ້າງປະມານ 80% ຂອງບັນຫາ inference container ເປົ່າ.
  2. ໃຊ້ຟັງຊັນຂອງໂຮງງານສຳລັບບັນຈຸທີ່ຊັບຊ້ອນ. ແທນ cache = {}, ຂຽນຟັງຊັນເຊັ່ນ def make_cache() -> dict[str, list[UserRecord]]: return {}. ຄໍາອະທິບາຍປະເພດກັບຄືນເຮັດໃຫ້ປະເພດທີ່ຕັ້ງໃຈບໍ່ຊັດເຈນ ແລະເປັນເອກະສານດ້ວຍຕົນເອງ.
  3. ມັກຕົວສ້າງແບບພິມຫຼາຍກວ່າຕົວໜັງສືສຳລັບປະເພດທີ່ບໍ່ແມ່ນເລື່ອງເລັກໆນ້ອຍໆ. ຂຽນ items: set[int] = set() ແທນທີ່ແທນທີ່ຈະອີງໃສ່ການສັງລວມຄວາມເຂົ້າໃຈທີ່ກໍານົດໄວ້. ສໍາລັບ defaultdict ແລະ Counter, ສະເຫມີໃຫ້ພາລາມິເຕີປະເພດ: counts: Counter[str] = Counter().
  4. ຕັ້ງຄ່າໂໝດທີ່ເຂັ້ມງວດຂອງຕົວກວດປະເພດຂອງທ່ານສຳລັບລະຫັດໃໝ່. ທັງ mypy ແລະ pyright ຮອງຮັບການກຳນົດຄ່າຕໍ່ໄຟລ໌ ຫຼືຕໍ່ໄດເຣັກທໍຣີ. ເປີດໃຊ້ການກວດສອບຢ່າງເຂັ້ມງວດໃນໂມດູນໃຫມ່ໃນຂະນະທີ່ຄ່ອຍໆຍ້າຍລະຫັດເກົ່າ. ອັນນີ້ປ້ອງກັນການສະສົມຂອງຖັງບັນຈຸທີ່ພິມແບບບໍ່ຊັດເຈນ.
  5. ເພີ່ມການປຽບທຽບຕົວກວດສອບປະເພດໃສ່ທໍ່ 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.

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 →

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