Hacker News

Kwatanta Nau'in Mai duba Python: Fahimtar Kwantena mara komai

Sharhi

14 min read Via pyrefly.org

Mewayz Team

Editorial Team

Hacker News

Me yasa kwantena mara komai suna karya nau'in Binciken Python - Kuma Me Zaku Iya Yi Game da shi

Tsarin buga rubutu a hankali na Python ya balaga sosai tun lokacin da PEP 484 ta gabatar da alamu iri a cikin 2015. A yau, miliyoyin masu haɓakawa sun dogara ga masu bincika nau'in a tsaye don kama kwari kafin su fara samarwa. Amma akwai kusurwa mai banƙyama, na nau'in tsarin wanda har yanzu ya tashi har ma da ƙwararrun injiniyoyi: wane nau'in kwandon fanko yake da shi? Lokacin da ka rubuta x = [] ba tare da annotation ba, nau'in abin dubawa dole ne ya yi hasashe - kuma masu dubawa daban-daban suna yin hasashen daban. Wannan rarrabuwar kawuna yana haifar da matsaloli na gaske ga ƙungiyoyin da ke riƙe manyan ma'ajin ƙididdiga, inda sauyawa ko haɗa nau'ikan masu duba na iya haifar da ɗaruruwan kurakuran da ba zato ba tsammani cikin dare.

Wannan labarin ya fayyace yadda manyan masu binciken nau'in Python guda huɗu - mypy, pyright, pytype, da pyre - suke sarrafa kwatankwacin fanko, dalilin da yasa basu yarda ba, da kuma waɗanne dabaru masu amfani da zaku iya amfani da su don rubuta Python mai aminci ko da kuwa zaɓinku na kayan aiki.

Matsalar Mahimmanci: Kwantenan da babu kowa a zahiri suna da shakku

Yi la'akari da wannan layin Python mara lahani: sakamako = []. Shin sakamakoajeri ne[int]? Ajeri[str]? A jeri[dict[str, Kowa]? Ba tare da ƙarin mahallin ba, babu yadda za a sani da gaske. Lokaci na aiki na Python bai damu ba - jeri-jere iri-iri ne ta yanayi - amma masu duba nau'ikan na'urori suna buƙatar sanya nau'in kankare ga kowane mai canzawa don yin aikinsu. Wannan yana haifar da tashe-tashen hankula tsakanin sassaucin ra'ayi na Python da kuma tabbacin da bincike na tsaye ke ƙoƙarin samarwa.

Matsalar tana haɗe tare da ƙamus da saiti. Babu komai a haƙiƙa ana misalta shi azaman dict, ba saitin ba, wanda ke ƙara rashin fahimtar juna a saman madaidaicin matakin nau'in. Kuma kwantena masu gida - yi tunanin defaultdict(jerin)ko sakamako = {k: [] don k cikin maɓallai} - tura injin ƙira zuwa iyakar su. Kowane nau'in mai binciken ya haɓaka nasa ilimin lissafi, kuma bambance-bambancen sun fi mahimmanci fiye da yadda yawancin masu haɓaka ke fahimta.

A cikin tsarin samarwa da sarrafa nauyin aiki na gaske - ko CRM ce mai sarrafa bayanan abokin ciniki, tsarin daftari da ke samar da abubuwan layi, ko ma'aunin bututun na nazari - kwantena mara komai suna bayyana koyaushe azaman tsarin farawa. Samun kuskuren nau'ikan su ba wai kawai yana haifar da faɗakarwa ba; yana iya rufe kwaro na gaske waɗanda ke zamewa zuwa lokacin aiki.

Mypy: Bayanin Tsare-tsare Tare da Komai Tsare-tsare

Mypy, mafi tsufa kuma mafi ko'ina da ake karɓar nau'in binciken nau'in Python, yana ɗaukar hanya mai sassaucin ra'ayi zuwa kwantena mara komai. Lokacin da ya ci karo da x = []a iyakar aiki, yana ƙoƙarin dakata da nau'in yanke shawarada kuma gano nau'in kashi daga amfani na gaba. Idan ka rubuta x = [] sannan sai x.append(42), mypy zai nuna jeri[int]. Wannan dabarar "haɗa" tana aiki da ban mamaki ga lokuta masu sauƙi inda aka cika kwantena a cikin iyaka iri ɗaya.

Duk da haka, yanayin mypy yana canzawa sosai dangane da mahallin mahallin da tsauraran saitunan. A iyakar tsarin (lambar matakin sama), ko lokacin da aka wuce da akwati zuwa wani aiki kafin a cika jama'a, mypy sau da yawa yana komawa zuwa jeri[Kowa]. Ƙarƙashin tutar--tsattsauran ra'ayi, wannan yana haifar da kuskure, amma a yanayin da ba a taɓa gani ba yana wucewa cikin shiru. Wannan yana nufin ƙungiyoyin da ke gudanar da mypy ba tare da tsayayyen yanayin ba za su iya tara ɗimbin kwantena da aka buga a fakaice waɗanda ke aiki azaman kuɓuta daga tsarin nau'in, suna cin nasara akan manufarsa.

Ɗaya musamman da dabara: nau'ikan mypy kafin 0.990 wani lokaci ana iya faɗi jeri[Ba a sani ba] a ciki sannan kuma a faɗaɗa zuwa jeri[Kowa] akan aiki. Bayan-0.990, ƙaddamarwar ta kasance mai ƙarfi, amma canjin ya karya adadin abubuwan ban mamaki na ainihin-kwadodin duniya waɗanda suka dogara da halayen halayya ba tare da saninsa ba. Wannan jigo ne mai maimaitawa - canje-canje zuwa fa'idar kwantena mara komai suna cikin mafi yawan sabunta nau'in binciken binciken saboda alamu suna da yawa a ko'ina.

Haƙƙin Haƙƙin Haƙƙin Haƙƙin mallaka: Ƙuntataccen Bayani da Nau'in "Ba a sani ba"

Pyright, wanda Microsoft ya haɓaka kuma yana ƙarfafa Pylance a cikin VS Code, yana ɗaukar matsayi na falsafa daban. Maimakon a yi shiru a koma gaKowa, haƙƙin mallaka yana bambanta tsakanin Ba a sani ba (nau'in da ba a tantance ba tukuna) da Kowa (bayanin ficewa na nau'in duba). Lokacin da ka rubuta x = [] a cikin tsattsauran yanayin pyright, yana nuna jeri[Ba a sani ba] kuma yana ba da rahoton bincike, yana tilasta maka ka ba da bayani.

Pyright kuma ya fi tsaurin ra'ayi game da ƙunci cikin iyaka. Idan ka rubuta:

  • x = [] sannan kuma x.append ("hello") — pyright yana nuna jeri[str]
  • x = [] sannan sai x.append(1) sannan x.append("hello") — pyright infers list[int | str]
  • x = [] ya wuce kai tsaye zuwa aikin da ake tsammanin jeri[int] — pyright yana nuna jeri[int] daga mahallin wurin kira
  • x = [] ya dawo daga aiki ba tare da bayanin nau'in dawowa ba - pyright yana ba da rahoton kuskure maimakon zato
Wannan ra'ayi na bidirection (amfani da duka na gaba da amfani da nau'ikan da ake tsammanin daga rukunin yanar gizon kira) ya sa haƙƙin haƙƙin mallaka ya fi daidai fiye da mypy don kwantena mara kyau. Cinikin ciniki shine magana: Tsayayyen yanayin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin haƙƙin 30-40%
akan ƙayyadaddun lamurra na yau da kullun waɗanda ba a bayyana su ba idan aka kwatanta da tsananin yanayin mypy, bisa ga bincike daga rahotannin ƙaura da yawa na buɗe ido. Don ƙungiyoyin da ke gina hadaddun tsarin bayan fage - ka ce, dandamali mai sarrafa nau'ikan nau'ikan haɗin kai guda 207 wanda ya ƙunshi CRM, lissafin albashi, da kuma nazari - Tsananin pyright yana kama da rashin daidaituwar mu'amalar mu'amalar da ba ta dace ba.

Pytype da Pyre: Karancin Tafiya

Nau'in Google's pytype yana ɗaukar ƙila hanya mafi dacewa. Maimakon buƙatar bayanai ko komawa zuwa gaKowa, pytype yana amfani danazarin tsarin gabaɗayandon bin diddigin yadda ake amfani da kwantena a kan iyakokin aiki. Idan ka ƙirƙiri wani fanko a cikin aiki ɗaya kuma ka tura shi zuwa wani wanda ke haɗa lamba, pytype na iya sau da yawa inferlist[int] ba tare da wani bayani ba kwata-kwata. Wannan bayanin aikin giciye yana da tsada sosai - pytype yana da hankali a hankali fiye da mypy ko pyright akan manyan codebases - amma yana haifar da ƙarancin ƙima akan lambar da ba a bayyana ba.

Har ila yau, Pytype ya gabatar da manufar “nau’i-nau’i” don kwantena marasa amfani. Sabbin ƙirƙira[] yana samun nau'in ɓangarori wanda ake inganta shi a hankali yayin da mai duba ya gamu da ƙarin amfani. Wannan yana da kyau a fahimta amma yana iya haifar da saƙon kuskure masu ruɗani lokacin da nau'in ɓangaren ba za a iya warware shi gabaɗaya ba, kamar lokacin da kwandon da babu komai ya gudana ta ayyuka da yawa ba tare da an taɓa samun jama'a ba.

💡 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, a halin yanzu, yana kusa da halayen mypy amma tare da tsattsauran ra'ayi. Pyre yana ɗaukar x = []a matsayin jeri[ba a sani ba]kuma yana buƙatar bayani a mafi yawan mahallin. Inda pyre ya bambanta kanta yana cikin sarrafaƙamus na zahiri da ake amfani da shi azaman kwargs - wani tsari na gama gari a cikin tsarin gidan yanar gizo. Pyre yana da dabaru na musamman na shari'a don fayyace nau'ikan ƙamus daga mahallin mahallin maɓalli, rage nauyin bayani a cikin tsarin-nauyin codebases. Ganin cewa galibin aikace-aikacen gidan yanar gizo na zamani sun haɗa da amfani mai nauyi na buɗe ƙamus don daidaitawa da buƙatar sarrafa, wannan aikin yana biyan riba.

Tasirin Duniya na Haƙiƙa: Lokacin da Bambancin Bambanci ya Ciji

Bambance-bambancen da ke tsakanin nau'in masu dubawa na iya zama kamar na ilimi har sai kun dandana su a cikin tsarin samarwa. Yi la'akari da tsarin gama gari a cikin aikace-aikacen kasuwanci: fara tsarin bayanai wanda ke samun yawan jama'a bisa sharaɗi.

Mafi haɗari mafi hatsarin kwantena ba su ne waɗanda aka rubuta tuta ba - su ne waɗanda ke wucewa cikin shiru tare da wani nau'in Kowane nau'in, yana ba da damar bayanan da ba su dace ba su tara ba tare da faɗakarwa ba har sai aikin da ke ƙasa ya yi karo a lokacin aiki tare daNau'in Kuskurewanda ke da wuya a iya gano asalinsa.

Misali mai mahimmanci: ƙungiya a farkon farawa na fintech ya ba da rahoton kashewakwana uku don gyara batun samarwainda jerin maras kyau, wanda aka fara a cikin aikin sarrafa biyan kuɗi, an ƙirƙira shi azaman jeri[Kowane]by mypy. Ya kamata lissafin ya ƙunshi abubuwa na Decimal don adadin kuɗi, amma hanyar lambar tana rataye dabi'umai iyo maimakon. Tausayin Mypy yayi shiru ya kyaleta. Kwaron ya fito ne kawai lokacin da kurakurai a cikin lissafi na ruwa ya haifar da saɓani na $0.01 akan adadin daftari 12,000. Da sun yi amfani da haƙƙin mallaka a cikin yanayi mai tsauri, ko kuma kawai sun ba da lissafin fanko a matsayin jeri[Decimal], da an kama kwaro a lokacin haɓakawa.

A Mewayz, inda tsarin dandali ke aiwatar da daftari, lissafin biyan albashi, da ƙididdigar kuɗi a cikin asusun masu amfani 138,000+, irin wannan tazarar aminci ba ta ka'ida ba ce - bambanci ne tsakanin daidaitaccen biyan albashi da ƙididdige ƙididdiga masu tsada. Ƙuntataccen horon buga rubutu a kusa da ƙaddamar da kwantena ɗaya daga cikin waɗannan ayyukan injiniya na "mai ban sha'awa" waɗanda ke hana abubuwan samarwa masu kayatarwa.

Kyawawan Ayyuka don Ƙaddamar da kwantena na Kare

Ko da wane nau'in abin dubawa ne ƙungiyar ku ke amfani da ita, akwai dabaru na musamman don kawar da shubuhar kwantena gaba ɗaya. Manufar ita ce kar a taɓa dogaro da ra'ayi don kwantena mara komai - sanya nau'in a bayyane don haka lambar ku ta kasance mai ɗaukar hoto a duk masu bincike kuma ba ta da sauye-sauyen halayen ƙima tsakanin sigogin.

  1. Koyaushe bayyana masu canjin kwantena mara komai. Rubuta sakamako: list[int] = [] maimakon sakamako = [] Ƙananan farashin magana ba shi da komai idan aka kwatanta da lokacin da aka adana. Wannan aikin guda ɗaya yana kawar da kusan kashi 80 cikin ɗari na batutuwan da suka shafi kwantena.
  2. Amfani da ayyukan masana'anta don hadaddun kwantena.Maimakon cache = {}, rubuta wani aiki kamar def make_cache() -> dict[str, list[UserRecord]]: komawa {}. Bayanin nau'in dawowa ya sa nau'in da aka yi niyya ya zama mara ma'ana kuma yana rubuta kansa.
  3. Afi son ginshiƙan ginshiƙai sama da na zahiri don nau'ikan da ba maras muhimmanci ba. Don defaultdict da Counter, koyaushe suna samar da nau'in siga: counter: Counter[str] = Counter().
  4. Ka saita tsayayyen yanayin mai duba nau'in ku don sabuwar lamba. Kunna tsauraran bincike kan sabbin kayayyaki yayin ƙaura a hankali lambar gado. Wannan yana hana tara sabbin kwantena da aka buga a fakaice.
  5. Ƙara kwatancen nau'in mai duba zuwa bututun ku na CI. Yin aiki duka biyun mypy da pyright akan lambar lambar ku yana kama da bambance-bambance da wuri. Idan tsari ya wuce abin dubawa ɗaya amma ya kasa wani, sigina ce cewa nau'in bai fito fili ba.

Hoto mafi girma: Nau'in Dubawa azaman Ayyukan Ƙungiya

Ƙwararren kwandon da ba komai a ƙarshe shine ƙaramin ƙalubale na babban ƙalubale a tsarin nau'in Python: tashin hankali tsakanin dacewa da aminci. Falsafar Python na "dukkanmu mun yarda manya" yana aiki da kyau don samfuri da rubutun, amma tsarin samarwa da ke hidimar dubban masu amfani suna buƙatar garanti mai ƙarfi. The fact that four major type checkers disagree on something as basic as the type of [] underscores that the Python typing ecosystem is still maturing.

Don ƙungiyoyin injiniyoyi suna gina dandamali masu rikitarwa - ko kuna sarrafa ɗimbin microservices ko tsarin haɗin gwiwa tare da ɗaruruwan nau'ikan haɗin haɗin gwiwa kamar Mewayz's kasuwanci OS - shawara mai amfani ita ce madaidaiciya: kar a dogara da ra'ayi don kwantena mara kyau, zaɓi nau'in dubawa kuma saita shi sosai, kuma ku bi bayanin nau'in bayanan azaman takaddun shaida wanda zai iya zama na'ura. Minti biyar ɗin da aka kashe don rubutajeri[Invoice] maimakon[] zai cece ku sa'o'i na gyara kuskure lokacin da lambar lambar ku ta daidaita.

Kamar yadda PEP 696 (tsohuwar nau'in nau'i na tsoho) da PEP 695 (nau'in ma'auni) ke ci gaba da sauka a cikin sabbin nau'ikan Python, ergonomics na bugu na zahiri zai ci gaba da inganta. Tazarar da ke tsakanin “annoted” da “wanda ba a bayyana ba” Python zai ragu. Amma har zuwa wannan ranar, nau'ikan kwantena na zahiri suna kasancewa ɗaya daga cikin mafi girman ayyuka na ROI a cikin kayan aikin haɓakawa na Python - ƙaramin horo wanda ke ba da fa'ida ga kowane nau'i, kowane guntu, da kowane aikin samarwa.

Gina Kasuwancin Kasuwancin ku A Yau

Daga masu zaman kansu zuwa hukumomi, Mewayz yana ba da ikon kasuwanci 138,000+ tare da 207 hadedde kayayyaki. Fara kyauta, haɓakawa lokacin da kuka girma.

Ƙirƙiri Asusun Kyauta →

Tambayoyin da ake yawan yi

Me yasa ba za a iya rubuta masu duba yarda ba akan nau'in lissafin mara komai?

Lokacin da ka rubuta `x = []`, nau'in mai duba dole ne ya ba da nau'i ba tare da fayyace ba. Masu dubawa daban-daban suna amfani da dabaru daban-daban: wasu suna ''jeri[Kowa]' (jerin kowane abu), yayin da wasu na iya samun takamaiman takamaiman amma nau'in kuskure kamar 'jeri[Babu]'. Wannan rashin ma'auni na duniya shine ya sa suka saba. Don ayyukan ta amfani da masu dubawa da yawa, wannan rashin daidaituwa na iya zama babban ciwon kai, karya bincike a cikin wani kayan aiki da ke wucewa a cikin wani.

Mecece hanya mafi sauƙi don gyara kurakuran kwantena mara komai?

Mafi sauƙaƙan bayani shine samar da bayanin nau'in bayyane. Maimakon `my_list = []`, rubuta `my_list: list[str] = []` don ayyana nau'in da aka yi niyya sarai. Wannan yana kawar da duk wani shubuha ga nau'in mai duba, yana tabbatar da daidaiton ɗabi'a a cikin kayan aikin daban-daban kamar mypy, Pyright, da Pyre. Ana ba da shawarar wannan aikin don duk farawar kwantena mara komai don hana kurakuran ƙididdiga.

Ta yaya zan iya sarrafa kwantena mara komai a cikin ma'anar aji?

Wannan batu ne na gama gari saboda bayanan da ke cikin azuzuwan suna buƙatar kulawa ta musamman. Dole ne ku yi amfani da shigo da bayanan 'daga __nan gaba__' ko kuma bayanin 'ClassVar' idan jerin suna nufin sifa. Misali, `class MyClass: my_list: ClassVar[list[str]] = []`. Idan ba tare da wannan ba, mai duba nau'in na iya yin gwagwarmaya don fahimtar nau'in daidai, wanda zai haifar da kurakurai.

Shin akwai kayan aikin da za su taimaka sarrafa waɗannan batutuwan bugawa a manyan ayyuka?

Ee, masu binciken nau'ikan ci-gaba kamar Pyright (waɗanda ke ba da ikon Pylance a cikin VS Code) suna da kyau musamman wajen sarrafa ƙima mai rikitarwa. Don manyan codebases, dandamali kamar Mewayz (yana ba da samfuran bincike na 207 na $19/watanni) na iya ba da zurfi, ƙarin daidaiton nau'in bincikawa da kuma taimakawa aiwatar da ayyukan annotation a duk ƙungiyar ku, rage rashin daidaituwa da aka tattauna a cikin labarin.

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