Hacker News

Okugerageranya Omukebere w'Ekika kya Python: Okuteebereza kwa Konteyina Ekyerere

Ebiteeso

11 min read Via pyrefly.org

Mewayz Team

Editorial Team

Hacker News

Lwaki Ebintu Ebitaliimu Bimenya Ebikebera Ebika bya Python — Ne By’osobola Okubikolako

Enkola ya Python ey'okuwandiika mpolampola ekula nnyo okuva PEP 484 lwe yaleeta obubonero bw'ekika mu 2015. Leero, obukadde n'obukadde bw'abakola beesigamye ku bakebera ekika ekitali kikyukakyuka okukwata obuzibu nga tebannakuba kukola. Naye waliwo enkoona entegeke, enyiiza ey’enkola y’ekika eky’okugwa waggulu ne bayinginiya abalina obumanyirivu: kika ki ekibya ekyerere kirina? Bw’owandiika x = [] nga tolina bugambo bunnyonnyola, omukebera ekika kyo alina okuteebereza — era abakebera ab’enjawulo bateebereza mu ngeri ya njawulo. Okwawukana kuno kuleeta obuzibu obw’amazima eri ttiimu ezikuuma codebases ennene, nga okukyusa oba okugatta ebikebera ekika kiyinza okuvaayo ebikumi n’ebikumi by’ensobi ezitasuubirwa mu kiro kimu.

Ekiwandiiko kino kimenya engeri abakebera ekika kya Python abana abakulu — mypy, pyright, pytype, ne pyre — gye bakwatamu okuteebereza kw’ekintu ekyerere, lwaki tebakkiriziganya, n’obukodyo ki obw’omugaso bw’oyinza okwettanira okuwandiika Python etali ya bulabe eri ekika awatali kulowooza ku ky’olonze eky’ebikozesebwa.

Ekizibu Ekikulu: Ebidomola Ekyerere Mu Buzaale Tebirina Buzibu

Lowooza ku layini eno etaliiko bulabe eya Python: results = []. ebivuddemu lukalala[int]? Olukalala lwa [str]? Olukalala lwa [dict[str, Any]]? Awatali nsonga eyongezeddwayo, mu butuufu tewali ngeri yonna gye tuyinza kumanya. Ekiseera ky’okudduka ekya Python tekifaayo — enkalala za njawulo mu butonde — naye abakebera ekika ekitali kikyukakyuka beetaaga okugaba ekika ekikakafu ku buli nkyukakyuka okukola omulimu gwabwe. Kino kireeta okusika omuguwa okw’omusingi wakati w’okukyukakyuka kwa Python okw’amaanyi n’obukakafu okwekenneenya okutambula obutakyuka kwe kugezaako okuwa.

Ekizibu kyegatta ne nkuluze ne seti. {} etaliimu mu butuufu esengekebwa nga dict, so si set, eyongera obutategeeragana mu nsengeka waggulu w’obutategeeragana obw’omutendera gw’ekika. Era ebitereke ebiteekeddwa mu biyumba — lowooza defaultdict(list) oba ebivuddemu = {k: [] ku k mu bisumuluzo} — bisika yingini z’okuteebereza okutuuka ku kkomo lyazo. Buli mukebera ekika akoze heuristics ye, era enjawulo zino za maanyi nnyo okusinga abakola abasinga bwe bakitegeera.

Mu nkola z’okufulumya ezikola ku mirimu egy’amazima — ka kibeere CRM ekwata ebiwandiiko bya bakasitoma, modulo ya invoice ekola ebintu bya layini, oba payipu y’okwekenneenya egatta ebipimo — konteyina ekyerere zirabika buli kiseera ng’enkola z’okutandika. Okufuna ebika byabwe mu bukyamu tekikoma ku kuleeta kulabula kwa linter; kiyinza okukweka ebiwuka ebya nnamaddala ebiseeyeeya okuyita mu kiseera ky'okudduka.

Mypy: Okuteebereza okuddirira nga kuliko ekintu kyonna ekitegeerekeka

Mypy, eky'okukebera ekika kya Python ekisinga obukadde era ekisinga okukozesebwa, kikwata enkola etali ya maanyi nnyo ku bibya ebitalimu kintu kyonna. Bwe kisisinkana x = [] ku buwanvu bw'omulimu, kigezaako okuyimirizaawo okusalawo kw'ekika n'okuteebereza ekika ky'ekintu okuva mu nkozesa eddako. Singa owandiika x = [] n'ogobererwa x.append(42), mypy ejja kuteebereza list[int]. Enkola eno eya "kugatta" ekola bulungi mu ngeri eyeewuunyisa ku mbeera ezitereevu nga ekibya kijjudde mu kifo kye kimu.

Wabula, enneeyisa ya mypy ekyuka nnyo okusinziira ku mbeera n'ensengeka z'obukakafu. Ku module scope (top-level code), oba nga container eyisibwa ku function endala nga tennajjula, mypy etera okugwa ku list[Any]. Wansi wa --strict bendera, kino kireeta ensobi, naye mu mbeera esookerwako kiyita mu kasirise. Kino kitegeeza nti ttiimu eziddukanya mypy awatali mode nkakafu zisobola okukung’aanya amakumi g’ebintu ebiwandiikiddwa mu ngeri etegeerekeka ebikola ng’ebisenge ebidduka okuva mu nkola y’ekika, ne bimegga ekigendererwa kyayo.

Enneeyisa emu naddala etali ya bulijjo: enkyusa za mypy nga 0.990 tezinnabaawo oluusi zandifudde list[Unknown] munda n'oluvannyuma ne zigaziwa okutuuka ku list[Any] ku kugaba. Oluvannyuma lwa 0.990, okuteebereza kwanywezebwa, naye enkyukakyuka yamenya omuwendo ogwewuunyisa ogwa codebases ez’ensi entuufu ezaali zeesigamye ku nneeyisa ekkiriza nga tezitegedde. Guno mulamwa oguddirira — enkyukakyuka mu inference ya container empty bye bimu ku bisinga okutaataaganya type checker updates kubanga patterns ziri buli wamu nnyo.

Pyright: Okuteebereza okukakali n'Ekika "Ekitamanyiddwa"

Pyright, eyakolebwa Microsoft era ng’ewa Pylance amaanyi mu VS Code, ekwata enkola ey’obufirosoofo ey’enjawulo mu musingi. Mu kifo ky’okugwa mu kasirise okudda ku Any, pyright eyawula wakati wa Ekitamanyiddwa (ekika ekitannaba kutegeerekeka) ne Any (okukebera ekika eky’olwatu). Bw'owandiika x = [] mu mbeera ya pyright enkakali, etegeeza list[Unknown] era n'etegeeza ku kuzuula, ekikuwaliriza okuwa obugambo.

Pyright era asinga kukola busungu ku okufunza mu buwanvu. Bw’oba owandiika:

  • x = [] nga egobererwa x.append("hello") — pyright etegeeza olukalala[str]
  • x = [] nga egobererwa x.append(1) olwo x.append("hello") — pyright etegeeza olukalala[int | str]
  • nga bwe kiri
  • x = [] eyisibwa butereevu ku mulimu ogusuubira list[int] — pyright etegeeza list[int] okuva mu mbeera y'ekifo ky'okuyita
  • x = [] ekomezeddwawo okuva mu kikolwa awatali kunnyonnyola kika kya kudda — pyright etegeeza ensobi okusinga okuteebereza

Okuteebereza kuno okw'enjuyi bbiri (nga tukozesa byombi enkozesa eddirira n'ebika ebisuubirwa okuva mu bifo eby'okuyita) efuula pyright notably okubeera entuufu okusinga mypy ku bidomola empty. Okusuubulagana kwa verbosity: pyright's strict mode flags nga 30-40% more issues ku codebase eyabulijjo etaliiko bubonero bw'ogeraageranya ne strict mode ya mypy, okusinziira ku kwekenneenya okuva mu lipoota eziwerako ez'okusenguka eziggule. Ku ttiimu ezizimba enkola enzibu ez’emabega — tugambe, omukutu oguddukanya modulo 207 ezikwatagana ezikwata ku CRM, payroll, n’okwekenneenya — obukakafu bwa pyright bukwata obutakwatagana obutonotono obw’enkolagana (subtle interface mismatches) nti lenient inference yandisubiddwa.

Pytype ne Pyre: Enguudo ezitatambula nnyo

Pytype ya Google etwala mpozzi enkola esinga okukola. Mu kifo ky’okwetaaga obugambo oba okudda emabega ku Any, pytype ekozesa okwekenneenya pulogulaamu yonna okulondoola engeri ekintu gye kikozesebwamu okuyita ku nsalo z’emirimu. Singa okola olukalala ekyerere mu mulimu gumu n'oguyisa ku mulala ogugattako namba enzijuvu, pytype etera okuteebereza list[int] awatali bunnyonnyola bwonna n'akatono. Okuteebereza kuno okw’emirimu egy’omusalaba kwa bbeeyi mu kubalirira — pytype egenda mpola nnyo okusinga mypy oba pyright ku codebases ennene — naye efulumya ebirungi ebitono eby’obulimba ku koodi ezitaliiko bubonero.

Pytype era eyanjulira endowooza ya "ebika by'ekitundu" ku bibya ebitalimu kintu kyonna. [] eyaakatondebwa efuna ekika ky'ekitundu ekigenda kirongoosebwa nga omukebera asisinkana enkozesa okusingawo. Kino kinyuma mu ndowooza naye kiyinza okuvaamu obubaka bw’ensobi obutabula ng’ekika ky’ekitundu tekisobola kugonjoolwa mu bujjuvu, gamba nga ekintu ekyerere bwe kikulukuta okuyita mu mirimu egiwerako nga tekijjula.

💡 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, mu kiseera kino, hews okumpi n'enneeyisa ya mypy naye nga tighter defaults. Pyre etwala x = [] nga list[unknown] era yeetaaga okunnyonnyola mu mbeera ezisinga obungi. Pyre we yeeyawula eri mu ngeri gye yeekwatamu empty dictionary literals ezikozesebwa nga kwargs — enkola eya bulijjo mu web frameworks. Pyre erina ensonga ey’enjawulo okuteebereza ebika by’enkuluze okuva mu mbeera z’ensonga z’ebigambo ebikulu, okukendeeza ku buzito bw’obunnyonnyola mu codebases ezizitowa framework. Okusinziira ku ngeri enkola z’omukutu ezisinga ez’omulembe zizingiramu okukozesa ennyo okusumulula nkuluze okusobola okusengeka n’okukwata okusaba, enkola eno ey’okukola (pragmatism) esasula amagoba.

Ekikosa Ensi Entuufu: Nga Inference Divergence Eluma

Enjawulo wakati w'abakebera ekika ziyinza okulabika ng'ez'eby'ensoma okutuusa lw'ozifuna mu codebase y'okufulumya. Lowooza ku nkola eya bulijjo mu nkola za bizinensi: okutandikawo ensengeka ya data efuna okujjula mu bukwakkulizo.

Ebitereke eby’obulabe ebisinga okuba eby’obulabe si bye bendera y’abakebera ekika — bye biyita mu kasirise n’ekika kya Any ekiteeberezebwa, nga kisobozesa data ezitakwatagana okukuŋŋaanyizibwa awatali kulabula okutuusa ng’omulimu ogw’okunsi gugwa mu kiseera ky’okudduka n’ekintu TypeError kumpi ekitasoboka kulondoola kudda ku nsibuko yaakyo.

nga bwe kiri

Ekyokulabirako ekituufu: ttiimu ku ntandikwa ya fintech yategeeza nti yamala ennaku ssatu ng’etereeza ensonga y’okufulumya ng’olukalala olwereere, olwatandikibwawo mu mulimu gw’okukola ku kusasula, lwategeezebwa nga list[Any] nga mypy. Olukalala lwalina okubaamu ebintu Decimal eby'omuwendo gw'ensimbi, naye ekkubo lya koodi lyali ligattako emiwendo gya float mu kifo ky'ekyo. Mypy’s lenient inference mu kasirise yakikkiriza. Ekizibu kino kyavaayo yokka ensobi mu kuzingulula mu kubala kwa float bwe zaaleeta obutakwatagana bwa doola 0.01 ku kibinja kya invoice 12,000. Singa baali bakozesezza pyright mu mbeera enkakali, oba okumala gawandiika ku lukalala ekyerere nga list[Decimal], ekizibu kyandibadde kikwatiddwa mu kiseera ky'enkulaakulana.

Ku Mewayz, omukutu gye gukola ku invoice, okubala omusaala, n’okwekenneenya ebyensimbi mu akawunti z’abakozesa 138,000+, ekituli eky’ekika kino eky’obukuumi si kya ndowooza — y’enjawulo wakati w’okudduka okutuufu okw’omusaala n’okuddamu okubala okusaasaanya ssente ennyingi. Empisa enkakali mu kuwandiika okwetoloola okutandikawo konteyina y'emu ku nkola ezo eza yinginiya "eziboola" ezitangira ebikolwa ebisanyusa eby'okufulumya.

Enkola Ennungi ez'okutandikawo konteyina ez'okwekuuma

Ka kibeere nti ttiimu yo ekozesa kika ki, waliwo obukodyo obukakafu okumalawo ddala obutategeeragana bwa konteyina ekyerere. Ekigendererwa kwe kwesigama nate ku inference ku bidomola empty — fuula ekika okuba eky'olwatu kale code yo etambuzibwa mu checkers zonna era immune to inference behavior changes between versions.

  1. Bulijjo ssaako obugambo ku nkyukakyuka z'ekintu ekyerere. Wandiika ebivuddemu: list[int] = [] mu kifo kya ebivuddemu = []. Ensimbi entono ez'ebigambo (minor verbosity cost) tezirina mugaso bw'ogeraageranya n'obudde bw'okulongoosa obutereevu. Enkola eno emu emalawo nga 80% ku nsonga z’okuteebereza kw’ekintu ekyerere.
  2. Kozesa emirimu gy'ekkolero ku bikozesebwa ebizibu. Mu kifo kya cache = {}, wandiika omulimu nga def make_cache() -> dict[str, list[UserRecord]]: return {}. Ennyonyola y'ekika ky'okudda efuula ekika ekigendereddwamu obutaba na kubuusabuusa era okwewandiisa.
  3. Yagala abazimbi abawandiikiddwa okusinga literals ku bika ebitali bikulu. Wandiika ebintu: set[int] = set() okusinga okwesigama ku set comprehension inference. Ku defaultdict ne Counter, bulijjo waayo ekigerageranyo ky'ekika: bala: Counter[str] = Counter().
  4. Tegeka enkola enkakali ey'omukebera ekika kyo ku koodi empya. byombi mypy ne pyright biwagira okusengeka buli fayiro oba buli dayirekita. Ssobozesa okukebera okukakali ku modulo empya nga okyusa mpolampola koodi ey'edda. Kino kiremesa okukuŋŋaanyizibwa kw’ebintu ebipya ebiwandiikiddwa mu ngeri etegeerekeka.
  5. Ongerako okugeraageranya kw'omukebera ekika ku payipu yo eya CI. Okuddukanya byombi mypy ne pyright ku codebase yo kikwata inference divergence nga bukyali. Singa omusono guyita ku mukebere omu naye ne gulemererwa omulala, kiba kabonero nti ekika si kya lwatu kimala.

Ekifaananyi Ekinene: Okukebera Ebika nga Ttiimu Enkola

Empty container inference ku nkomerero microcosm y'okusoomoozebwa okunene mu nkola y'ekika kya Python: okusika omuguwa wakati w'obulungi n'obukuumi. Endowooza ya Python eya "ffenna tuli bantu bakulu abakkiriza" ekola bulungi ku prototyping ne scripts, naye enkola z'okufulumya eziweereza enkumi n'enkumi z'abakozesa zeetaaga okukakasa okw'amaanyi. Eky’okuba nti abakebera ekika bana abakulu tebakkiriziganya ku kintu ekikulu ng’ekika kya [] kiggumiza nti ensengekera y’obutonde bw’okuwandiika eya Python ekyakula.

Ku ttiimu za yinginiya ezizimba ensengeka enzibu — oba oddukanya microservices ntono oba enkola ekwataganye n’ebikumi n’ebikumi bya modulo eziyungiddwa nga Mewayz’s business OS — amagezi ag’omugaso ga butereevu: teweesigama ku inference for empty containers, londa type checker era okisengeke strictly, era otwa type annotations nga documentation that happens to be ekyuma ekikakasibwa. Eddakiika ettaano ezimala ng’owandiika list[Invoice] mu kifo kya [] zijja kukuwonya essaawa z’okulongoosa nga codebase yo ekula.

Nga PEP 696 (default type parameters) ne PEP 695 (type parameter syntax) bwe zigenda mu maaso n'okukka mu nkyusa za Python empya, ergonomics y'okuwandiika okw'olwatu ejja kusigala ng'elongooka. Ekituli wakati wa "annotated" ne "unannotated" Python kijja kukendeera. Naye okutuusa ku lunaku olwo, ebika bya konteyina eby’olwatu bisigala nga bimu ku nkola za ROI ezisinga obunene mu kiwandiiko ky’ebikozesebwa eby’omukozi wa Python — empisa entono esasula amagoba agagatta mu buli modulo, buli sprint, ne buli kuteekebwa mu nkola okufulumya.

Zimba OS Ya Bizinensi Yo Leero

Okuva ku ba freelancers okutuuka ku bitongole, Mewayz egaba amaanyi bizinensi 138,000+ nga zirina modules 207 ezigatta. Tandika ku bwereere, okulongoosa ng'okula.

|

Ebibuuzo Ebitera Okubuuzibwa

Lwaki abakebera ebiwandiiko tebasobola kukkiriziganya ku kika kya lukalala olutaliiko kintu kyonna?

Bw'owandiika `x = []`, omukebera ekika alina okuteebereza ekika ekitaliimu bigambo bya bulambulukufu. Abakebera ab’enjawulo bakozesa obukodyo obw’enjawulo: abamu bateebereza `list[Any]` (olukalala lw’ekintu kyonna), ate abalala bayinza okuteebereza ekika ekisinga ekitongole naye nga kikyamu nga `list[None]`. Kino obutaba na mutindo gwa bonna y’ensonga lwaki tebakkiriziganya. Ku pulojekiti ezikozesa ebikebera ebingi, obutakwatagana buno buyinza okuba omutwe omunene, okumenya okwekenneenya mu kikozesebwa ekimu ekiyita mu kirala.

Ngeya ki ennyangu ey'okutereeza ensobi za konteyina ekyerere?

Ekigonjoola ekisinga obutereevu kwe kuwa obugambo obw'ekika obw'olwatu. Mu kifo kya `my_list = []`, wandiika `my_list: list[str] = []` okulangirira mu bulambulukufu ekika ekigendereddwa. Kino kiggyawo obutategeeragana bwonna eri omukebera ekika, okukakasa enneeyisa ekwatagana mu bikozesebwa eby'enjawulo nga mypy, Pyright, ne Pyre. Enkola eno esengekeddwa ku kutandika kwonna okw'ekintu ekyerere okuziyiza ensobi z'okuteebereza.

Nkwata ntya ebidomola ekyerere munda mu nnyonyola za kiraasi?

Eno nsonga ya bulijjo kubanga annotations munda mu classes zeetaaga okukwatibwa okw'enjawulo. Olina okukozesa `okuva mu __future__ import annotations` import oba `ClassVar` annotation singa olukalala lugendereddwamu okuba ekintu kya kiraasi. Okugeza, `kiraasi MyClass: my_list: ClassVar [olukalala [str]] = []`. Awatali kino, omukebera ekika ayinza okulwana okuteebereza obulungi ekika, ekivaamu ensobi.

Waliwo ebikozesebwa okuyamba okuddukanya ensonga zino ez'okuwandiika mu pulojekiti ennene?

Yee, abakebera ekika eky’omulembe nga Pyright (ekiwa Pylance amaanyi mu VS Code) naddala balungi mu kukwata inference enzibu. Ku codebases ennene, platforms nga Mewayz (egaba modules 207 okwekenneenya ku $19/omwezi) zisobola okuwa okukebera ekika okuzitowa, okukwatagana n’okuyamba okussa mu nkola enkola z’obunnyonnyola mu ttiimu yo yonna, okukendeeza ku butakwatagana obwogeddwako mu kiwandiiko.

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