Hacker News

Coimeas dearbhaidh seòrsa Python: Co-dhùnadh inneal falamh

Beachdan

16 min read Via pyrefly.org

Mewayz Team

Editorial Team

Hacker News

Carson a bhios soithichean falamh a’ briseadh luchd-sgrùdaidh seòrsa Python - agus dè as urrainn dhut a dhèanamh mu dheidhinn

Tha siostam clò-sgrìobhaidh Python mean air mhean air fàs gu mòr bhon a thug PEP 484 a-steach sanasan seòrsa ann an 2015. An-diugh, tha na milleanan de luchd-leasachaidh an urra ri luchd-dearbhaidh seòrsa statach gus biastagan a ghlacadh mus ruig iad cinneasachadh. Ach tha oisean seòlta, sàrachail den t-seòrsa siostam a tha fhathast a’ dol suas eadhon innleadairean eòlach: dè an seòrsa a th’ ann an soitheach falamh? Nuair a sgrìobhas tu x = [] às aonais notaichean, feumaidh an dearbhadair seòrsa agad tomhas - agus bidh diofar luchd-dearbhaidh a’ tomhas ann an dòigh eadar-dhealaichte. Tha an t-eadar-dhealachadh seo a’ cruthachadh fìor dhuilgheadasan dha sgiobaidhean a tha a’ cumail suas stòran còd mòra, far am faighear na ceudan de mhearachdan ris nach robh dùil thairis air an oidhche le bhith ag atharrachadh no a’ cothlamadh luchd-dearbhaidh seòrsa.

Tha an artaigil seo a’ briseadh sìos mar a bhios na ceithir prìomh luchd-dearbhaidh seòrsa Python - mypy, pyright, pytype, agus pyre - a’ làimhseachadh co-dhùnadh soithichean falamh, carson nach eil iad ag aontachadh, agus dè na ro-innleachdan practaigeach as urrainn dhut gabhail gus Python sàbhailte a sgrìobhadh ge bith dè an roghainn inneal a th’ agad.

Am prìomh dhuilgheadas: Tha soithichean falamh dà-sheaghach

Smaoinich air an loidhne neo-chiontach seo de Python: results = []. A bheil toraidhean na liosta[int]? A liosta[str]? A liosta[dict[str, Sam bith]]? Às aonais co-theacsa a bharrachd, dha-rìribh chan eil dòigh ann fios a bhith agad. Chan eil dragh air an ùine ruith Python - tha liostaichean ioma-ghnèitheach le nàdar - ach feumaidh luchd-dearbhaidh seòrsa statach seòrsa cruadhtan a shònrachadh do gach caochladair gus an obair a dhèanamh. Tha seo a’ cruthachadh teannachadh bunaiteach eadar sùbailteachd fiùghantach Python agus na geallaidhean a bhios mion-sgrùdadh statach a’ feuchainn ri thoirt seachad.

Tha an duilgheadas a’ dol nas miosa le faclairean is seataichean. Tha {} falamh air a pharsadh mar dict, chan e seata, a chuireas ris an t-seata syntactic a bharrachd air an t-seata ìre-seòrsa. Agus soithichean neadachaidh - smaoinich air defaultdict(list) no results = {k: [] airson k ann an iuchraichean} - brùth einnseanan co-dhùnaidh gu na crìochan aca. Tha gach seòrsa dearbhadair air a heuristics fhèin a leasachadh, agus tha na h-eadar-dhealachaidhean nas cudromaiche na tha a’ mhòr-chuid de luchd-leasachaidh a’ tuigsinn.

Ann an siostaman cinneasachaidh a’ giullachd eallach obrach fìor - ge bith an e CRM a th’ ann a’ làimhseachadh clàran teachdaiche, modal fàirdeal a’ gineadh stuthan loidhne, no loidhne-phìoban anailis a’ cruinneachadh mheatairean - bidh soithichean falamh a’ nochdadh an-còmhnaidh mar phàtranan tòiseachaidh. Chan eil a bhith a' faighinn an seòrsa ceàrr dìreach a' toirt a-mach rabhaidhean lìnidh; faodaidh e fìor bhiteagan a shealg troimhe gu àm ruith a fhalach.

Mypy: Co-dhùnadh air a chuir dheth le rud sam bith a tha buailteach

Tha Mypy, an neach-dearbhaidh seòrsa Python as sine agus as fharsainge a chaidh gabhail ris, a’ cleachdadh dòigh-obrach caran tròcaireach a thaobh soithichean falamh. Nuair a thachras e ri x = [] aig farsaingeachd gnìomh, feuchaidh e ri co-dhùnadh an t-seòrsa a chuir dheth agus an seòrsa eileamaid a thoirt a-steach bhon chleachdadh às deidh sin. Ma sgrìobhas tu x = [] air a leantainn le x.append(42), bheir mypy a-steach liosta[int]. Tha an ro-innleachd “join” seo ag obair gu h-iongantach math airson cùisean sìmplidh far a bheil an soitheach làn sluaigh taobh a-staigh an aon raon.

Ach, bidh giùlan mypy ag atharrachadh gu mòr a rèir co-theacs agus suidheachadh teann. Aig farsaingeachd a’ mhodal (còd àrd-ìre), no nuair a thèid an soitheach a-null gu gnìomh eile mus tèid a lìonadh, bidh mypy gu tric a’ tuiteam air ais gu liosta[Sam bith]. Fon bhratach --strict, cuiridh seo mearachd air adhart, ach sa mhodh bunaiteach thèid e seachad gu sàmhach. Tha seo a’ ciallachadh gum faod sgiobaidhean a tha a’ ruith mypy às aonais modh teann dusanan de shoithichean a tha air an clò-sgrìobhadh gu soilleir a chruinneachadh a bhios mar adan teicheadh ​​bhon t-siostam seòrsa, a’ dèanamh a’ chùis air an adhbhar aca.

Aon ghiùlan sònraichte seòlta: uaireannan bheireadh dreachan mypy ro 0.990 a-steach liosta[Neo-aithnichte] air an taobh a-staigh agus an uair sin leudachadh gu liosta[sam bith] air an t-sònrachadh. Às deidh 0.990, chaidh an co-dhùnadh a theannachadh, ach bhris an t-atharrachadh àireamh iongantach de stòran còd san t-saoghal fhìor a bha air a bhith an urra ris a ’ghiùlan ceadaichte gun a bhith ga thoirt gu buil. Is e cuspair a tha seo a tha a’ nochdadh a-rithist agus a-rithist - tha atharrachaidhean air co-dhùnadh soithichean falamh am measg nan ùrachaidhean dearbhaidh seòrsa as troimhe-chèile leis gu bheil na pàtrain cho uile-làthaireach.

Pyright: Co-dhùnadh teann agus an seòrsa “Neo-aithnichte”

Tha suidheachadh feallsanachail gu tur eadar-dhealaichte aig Pyright, air a leasachadh le Microsoft agus a’ toirt cumhachd do Pylance ann an Còd VS. An àite a bhith a’ tuiteam air ais gu sàmhach gu Sam bith, tha pyright a’ dèanamh eadar-dhealachadh eadar Neo-aithnichte (seòrsa nach deach a dhearbhadh fhathast) agus Sam bith (sgrùdadh dearbhte tarraing a-mach à seòrsa). Nuair a sgrìobhas tu x = [] ann am modh teann pyright, bheir e a-steach list[Unknown] agus ag aithris diagnosachd, a’ toirt ort nota a thoirt seachad.

Tha Pyright cuideachd nas ionnsaigheach a thaobh caolachadh san raon. Ma sgrìobhas tu:

  • x = [] air a leantainn le x.append ("hello") - tha pyright a’ toirt a-steach liosta[str]
  • x = [] air a leantainn le x.append(1) an uairsin x.append (“hello”) — pyright infers list[int | str]
  • Chaidh
  • x = [] gu dìreach gu gnìomh le dùil ri liosta[int] - tha pyright a’ toirt a-steach liosta[int] bho cho-theacs an làraich-gairm
  • Thill
  • x = [] à gnìomh às aonais nòta seòrsa tilleadh - tha pyright ag aithris gu bheil mearachd ann seach a bhith a’ tomhas

Tha an co-dhùnadh dà-thaobhach seo (a’ cleachdadh an dà chuid cleachdadh às dèidh làimhe agus seòrsaichean ris a bheil dùil bho làraichean-gairm) a’ fàgail pyright gu math nas mionaidiche na mypy airson soithichean falamh. Is e briathrachas a th’ anns a’ mhalairt: tha modh teann pyright a’ nochdadh timcheall air 30-40% a bharrachd chùisean air bunait còd àbhaisteach gun chunntas an coimeas ri modh teann mypy, a rèir mion-sgrùdadh bho ghrunn aithisgean imrich stòr fosgailte. Airson sgiobaidhean a tha a’ togail siostaman backend iom-fhillte - can, àrd-ùrlar a bhios a’ riaghladh 207 modal eadar-cheangailte a’ spangachadh CRM, pàighidh, agus anailisean - tha teannas pyright a’ glacadh mì-chothromachadh eadar-aghaidh seòlta a dh’ ionndrainneadh co-dhùnadh tròcaireach.

Pytype and Pyre: Na Rathaidean nach eil cho Siubhail

Is dòcha gur e pytype Google an dòigh-obrach as pragmatach. An àite a bhith feumach air notaichean no tuiteam air ais gu Sam bith, bidh pytype a’ cleachdadh mion-sgrùdadh prògram slàn gus sùil a chumail air mar a chleachdar soitheach thar chrìochan gnìomh. Ma chruthaicheas tu liosta falamh ann an aon ghnìomh agus gun cuir thu seachad e gu fear eile a tha a’ ceangal nan sithean-àireamhan, faodaidh pytype gu tric list[int] a thoirt a-steach às aonais notaichean sam bith. Tha an co-dhùnadh tar-ghnìomh seo daor a thaobh àireamhachadh - tha pytype gu math nas slaodaiche na mypy no pyright air bunaitean còd mòr - ach bidh e a’ toirt a-mach nas lugha de rudan meallta air còd gun chomharradh.

Tha Pytype cuideachd a’ toirt a-steach bun-bheachd "seòrsaichean pàirteach" airson soithichean falamh. Bidh [] a chaidh a chruthachadh às ùr a’ faighinn pàirt de sheòrsa a thèid ùrachadh mean air mhean fhad ‘s a bhios an seiceadair a’ tighinn tarsainn air barrachd cleachdaidh. Tha seo eireachdail a thaobh bun-bheachd ach faodaidh e teachdaireachdan mearachd troimh-chèile a thoirt gu buil nuair nach urrainnear am pàirt den t-seòrsa fhuasgladh gu h-iomlan, leithid nuair a bhios soitheach falamh a’ sruthadh tro ghrunn ghnìomhan gun a bhith air a chleachdadh a-riamh.

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

Aig an aon àm, bidh pyre Meta a’ tighinn nas fhaisge air giùlan mypy ach le uireasbhaidhean nas teinne. Bidh Pyre a’ làimhseachadh x = [] mar liosta[neo-aithnichte] agus feumach air notaichean anns a’ mhòr-chuid de cho-theacsan. Far a bheil pyre ga eadar-dhealachadh fhèin tha e na làimhseachadh litrichean faclair falamh air an cleachdadh mar kwargs - pàtran cumanta ann am frèaman-lìn. Tha loidsig cùis shònraichte aig Pyre gus seòrsaichean faclair a thoirt a-steach bho cho-theacsan argamaid prìomh fhaclan, a’ lughdachadh eallach notaichean ann am frèam-stèidh còd trom. Leis gu bheil a’ mhòr-chuid de thagraidhean lìn ùr-nodha a’ toirt a-steach cleachdadh mòr de dhì-phapadh fhaclair airson rèiteachadh agus làimhseachadh iarrtasan, bidh am pragmatachd seo a’ pàigheadh ​​earrannan.

Buaidh fìor-shaoghal: Nuair a bhios eadar-dhealachadh co-dhùnaidhean a’ bìdeadh

Is dòcha gu bheil na h-eadar-dhealachaidhean eadar luchd-dearbhaidh seòrsa a’ coimhead acadaimigeach gus am faigh thu eòlas orra ann an stòr còd riochdachaidh. Beachdaich air pàtran cumanta ann an tagraidhean gnìomhachais: a’ tòiseachadh structar dàta a gheibh sluagh a-steach gu cumhach.

Chan e na soithichean falamh as cunnartaiche am bratach seòrsa checkers - is iad sin an fheadhainn a bhios gu sàmhach a’ dol seachad le seòrsa Sam bith toirmisgte, a’ leigeil le dàta neo-fhreagarrach cruinneachadh gun rabhadh gus an tuit gnìomh sìos an abhainn aig àm ruith le TypeError a tha cha mhòr do-dhèanta a lorg air ais chun tùs.

Eiseimpleir chruaidh: dh’ innis sgioba aig toiseach tòiseachaidh fintech gun do chosg iad trì latha a’ dì-bhugachadh cùis cinneasachaidh far an deach liosta falamh, a chaidh a thòiseachadh ann an gnìomh giollachd pàighidh, a thoirt a-steach mar liosta[Sam bith] le mypy. Bha còir gum biodh Deachach nithean airson suimean airgid air an liosta, ach bha slighe còd a’ ceangal luachan float na àite. Leig co-dhùnadh tròcaireach Mypy gu sàmhach e. Cha tàinig am biast am bàrr ach nuair a dh’ adhbhraich mearachdan cruinnichte ann an àireamhachd fleòdraidh eadar-dhealachadh $0.01 air baidse de 12,000 fàirdeal. Nam biodh iad air pyright a chleachdadh sa mhodh teann, neo dìreach air an liosta fhalamh ainmeachadh mar list[Decimal], bhiodh am biast air a ghlacadh aig àm leasachaidh.

Aig Mewayz, far a bheil an àrd-ùrlar a’ pròiseasadh fàirdeal, àireamhachadh pàighidh, agus mion-sgrùdadh ionmhais thairis air 138,000+ cunntas cleachdaiche, chan eil beàrn seòrsa-sàbhailteachd mar seo teòiridheach - is e an diofar eadar ruith pàighidh ceart agus ath-àireamhachadh cosgail. Tha smachd teann air a bhith a’ clò-sgrìobhadh mu thòiseachadh soithichean mar aon de na cleachdaidhean innleadaireachd “dòrainneach” sin a chuireas casg air tachartasan cinneasachaidh inntinneach.

Cleachdaidhean as Fheàrr airson Tòiseachadh Container Dìon

Ge bith dè an seòrsa inneal-dearbhaidh a bhios an sgioba agad a’ cleachdadh, tha ro-innleachdan cruaidh ann gus cuir às gu tur neo-chinnteachd soithichean falamh. Is e an t-amas nach bi thu a-riamh an urra ri co-dhùnadh airson soithichean falamh - dèan an seòrsa soilleir gus am bi do chòd so-ghiùlain thairis air a h-uile neach-dearbhaidh agus dìonach bho atharrachaidhean giùlan co-dhùnaidh eadar dreachan.

  1. Dèan notaichean air caochladairean soitheach falamh an-còmhnaidh. Sgrìobh toraidhean: list[int] = [] an àite results = []. Tha a’ chosgais briathrachais beag glè bheag an taca ris an ùine deasbaid a chaidh a shàbhaladh. Tha an cleachdadh singilte seo a’ cur às do mu 80% de chùisean co-dhùnaidh soithichean falamh.
  2. Cleachd gnìomhan factaraidh airson soithichean iom-fhillte. An àite cache = {}, sgrìobh gnìomh mar def make_cache() -> dict[str, liosta[UserRecord]]: till {}. Tha an nota seòrsa tilleadh a’ fàgail an t-seòrsa a thathar an dùil gun dà-sheaghach agus a’ clàradh fhèin.
  3. Is fheàrr le constructors clò-sgrìobhte na litrichean airson seòrsaichean nach eil cho beag. Sgrìobh items: set[int] = set() seach a bhith an urra ri co-dhùnadh tuigse sheata. Airson defaultdict agus Cunter, thoir seachad am paramadair seòrsa an-còmhnaidh: cunnt: Counter[str] = Counter().
  4. Rèidhich modh teann an t-seiceadair seòrsa agad airson a’ chòd ùr. Tha an dà chuid mypy agus pyright a’ toirt taic do rèiteachadh gach faidhle no gach eòlaire. Dèan comas air sgrùdadh teann air modalan ùra fhad ‘s a bhios tu a’ gluasad còd dìleab mean air mhean. Tha seo a’ cur casg air soithichean ùra a tha air an clò-sgrìobhadh gu soilleir a chruinneachadh.
  5. Cuir coimeas dearbhadair seòrsa ris an loidhne-phìoban CI agad. Ma ruitheas tu an dà chuid mypy agus pyright air a’ chòd-chòd agad glacaidh tu eadar-dhealachadh tràth. Ma thèid pàtran seachad air aon inneal-dearbhaidh ach ma dh'fhailicheas e air fear eile, 's e comharra a th' ann nach eil an seòrsa soilleir gu leòr.

An dealbh as motha: seòrsa sgrùdadh mar chleachdadh sgioba

Tha co-dhùnadh soithichean falamh aig a’ cheann thall na mhicrocosm de dhùbhlan nas motha ann an siostam seòrsa Python: an teannachadh eadar goireasachd agus sàbhailteachd. Tha feallsanachd Python de “tha sinn uile a’ toirt cead do dh’inbhich ”ag obair gu h-àlainn airson prototyping agus sgriobtaichean, ach feumaidh siostaman toraidh a tha a’ frithealadh mìltean de luchd-cleachdaidh barrantasan nas làidire. Leis gu bheil ceithir prìomh luchd-dearbhaidh seòrsa ag eas-aontachadh mu rudeigin cho bunaiteach ris an t-seòrsa [] a’ nochdadh gu bheil eag-shiostam clò-sgrìobhaidh Python fhathast a’ tighinn gu ìre.

Do sgiobaidhean innleadaireachd a’ togail àrd-ùrlaran iom-fhillte - ge bith a bheil thu a’ riaghladh dòrlach de mhicro-sheirbheisean no siostam amalaichte le ceudan de mhodalan eadar-cheangailte leithid OS gnìomhachais Mewayz - tha a’ chomhairle phractaigeach sìmplidh: na bi an urra ri co-dhùnadh airson soithichean falamh, tagh inneal-seicidh agus rèitich e gu teann, agus làimhsich notaichean seòrsa mar sgrìobhainnean a thachras a bhith air an dearbhadh le inneal. Sàbhalaidh na còig mionaidean a chaitheas tu a’ sgrìobhadh list[Invoice] an àite [] uairean debugging dhut nuair a bhios an còd-stèidh agad a’ sgèileadh.

Mar a bhios PEP 696 (paramadairean seòrsa àbhaisteach) agus PEP 695 (seòrsa paramadair co-chòrdadh) a’ tighinn air tìr ann an dreachan Python nas ùire, cumaidh ergonomics clò-sgrìobhaidh soilleir a’ dol am feabhas. Bidh a’ bheàrn eadar Python “neo-ainmichte” agus “neo-ainmichte” a’ caolachadh. Ach chun an latha sin, tha seòrsachan sònraichte de shoithichean fhathast mar aon de na cleachdaidhean ROI as àirde ann an inneal leasaiche Python - smachd beag a phàigheas riadh toinnte thar gach modal, gach sprint, agus gach cleachdadh cinneasachaidh.

Tog do ghnìomhachas OS an-diugh

Bho luchd-obrach neo-cheangailte gu buidhnean-gnìomha, tha Mewayz a’ toirt cumhachd do 138,000+ gnìomhachas le 207 modal aonaichte. Tòisich an-asgaidh, àrdaich nuair a dh'fhàsas tu.

Cruthaich cunntas an-asgaidh →

Ceistean Bitheanta

Carson nach urrainn do luchd-dearbhaidh aontachadh ris an t-seòrsa de liosta falamh?

Nuair a sgrìobhas tu `x = []`, feumaidh an dearbhadair seòrsa seòrsa a thoirt a-steach às aonais molaidhean soilleir. Bidh diofar luchd-dearbhaidh a’ cleachdadh ro-innleachdan eadar-dhealaichte: bidh cuid a’ toirt a-steach ‘list[Any]` (liosta de rud sam bith), agus faodaidh cuid eile seòrsa nas mionaidiche ach nas ceàrr a thoirt a-steach mar `liosta [Chan eil gin]`. Is e an dìth inbhe choitcheann seo as coireach nach eil iad ag aontachadh. Airson pròiseactan a tha a’ cleachdadh iomadh neach-dearbhaidh, faodaidh an neo-chunbhalachd seo a bhith na cheann goirt, a’ briseadh mion-sgrùdadh ann an aon inneal a thèid seachad air inneal eile.

Dè an dòigh as sìmplidh air mearachdan soithichean falamh a chàradh?

Is e am fuasgladh as sìmplidh a bhith a’ toirt seachad seòrsa comharrachaidh soilleir. An àite `my_list = []`, sgrìobh `my_list: list[str] = []` gus an seòrsa san amharc fhoillseachadh gu soilleir. Bidh seo a’ toirt air falbh a h-uile mì-chinnt airson an inneal-dearbhaidh seòrsa, a’ dèanamh cinnteach à giùlan cunbhalach thar diofar innealan leithid mypy, Pyright, agus Pyre. Tha an cleachdadh seo air a mholadh airson a h-uile soitheach falamh a thòiseachadh gus casg a chuir air mearachdan co-dhùnaidh.

Ciamar a làimhsicheas mi soithichean falamh taobh a-staigh mìneachadh clas?

'S e cùis chumanta a tha seo a chionn 's gu bheil feum air làimhseachadh sònraichte airson notaichean taobh a-staigh chlasaichean. Feumaidh tu na notaichean `from __future__ ion-phortadh` import no nota `ClassVar` a chleachdadh ma thathar an dùil gur e feart clas a tha san liosta. Mar eisimpleir, `clas MyClass: my_list: ClassVar[list[str]] = []`. Às aonais seo, 's dòcha gum bi duilgheadas aig an dearbhadair seòrsa an seòrsa a thoirt a-steach gu ceart, a' leantainn gu mearachdan.

A bheil innealan ann gus na cùisean clò-sgrìobhaidh seo a stiùireadh ann am pròiseactan mòra?

Tha, tha luchd-dearbhaidh seòrsa adhartach mar Pyright (a bheir cumhachd do Pylance ann an Còd VS) gu sònraichte math air làimhseachadh co-dhùnaidhean iom-fhillte. Airson stòran còd mòra, faodaidh àrd-ùrlaran mar Mewayz (a’ tabhann 207 modalan sgrùdaidh airson $ 19 / mìos) sgrùdadh seòrsa nas doimhne, nas cunbhalaiche a thoirt seachad agus cuideachadh le bhith a’ cur an gnìomh cleachdaidhean notaichean air feadh an sgioba gu lèir agad, a ’lasachadh nan neo-chunbhalachd a chaidh a dheasbad san artaigil.

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