Hacker News

Panagpada ti Python Type Checker: Empty Container Inference

Dagiti Komento

14 min read Via pyrefly.org

Mewayz Team

Editorial Team

Hacker News

Apay a Dagiti Empty Containers ket Mangburak kadagiti Python Type Checkers — Ken Ania ti Mabalinmo nga Aramiden Maipapan iti Daytoy

| Ngem adda di madmadlaw, makapaupay a suli ti sistema ti tipo a mangtibkol pay laeng uray kadagiti aduan kapadasan nga inheniero: ania a kita ti adda iti awan kargana a pagkargaan? No agsuratka iti x = [] nga awan ti anotasion, ti mangsukimat ti tipom ket masapul a mangpugto — ken dagiti nadumaduma a mangsukimat ket agpugtoda iti naiduma. Daytoy a panagsisina ket mangpartuat kadagiti pudno a parikut para kadagiti grupo a mangmantener kadagiti dadakkel a codebase, a sadiay ti panagbalbaliw wenno panagtipon kadagiti type checker ket mabalin a mangiruar kadagiti ginasut a di ninamnama a biddut iti maysa a rabii.

|

Ti Kangrunaan a Problema: Dagiti Empty Containers ket Nainkasigudan a Di masinunuo

Ibilang daytoy nga awan pagdaksanna a linia ti Python: results = []. Ti kadi resulta ket maysa a listaan[int]? Maysa a listaan[str]? Ti listaan[dict[str, Aniaman]]? No awan ti kanayonan a konteksto, pudno nga awan ti pamay-an a maammuan. Ti oras ti panagtaray ti Python ket saan a maseknan — dagiti listaan ​​ket heteroheno babaen ti nakaparsuaan — ngem dagiti agsukimat ti estatiko a tipo ket kasapulan a mangituding ti konkreto a kita iti tunggal maysa a variable tapno makaaramid ti trabahoda. Daytoy ket mangpartuat ti batayan a tension iti nagbaetan ti dinamiko a kinalukneng ti Python ken dagiti garantia a ti estatiko a panaganalisar ket padpadasenna nga ipaay.

Ti parikut ket agtipon kadagiti diksionario ken set. Ti awan kargana a {} ket aktual a naparpar a kas ti dict, saan a ti set, a manginayon ti sintaktiko a kinaawan patinggana iti rabaw ti kinaawan patinggana ti tipo-a-lebel. Ket dagiti naisanglad a paglaon — panunoten ti defaultdict(list) wenno results = {k: [] para iti k kadagiti tulbek} — iduron dagiti makina ti inperensia kadagiti limitasionda. Tunggal type checker ket nangaramid kadagiti bukodna a heuristiko, ken dagiti panagdumaduma ket ad-adu a naipangpangruna ngem ti kaaduan a developer ket makaammo.

Kadagiti sistema ti produksion a mangproseso kadagiti pudno a karga ti trabaho — urayno daytoy ket maysa a CRM a mangasikaso kadagiti rekord ti kostumer, ti maysa a modulo ti panag-invoice a mangpataud kadagiti banag ti linia, wenno ti maysa a tubo ti analitika a mangtipon kadagiti metriko — dagiti awan kargana a pagkargaan ket agparang a kankanayon a kas dagiti padron ti panangrugi. Ti di umiso a pananggun-od kadagiti kitada ket saan laeng a mangpataud kadagiti pakdaar ti linter; mabalinna a maskara dagiti pudno a bug a sumsumged agingga iti runtime.

Mypy: Naitantan nga Inperensia nga addaan iti Implisito nga Aniaman

Ti Mypy, ti kadaanan ken kaaduan a naadaptar a Python type checker, ket mangala ti relatibo a nalaka a wagas kadagiti awan kargana a pagkargaan. No daytoy ket makasabet ti x = [] iti sakop ti panagandar, daytoy ket padasenna nga itantan ti pangngeddeng ti tipo ken mangitudo ti kita ti elemento manipud iti sumaganad a panagusar. No isuratmo ti x = [] a sarunuen ti x.append(42), ti mypy ket mangitudo ti list[int]. Daytoy nga estratehia ti "panagtipon" ket agtrabaho a nakaskasdaaw a nasayaat para kadagiti diretso a kaso a ti paglaon ket napusek iti uneg ti isu met laeng a sakop.

Nupay kasta, ti kababalin ti mypy ket agbaliw unay depende kadagiti konteksto ken dagiti setting ti kinainget. Iti sakop ti modulo (ngato-nga-ngato a kodigo), wenno no ti paglaon ket maipasa iti sabali a panagandar sakbay a mapunno, ti mypy ket masansan a matnag manen iti listaan[Aniaman]. Iti baba ti bandera ti --strict, daytoy ket mangtignay ti biddut, ngem iti default a kasasaad ket siuulimek a lumabas. Kayatna a sawen a dagiti grupo a mangpatpataray ti mypy nga awan ti nainget a moda ket makaurnong kadagiti pinulpullo a naipasimudaag a nai-type a pagkargaan nga agtigtignay a kas dagiti panaglisi a hatches manipud iti sistema ti tipo, a mangparmek ti panggepna.

Maysa a partikular a nasipnget a kababalin: dagiti bersion ti mypy sakbay ti 0.990 ket sagpaminsan a mangitudo ti listaan[Di ammo] iti uneg ken kalpasanna palawaenna iti listaan[Aniaman] iti pannakaituding. Kalpasan ti 0.990, ti inperensia ket nainget, ngem ti panagbalbaliw ket nangburak ti nakaskasdaaw a bilang dagiti pudno a lubong a codebase a nagpannuray idi iti mangipalubos a kababalin a saan a napupuotan. Daytoy ket maulit-ulit a tema — dagiti panagbalbaliw iti empty container inference ket karaman kadagiti kaaduan a makariribuk a panagpabaro ti type checker gapu ta dagiti padron ket adda unay iti amin a lugar.

Pyright: Nainget a Panangipapan ken ti "Di Ammo" a Kita

Ti Pyright, a pinarang-ay babaen ti Microsoft ken mangpabileg ti Pylance iti VS Code, ket mangala ti pundamental a naiduma a pilosopikal a takder. Imbes a siuulimek nga agsubli iti Aniaman, ti pyright ket mangilasin ti nagbaetan ti Di ammo (maysa a kita a saan pay a naikeddeng) ken Aniaman (maysa a nalawag a panagkedked iti panagsukimat ti tipo). No isuratmo ti x = [] iti nainget a kasasaad ti pyright, daytoy ket mangitudo ti listaan[Di ammo] ken mangipadamag ti maysa a diagnostiko, a mangpilit kenka a mangipaay ti anotasion.

Ad-adda met nga agresibo ni Pyright maipapan iti panagkidem iti uneg ti sakup. No agsuratka:

  • x = [] a sarunuen ti x.append("hello") — ti pyright ket mangitudo ti listaan[str]
  • x = [] a sarunuen ti x.append(1) kalpasanna x.append("hello") — ti pyright ket mangitudo ti listaan[int | str]
  • x = [] naipasa a direkta iti maysa a panagandar a mangnamnama ti list[int] — ti pyright ket mangitudo ti listaan[int] manipud iti konteksto ti call-site
  • x = [] naisubli manipud iti panagandar nga awan ti anotasion ti kita ti panagsubli — ti pyright ket mangipadamag ti biddut imbes a ti panagpugto

Daytoy a bidireksional a panagipapan (nga agus-usar ti agpada a sumaganad a panagusar ken dagiti manamnama a kita manipud kadagiti lugar ti panagayab) ket mangaramid ti pyright a naipangpangruna nga ad-adda nga eksakto ngem ti mypy para kadagiti awan kargana a pagkargaan. Ti panagtagilako ket ti berbosidad: ti nainget a moda ti pyright ket mangibandilia kadagiti agarup a 30-40% nga ad-adu nga isyu iti gagangay nga awan ti anotasion a codebase no maidilig iti nainget a moda ti mypy, segun ti panaganalisar manipud kadagiti sumagmamano a reporta ti panagiyakar ti silulukat a taudan. Para kadagiti grupo a mangbangbangon kadagiti komplikado a sistema ti backend — kunaen, ti maysa a plataporma a mangiturturong kadagiti 207 a nagsisilpo a modulo a mangsaklaw ti CRM, payroll, ken analytics — ti kinainget ti pyright ket mangtiliw kadagiti nasipnget nga interface a di panagtunos a ti lenient inference ket malipatan.

Pytype ken Pyre: Dagiti Basbassit a Nadaliasat a Kalsada

Ti pytype ti Google ket mangala ti nalabit kaaduan a pragmatiko a wagas. Imbes a kasapulan dagiti anotasion wenno agsubli iti Aniaman, ti pytype ket agus-usar ti panag-analisar ti sibubukel-a-programa tapno masurot no kasano a maus-usar ti maysa a paglaon iti ballasiw dagiti pagbeddengan ti panagandar. No mangpartuat ti bakante a listaan ​​iti maysa a panagandar ken ipasa daytoy iti sabali a mangikabil kadagiti intero a bilang, ti pytype ket masansan a mabalinna nga ipapan ti listaan[int] nga awan ti ania man nga anotasion a pulos. Daytoy a cross-function inference ket nangina iti komputasional — ti pytype ket nangruna a nabannayat ngem ti mypy wenno pyright kadagiti dadakkel a codebase — ngem daytoy ket mangpataud kadagiti basbassit nga ulbod a positibo kadagiti saan nga annotated a kodigo.

Ti

Ti Pytype ket mangiyam-ammo pay ti konsepto ti "dagiti paset a kita" para kadagiti awan kargana a pagkargaan. Ti baro a naparsua a [] ket makagun-od ti paset a kita a progresibo a napinpintas bayat a ti mangsukimat ket makasabet ti ad-adu a panagusar. Daytoy ket konsepto nga elegante ngem mabalin a mangpataud kadagiti makariro a mensahe ti biddut no ti paset a kita ket saan a naan-anay a marisut, a kas no ti maysa nga awan kargana a pagkargaan ket agayus babaen dagiti sumagmamano a panagandar a saan a pulos a mapunno.

💡 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 →

Ti pira ni Meta, bayat, ket ag-hew nga as-asideg iti kababalin ni mypy ngem addaan kadagiti naing-inget a default. Ti Pyre ket mangtrato ti x = [] a kas listaan[di ammo] ken agkasapulan ti anotasion kadagiti kaaduan a konteksto. Sadino a ti pyre ket mangilasin ti bagina ket iti panagtengngelna kadagiti empty dictionary literals a maus-usar a kas kwargs — ti gagangay a padron kadagiti balangkas ti web. Ti Pyre ket addaan iti naisangayan-a-kaso a lohika tapno mangitudo kadagiti kita ti diksionario manipud kadagiti konteksto ti argumento ti nasken a balikas, a mangkissay ti dadagsen ti anotasion kadagiti balangkas-a-nadagsen a kodigo a batayan. No maited a kaaduan kadagiti moderno nga aplikasion ti web ket mairaman ti nadagsen a panagusar ti panaglukat ti diksionario para iti panagisaad ken panagtengngel ti kiddaw, daytoy a pragmatismo ket agbayad kadagiti dibision.

Pudno-a-Lubong nga Epekto: No Ti Panagsisina ti Inperensia ket Kagat

Dagiti panagdumaduma dagiti agsuksukisok ti tipo ket mabalin a kasla akademiko aginggana a mapasaranmo dagitoy iti maysa a kodigo ti produksion. Ibilang ti gagangay a padron kadagiti aplikasion ti negosio: panangirugi ti estruktura ti datos a makapunno a kondisional.

|
nga

Ti konkreto a pagarigan: ti maysa a grupo iti maysa a fintech startup ket nangipadamag ti panangbusbos ti tallo nga aldaw a mang-debug ti maysa nga isyu ti produksion a sadiay ti maysa nga empty list, a nairugi iti maysa a panagproseso ti panagbayad a panagandar, ket naipanunotan a kas list[Any] babaen ti mypy. Ti listaan ​​ket naipagarup a naglaon kadagiti banag ti Desimal para kadagiti gatad ti kuarta, ngem ti maysa a dalan ti kodigo ket mangikabil kadagiti pateg ti float imbes a. Siuulimek a pinalubosan dayta ti naasi a panangipapan ni Mypy. Ti bug ket rimsua laeng idi dagiti biddut ti panagtimbukel iti float arithmetic ket nakaigapuan ti $0.01 a panagdumaduma iti maysa a batch ti 12,000 nga invoice. No nagusarda koma iti pyright iti nainget a kasasaad, wenno basta in-anotateda ti empty list a kas list[Decimal], ti bug ket natiliwan koma iti panawen ti panagrang-ay.

Iti Mewayz, a sadiay ti plataporma ket mangproseso ti panag-invoice, panagkarkulo ti payroll, ken pinansia nga analitiko iti ballasiw ti 138,000+ nga account ti agar-aramat, daytoy a kita ti type-safety gap ket saan a teoretikal — daytoy ti nagdumaan ti umiso a panagtaray ti payroll ken dagiti nagastos a panagkalkula manen. Ti nainget a disiplina ti panagimakinilia iti aglawlaw ti panangrugi ti paglaon ket maysa kadagidiay a "makauma" nga aramid ti inhenieria a manglapped kadagiti makapagagar nga insidente ti produksion.

Dagiti Kasayaatan nga Ar-aramid para iti Depensa a Panangrugi ti Laon

Uray ania a type checker ti us-usaren ti grupom, adda dagiti konkreto nga estratehia tapno maikkat a naan-anay ti empty container ambiguity. Ti panggep ket saan a pulos nga agpannuray iti panagipapan para kadagiti awan kargana a pagkargaan — aramiden a nalawag ti kita tapno ti kodigom ket mayakar iti ballasiw dagiti amin a tseker ken saan a makabael kadagiti panagbalbaliw ti kababalin ti panagipapan iti nagbaetan dagiti bersion.

  1. Kanayon nga i-anotate dagiti awan kargana a paglaon a variable. Isurat ti results: list[int] = [] imbes a results = []. Ti bassit a gastos ti berbosidad ket saan unay a maidilig iti naisalakan nga oras ti panag-debug. Daytoy a maymaysa nga aramid ket mangikkat ti agarup a 80% kadagiti isyu ti panagipapan ti empty container.
  2. Aramaten dagiti panagandar ti pabrika para kadagiti komplikado a paglaon. Imbes a cache = {}, agsurat ti panagandar a kas ti def make_cache() -> dict[str, list[UserRecord]]: agsubli ti {}. Ti anotasion ti kita ti panagsubli ket mangaramid ti nairanta a kita a saan a napagduaduaan ken bukod a mangdokumento.
  3. Kaykayat dagiti nai-type a konstruktor ngem dagiti literal para kadagiti saan a trivial a kita. Isurat dagiti items: set[int] = set() imbes nga agpannuray iti set comprehension inference. Para iti defaultdict ken Counter, kanayon nga ipaay ti parametro ti tipo: counts: Counter[str] = Counter().
  4. Ikonfigura ti nainget a wagas ti type checker-mo para iti baro a kodigo. Agpada a ti mypy ken pyright ket mangsuporta iti tunggal-file wenno tunggal-direktorio a panagisaad. Pagbalinen ti nainget a panagsukimat kadagiti baro a modulo bayat nga in-inut a panagiyakar ti legacy code. Daytoy ket manglapped ti panagurnong dagiti baro nga implisito-a-nai-type a pagkargaan.
  5. Inayon ti panagidilig ti type checker iti CI pipeline mo. Ti panagtaray ti agpada a mypy ken pyright iti codebase mo ket makatiliw ti inference divergence a nasapa. No ti maysa a padron ket lumabas ti maysa a tseker ngem mapaay ti sabali, daytoy ket maysa a senial a ti kita ket saan nga umdas a nalawag.

Ti Dakdakkel a Ladawan: Ti Panagsukimat ti Tipo a kas maysa a Panagsanay ti Team

Ti empty container inference ket kamaudiananna maysa a mikrokosmo ti dakdakkel a karit iti sistema ti tipo ti Python: ti tension iti nagbaetan ti kombeniente ken kinatalged. Ti pilosopia ti Python a "agtutunoskami amin nga adulto" ket napintas nga agtrabaho para iti panagprototipo ken dagiti iskrip, ngem dagiti sistema ti produksion a mangserserbi kadagiti rinibu nga agar-aramat ket kasapulan dagiti napigpigsa a garantia. Ti kinapudno nga uppat a nangruna a mangsukimat ti tipo ket saan nga agtutunos iti maysa a banag a kas ti batayan a kas ti kita ti [] ket mangitag-ay a ti ekosistema ti panagimakinilia ti Python ket agmatmataengan pay laeng.

| mapaneknekan ti makina. Ti lima a minuto a nabusbos iti panagsurat ti list[Invoice] imbes a [] ket mangispal kenka kadagiti oras ti panag-debug no ti codebase-mo ket ag-scale.

Kas ti PEP 696 (dagiti kasisigud a parametro ti tipo) ken PEP 695 (sintaksis ti parametro ti tipo) ket agtultuloy nga agdisso kadagiti baro a bersion ti Python, ti ergonomika ti nalawag a panagimakinilia ket agtultuloy a sumayaat. Ti giwang iti nagbaetan ti "annotated" ken "unnotated" a Python ket akikidto. Ngem aginggana iti dayta nga aldaw, dagiti nalawag a kita ti paglaon ket agtalinaed a maysa kadagiti kangatuan-ROI nga aramid iti toolkit ti agparparang-ay ti Python — ti bassit a disiplina a mangbayad ti kompuesto nga interes iti ballasiw ti tunggal maysa a modulo, tunggal maysa nga sprint, ken tunggal maysa a panagipakat ti produksion.

Ibangon ti OS ti Negosyom Ita nga aldaw

Manipud kadagiti freelancer aginggana kadagiti ahensia, ti Mewayz ket mangpabileg kadagiti 138,000+ a negosio nga addaan kadagiti 207 a naikaykaysa a modulo. Mangrugika a libre, ag-upgrade inton dumakkelka.

Mangaramid ti Libre nga Kuenta →

Dagiti Masansan a Saludsod

Apay a saan a makapagtutunos dagiti mangsukimat ti tipo iti kita ti awan kargana a listaan?

No isuratmo ti `x = []`, ti mangsuksukimat ti tipo ket masapul a mangitudo ti maysa a kita nga awan dagiti nalawag a pammalubos. Dagiti nadumaduma a tseker ket agus-usar kadagiti nadumaduma nga estratehia: dagiti dadduma ket mangitudo ti `listaan[Aniaman]` (maysa a listaan ​​ti ania man), bayat a dagiti dadduma ket mabalinda nga ipapan ti ad-adu nga espesipiko ngem saan nga umiso a kita a kas ti `listaan[Awan]`. Daytoy a kinaawan ti sapasap a pagalagadan ti makagapu a dida agtutunos. Para kadagiti proyekto nga agus-usar kadagiti adu a tseker, daytoy a saan a panagtutunos ket mabalin a maysa a nangruna a sakit ti ulo, a mangburak ti panaganalisar iti maysa nga alikamen a lumabas iti sabali.

Ania ti kasimplean a wagas tapno matarimaan dagiti biddut ti empty container?

Ti kaaduan a diretso a solusion ket ti panangipaay ti nalawag nga anotasion ti tipo. Imbes a ti `my_list = []`, isurat ti `my_list: list[str] = []` tapno nalawag nga ideklara ti nairanta a kita. Daytoy ket mangikkat amin nga ambiguidad para iti type checker, a mangipasigurado ti agtultuloy a kababalin iti ballasiw dagiti nadumaduma nga alikamen a kas ti mypy, Pyright, ken Pyre. Daytoy nga aramid ket mairekomendar para kadagiti amin nga empty container initializations tapno malapdan dagiti biddut ti inference.

Kasano ti panangtamingko kadagiti awan kargana a pagkargaan iti uneg dagiti depinasion ti klase?

Daytoy ket gagangay nga isyu gapu ta dagiti anotasion iti uneg dagiti klase ket agkasapulan ti naisangayan a panagtengngel. Masapul nga usarem ti `manipud kadagiti __future__ nga anotasion ti panagala` a panagala wenno ti anotasion ti `ClassVar` no ti listaan ​​ket nairanta nga agbalin a maysa a kababalin ti klase. Kas pagarigan, `klase ti Klasek: listaan_ko: ClassVar [listaan ​​[str]] = []`. No awan daytoy, ti mangsuksukimat ti tipo ket mabalin a marigatan nga umiso a mangitudo ti tipo, a mangiturong kadagiti biddut.

Adda kadi dagiti ramit a makatulong a mangituray kadagitoy nga isyu ti panagimakinilia kadagiti dadakkel a proyekto?

Wen, dagiti narang-ay a type checker a kas ti Pyright (a mangpabileg ti Pylance iti VS Code) ket nangruna a nalaing iti panangtaming ti komplikado nga inperensia. Para kadagiti dadakkel a codebase, dagiti plataporma a kas ti Mewayz (a mangitukon kadagiti 207 a modulo ti panaganalisar para iti $19/bulan) ket makaipaay ti naun-uneg, ad-adu a maitunos a panagsukimat ti tipo ken makatulong a mangipatungpal kadagiti aramid ti anotasion iti ballasiw ti sibubukel a grupom, a mangpabassit kadagiti saan a panagtutunos a naipalawag iti artikulo.

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