Hacker News

Python Iru Checker Afiwera: Sofo Eiyan Inference

Comments

16 min read Via pyrefly.org

Mewayz Team

Editorial Team

Hacker News

Kini idi ti awọn apoti ti o ṣofo fọ Python Iru Checkers - Ati Ohun ti O Le Ṣe Nipa Rẹ

Eto titẹ titẹ diẹdiẹ ti Python ti dagba ni pataki lati igba ti PEP 484 ṣe afihan iru awọn imọran ni ọdun 2015. Loni, awọn miliọnu awọn olupolowo gbarale awọn oluyẹwo iru aimi lati yẹ awọn idun ṣaaju ki wọn to kọlu iṣelọpọ. Ṣugbọn arekereke kan wa, igun idiwọ ti iru eto ti o tun rin irin-ajo paapaa awọn onimọ-ẹrọ ti o ni iriri: iru wo ni eiyan ṣofo ni? Nigbati o ba kọ x = []laisi akọsilẹ, iru ayẹwo rẹ ni lati gboju — ati awọn oluṣayẹwo oriṣiriṣi gboju lero yatọ. Iyatọ yii ṣẹda awọn iṣoro gidi fun awọn ẹgbẹ ti n ṣetọju awọn koodu koodu nla, nibiti iyipada tabi apapọ awọn oluyẹwo le ṣe afihan awọn ọgọọgọrun awọn aṣiṣe airotẹlẹ ni alẹ kan.

Nkan yii fọ lulẹ bawo ni awọn oluyẹwo oriṣi Python mẹrin mẹrin - mypy, pyright, pytype, ati pyre — ṣe itọju itọkasi eiyan ofo, idi ti wọn ko gba, ati kini awọn ọgbọn iwulo ti o le gba lati kọ Python iru-ailewu laibikita yiyan irinṣẹ irinṣẹ rẹ.

Isoro Kokoro: Awọn apoti ti o ṣofo jẹ Alailowaya lainidii

Wo laini alailabuku ti Python: awọn abajade = []. Njẹ awọn abajade jẹ akojọ[int]? Aakojọ[str]? Aakojọ[dict[str, Eyikeyi]]? Laisi aaye afikun, ko si ọna lati mọ. Akoko asiko Python ko bikita - awọn atokọ jẹ oriṣiriṣi nipasẹ iseda - ṣugbọn awọn oluyẹwo iru aimi nilo lati fi iru nja kan si gbogbo oniyipada lati ṣe iṣẹ wọn. Eyi ṣẹda ẹdọfu ipilẹ laarin irọrun agbara Python ati awọn iṣeduro ti itupalẹ aimi n gbiyanju lati pese.

Iṣoro naa ṣajọpọ pẹlu awọn iwe-itumọ ati ṣeto. {}ṣofo ti wa ni atuntu gangan bi dict, kii ṣe ṣeto, eyiti o ṣafikun aibikita syntactic lori oke iruju ipele-iru. Ati awọn apoti itẹle — ronu aiyipada(akojọ)tabi awọn esi = {k: [] fun k ninu awọn bọtini} — Titari awọn ẹrọ inference si awọn opin wọn. Oluṣayẹwo iru kọọkan ti ni idagbasoke awọn heuristics tirẹ, ati pe awọn iyatọ ṣe pataki ju ọpọlọpọ awọn olupilẹṣẹ mọ lọ.

Ninu awọn ọna ṣiṣe iṣelọpọ awọn iṣẹ ṣiṣe gidi - boya o jẹ awọn igbasilẹ alabara CRM ti n mu awọn igbasilẹ alabara, module risiti ti n ṣe awọn nkan laini, tabi awọn metiriki opo gigun ti atupalẹ - awọn apoti ofo han nigbagbogbo bi awọn ilana ipilẹṣẹ. Gbigba awọn iru wọn ti ko tọ kii ṣe awọn ikilọ laini kan; o le boju-boju awọn idun tootọ ti o yọ nipasẹ akoko ṣiṣe.

Mypy: Ifitonileti Ti Daduro Pẹlu Eyikeyi

Mypy, akọbi julọ ati oluṣayẹwo iru Python ti a gba ni ibigbogbo, gba ọna itunu ti o jo si awọn apoti ofo. Nigbati o ba pade x = [] ni iwọn iṣẹ, o ngbiyanju lati daduro iru ipinnuki o si fa iru eroja lati lilo atẹle. Ti o ba kọ x = []atẹle pẹlu x.append(42), mypy yoo sọ akojọ[int]. Ilana “darapọ” yii n ṣiṣẹ ni iyalẹnu daradara fun awọn ọran taara nibiti apoti ti wa laarin iwọn kanna.

Sibẹsibẹ, ihuwasi mypy yipada ni iyalẹnu da lori ọrọ-ọrọ ati awọn eto aitọ. Ni iwọn module (koodu oke-ipele), tabi nigbati apoti naa ba ti kọja si iṣẹ miiran ṣaaju ki o to gbe, mypy nigbagbogbo ṣubu pada si akojọ[Eyikeyi]. Labẹ asia- muna, eyi nfa aṣiṣe, ṣugbọn ni ipo aiyipada o kọja laiparuwo. Eyi tumọ si awọn ẹgbẹ ti nṣiṣẹ mypy laisi ipo ti o muna le ṣajọpọ awọn dosinni ti awọn apoti ti a tẹ laiṣedeede ti o ṣiṣẹ bi awọn hatches abayo lati inu eto iru, ti ṣẹgun idi rẹ.

Iwa iwa arekereke kan ni pataki: awọn ẹya mypy ṣaaju 0.990 yoo ma sọ akojọ[Aimọ] nigba miiran ninu ati lẹhinna gbooro si akojọ[Eyikeyi] lori iṣẹ iyansilẹ. Lẹhin-0.990, itọka naa ti di, ṣugbọn iyipada naa fọ nọmba iyalẹnu ti awọn koodu koodu gidi-aye ti o ti gbarale ihuwasi igbanilaaye laisi mimọ. Eyi jẹ koko-ọrọ loorekoore - awọn iyipada si itọkasi apoti ofo wa laarin awọn imudojuiwọn oluṣayẹwo iru idalọwọduro pupọ julọ nitori awọn ilana jẹ ibi gbogbo.

Pyright: Itọkasi to muna ati iru “Aimọ”

Pyright, ti Microsoft ṣe idagbasoke ati agbara Pylance ni koodu VS, gba iduro ti imọ-jinlẹ ti o yatọ. Dipo ki o ṣubu ni idakẹjẹ pada siEyikeyi, pyright ṣe iyatọ laarin Aimọ(iru ti ko tii pinnu sibẹsibẹ) ati Eyikeyi (ijade kuro ni pato iru ayẹwo). Nigbati o ba kọ x = [] ni ipo ti o muna pyright, yoo wa akojọ[Unknown]o si ṣe ijabọ iwadii aisan kan, fipa mu ọ lati pese asọye.

Pyright tun jẹ ibinu diẹ sii nipa idinku laarin iwọn. Ti o ba kọ:

  • x = [] atẹle nipa x.append("hello") — pyright infers akojọ[str]
  • x = []atẹle pẹlu x.append(1) lẹhinna x.append("hello") — pyright infers akojọ[int | str]
  • x = [] kọja taara si iṣẹ kan ti nreti akojọ[int] — pyright infers akojọ[int]lati ipo-aaye ipe
  • x = []ti pada lati iṣẹ kan laisi iru asọye ipadabọ — pyright jabo aṣiṣe kan dipo lafaimo

Itọkasi ipinsi-itọkasi yii (lilo mejeeji ti o tẹle ati awọn oriṣi ti a nireti lati awọn aaye ipe) jẹ ki ẹtọ pyright ni pato diẹ sii ju mypy fun awọn apoti ofo. Iṣowo naa jẹ ọrọ-ọrọ: awọn asia ipo ti o muna pyright isunmọ30-40% awọn ọran diẹ siilori koodu koodu aṣoju ti a ko ṣe alaye ni akawe si ipo ti o muna mypy, ni ibamu si itupalẹ lati ọpọlọpọ awọn ijabọ ijira orisun-ìmọ. Fun awọn ẹgbẹ ti n kọ awọn ọna ṣiṣe ifẹhinti idiju — sọ, pẹpẹ kan ti n ṣakoso awọn modulu isopo 207 ti o ni ibatan CRM, isanwo-sanwo, ati atupale - lile ti pyright mu awọn aiṣedeede wiwo arekereke ti imọran alaanu yoo padanu.

Pytype ati Pyre: Awọn opopona Irin-ajo Kere

Google's pytype gba boya ọna ti o wulo julọ. Dipo ti o nilo awọn asọye tabi ja bo pada siEyikeyi, pytype nlogbogbo-itupalẹ etolati tọpinpin bi a ṣe lo eiyan kọja awọn aala iṣẹ. Ti o ba ṣẹda atokọ ti o ṣofo ni iṣẹ kan ti o si fi si omiran ti o fi awọn nọmba kun, pytype le nigbagbogbo inferakojọ[int] laisi awọn asọye rara. Itọkasi iṣẹ-agbelebu yii jẹ gbowolori ni iṣiro - pytype ti lọra pupọ ju mypy tabi pyright lori awọn koodu koodu nla - ṣugbọn o ṣe agbejade awọn idaniloju eke diẹ lori koodu ti ko ṣe alaye.

Pytype tun ṣafihan imọran ti “awọn iru apakan”fun awọn apoti ofo. []ti a ṣẹda tuntun gba iru apa kan ti o ni ilọsiwaju ni ilọsiwaju bi oluṣayẹwo ṣe alabapade lilo diẹ sii. Eyi jẹ yangan ni imọran ṣugbọn o le gbejade awọn ifiranṣẹ aṣiṣe idarudapọ nigbati iru apakan ko le ṣe ipinnu ni kikun, gẹgẹbi nigbati apoti ti o ṣofo ba nṣàn nipasẹ awọn iṣẹ pupọ laisi olugbe lailai.

💡 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, nibayi, o sunmọ si ihuwasi mypy ṣugbọn pẹlu awọn aifọwọyi wiwọ. Pyre ṣe itọju x = []gẹgẹbi akojọ[aimọ]ati pe o nilo itọkasi ni ọpọlọpọ awọn aaye. Nibiti pyre ṣe iyatọ ara rẹ wa ni mimu rẹ tiawọn iwe-itumọ ti o ṣofo ti a lo bi kwargs- ilana ti o wọpọ ni awọn ilana wẹẹbu. Pyre ni ọgbọn-ọrọ pataki-ọrọ lati sọ awọn oriṣi iwe-itumọ lati awọn ipo ariyanjiyan koko, idinku ẹru asọye ni awọn ipilẹ koodu ti o wuwo. Níwọ̀n bí ọ̀pọ̀lọpọ̀ àwọn ohun èlò wẹ́ẹ̀bù òde òní ní í ṣe pẹ̀lú ìlò ìtúmọ̀ ṣíṣí sílẹ̀ fún ìṣètò àti ìṣàkóso ìbéèrè, pragmatism yìí ń san àwọn ìpín.

Ipa-Agbaye-gidi: Nigbati Awọn Jijẹ Iyatọ Itọkasi

Awọn iyatọ laarin awọn oluyẹwo iru le dabi ẹkọ titi ti o fi ni iriri wọn ni ipilẹ koodu iṣelọpọ kan. Wo apẹrẹ ti o wọpọ ni awọn ohun elo iṣowo: pilẹṣẹ ipilẹ data kan ti o gba eniyan ni ipo.

Awọn apoti ofo ti o lewu julo kii ṣe awọn iru asia ti awọn oluyẹwo - wọn jẹ awọn ti o kọja laiparuwo pẹlu iru Iru eyikeyi, gbigba data ti ko ni ibamu lati ṣajọpọ laisi ikilọ titi iṣẹ isale yoo fi ṣubu ni akoko asiko pẹlu IruErrorti o fẹrẹ ṣe ko ṣee ṣe lati wa pada si ipilẹṣẹ rẹ.

Apeere ti o nipọn: ẹgbẹ kan ni ibẹrẹ fintech kan royin liloọjọ mẹta ti n ṣatunṣe aṣiṣe nkan iṣelọpọ kannibiti atokọ ti o ṣofo, ti ipilẹṣẹ ni iṣẹ ṣiṣe isanwo, ti ni oye biakojọ[Eyikeyi]nipasẹ mypy. Atokọ naa yẹ ki o ni awọn nkanDecimalfun awọn iye owo, ṣugbọn ọna koodu kan n fikun awọn iyeleefofo dipo. Ifọrọbalẹ alaanu ti Mypy ni ipalọlọ gba laaye. Kokoro naa farahan nikan nigbati awọn aṣiṣe iyipo ni iṣiro leefofo loju omi fa aiṣedeede $0.01 lori ipele ti awọn iwe-owo 12,000 kan. Ti wọn ba lo ẹtọ-ara ni ipo ti o muna, tabi ṣe asọye atokọ ti o ṣofo bi akojọ[Decimal], kokoro naa iba ti mu ni akoko idagbasoke.

Ni Mewayz, nibiti pẹpẹ ti n ṣe ilana risiti, awọn iṣiro isanwo isanwo, ati awọn atupale owo kọja awọn akọọlẹ olumulo 138,000+, iru aafo iru-aabo yii kii ṣe imọ-jinlẹ - o jẹ iyatọ laarin awọn ṣiṣe isanwo-owo ti o pe ati awọn iṣiro iye owo. Ẹkọ titẹ to muna ni ayika iṣagbesori eiyan jẹ ọkan ninu awọn iṣe imọ-ẹrọ “alaidun” ti o ṣe idiwọ awọn iṣẹlẹ iṣelọpọ moriwu.

Awọn iṣe ti o dara julọ fun Ibẹrẹ Apoti Aabo

Laibikita iru oluṣayẹwo wo ni ẹgbẹ rẹ nlo, awọn ọgbọn ti o nipọn wa lati yọkuro aibikita aibikita patapata patapata. Ibi-afẹde naa ni lati ma gbẹkẹle itọkasi fun awọn apoti ofo - jẹ ki iru naa han gbangba ki koodu rẹ jẹ gbigbe kọja gbogbo awọn oluṣayẹwo ati ajesara si awọn iyipada ihuwasi itọkasi laarin awọn ẹya.

  1. Nigbagbogbo ṣe alaye awọn oniyipada apoti ofo. Kọ awọn esi: akojọ[int] = [] dipo awọn abajade = []. Iye idiyele ọrọ-ọrọ kekere jẹ aifiyesi ni akawe si akoko n ṣatunṣe aṣiṣe ti o fipamọ. Iwa ẹyọkan yii yọkuro ni aijọju 80% ti awọn ọran ifọkasi apoti ofo.
  2. Lo awọn iṣẹ ile-iṣẹ fun awọn apoti idiju. Dipo cache = {}, kọ iṣẹ kan bii def make_cache() -> dict[str, akojọ[UserRecord]]: pada {}. Itọkasi iru ipadabọ jẹ ki iru ti a pinnu jẹ alaiṣiyemeji ati iwe-ipamọ ti ara ẹni.
  3. Ṣeyan awọn oluṣe ti a tẹ lori awọn itumọ ọrọ gangan fun awọn iru ti kii ṣe bintin. FunaiyipadaatiOluka, nigbagbogbo pese iru paramita: counts: Counter[str] = Counter().
  4. Ṣatunto ipo oluṣayẹwo iru rẹ fun koodu titun. Mejeeji mypy ati pyright atilẹyin fun-faili tabi iṣeto-itọsọna. Mu ṣiṣe ayẹwo ti o muna lori awọn modulu titun lakoko ti o nṣiriṣiriṣi koodu ti o le jẹ diẹdiẹ. Eyi ṣe idilọwọ ikojọpọ awọn apoti tuntun ti a ti tẹ laisọtọ.
  5. Ṣafikun iru oluṣayẹwo iru si opo gigun ti epo CI rẹ. Ṣiṣe mejeeji mypy ati pyright lori koodu koodu rẹ mu iyatọ inference ni kutukutu. Ti apẹẹrẹ ba kọja oluṣayẹwo kan ṣugbọn ti o kuna miiran, o jẹ ifihan agbara pe iru naa ko han gbangba to.

Aworan ti o tobi julọ: Iru Ṣiṣayẹwo bi Iṣeṣe Ẹgbẹ

Itọkasi apoti ti o ṣofo nikẹhin jẹ microcosm kan ti ipenija nla kan ninu eto iru Python: ẹdọfu laarin irọrun ati ailewu. Imọye Python ti “gbogbo wa ni awọn agbalagba ti o gba” ṣiṣẹ ni ẹwa fun ṣiṣe apẹrẹ ati awọn iwe afọwọkọ, ṣugbọn awọn eto iṣelọpọ ti n sin ẹgbẹẹgbẹrun awọn olumulo nilo awọn iṣeduro ti o lagbara. Òtítọ́ náà pé àwọn olùṣàyẹ̀wò oríṣi mẹ́rin pàtàkì kò fohùn ṣọ̀kan lórí ohun kan gẹ́gẹ́ bí ìpìlẹ̀ gẹ́gẹ́ bí irú[]jẹ́rìí sí i pé àwọn ẹ̀dá alààyè títẹ̀ ní Python ṣì ń dàgbà.

Fun awọn ẹgbẹ imọ-ẹrọ ti n kọ awọn iru ẹrọ idiju - boya o n ṣakoso ọwọ diẹ ti awọn iṣẹ microservices tabi eto isọpọ pẹlu awọn ọgọọgọrun awọn modulu isọpọ bi Mewayz's Business OS - imọran ti o wulo jẹ taara: maṣe gbarale itọkasi fun awọn apoti ofo, mu oluyẹwo iru kan ki o tunto rẹ muna, ati tọju iru awọn asọye bi iwe-ipamọ ti o ṣee ṣe lati rii daju ẹrọ. Iṣẹju marun ti o lo kikọakojọ[Invoice]dipo [] yoo gba ọ pamọ awọn wakati ti n ṣatunṣe aṣiṣe nigbati koodu koodu rẹ ba ṣe iwọn.

Bi PEP 696 (awọn paramita iru aiyipada) ati PEP 695 (iru sintasi paramita) tẹsiwaju lati de ni awọn ẹya Python tuntun, ergonomics ti titẹ fojuhan yoo ma ni ilọsiwaju. Aafo laarin "akọsilẹ" ati "aiṣedeede" Python yoo dín. Ṣugbọn titi di ọjọ yẹn, awọn iru eiyan ti o han gbangba jẹ ọkan ninu awọn iṣe ROI ti o ga julọ ninu ohun elo irinṣẹ Olùgbéejáde Python - ikẹkọ kekere kan ti o san iwulo agbo ni gbogbo module, gbogbo ṣẹṣẹ, ati gbogbo imuṣiṣẹ iṣelọpọ.

Kọ OS Iṣowo Rẹ Loni

Lati awọn freelancers si awọn ile-ibẹwẹ, Mewayz ṣe agbara awọn iṣowo 138,000+ pẹlu awọn modulu iṣọpọ 207. Bẹrẹ ọfẹ, igbesoke nigbati o ba dagba.

Ṣẹda akọọlẹ Ọfẹ →

Awọn ibeere Nigbagbogbo

Kini idi ti ko le tẹ awọn oluyẹwo gba lori iru atokọ ti o ṣofo?

Nigbati o ba kọ `x = []`, iru oluṣayẹwo gbọdọ jẹri iru kan laisi awọn amọna ti o fojuhan. Awọn oluṣayẹwo oriṣiriṣi lo awọn ọgbọn oriṣiriṣi: diẹ ninu infer `akojọ[Eyikeyi]` (akojọ ohunkohun), lakoko ti awọn miiran le ṣe alaye kan pato diẹ sii ṣugbọn iru ti ko tọ bi `akojọ[Ko si]`. Àìsí ọ̀pá ìdiwọ̀n gbogbo àgbáyé yìí ló fà á tí wọ́n fi ṣàtakò. Fun awọn iṣẹ akanṣe nipa lilo awọn oluyẹwo pupọ, aiṣedeede yii le jẹ orififo nla, itupalẹ fifọ ni ọpa kan ti o kọja ni omiiran.

Kini ọna ti o rọrun julọ lati ṣatunṣe awọn aṣiṣe apoti ofo?

Ojuutu titọ julọ julọ ni lati pese asọye iru ti o fojuhan. Dipo `my_list = []`, kọ `my_list: list[str] = []` lati sọ iru ti a pinnu ni kedere. Eyi yọ gbogbo aibikita kuro fun oluṣayẹwo iru, ni idaniloju ihuwasi deede kọja awọn irinṣẹ oriṣiriṣi bii mypy, Pyright, ati Pyre. Iṣe yii ni a gbaniyanju fun gbogbo awọn ipilẹṣẹ apoti ti o ṣofo lati ṣe idiwọ awọn aṣiṣe ifọkansi.

Bawo ni MO ṣe le di awọn apoti ofo laarin awọn itumọ kilasi?

Eyi jẹ ọrọ ti o wọpọ nitori awọn asọye inu awọn kilasi nilo mimu pataki. O gbọdọ lo `lati __ojo iwaju__ awọn asọye agbewọle wọle tabi asọye'ClassVar` ti atokọ naa ba pinnu lati jẹ abuda kilasi kan. Fun apẹẹrẹ, `kilasi MyClass: my_list: ClassVar[akojọ[str]] = []`. Laisi eyi, oluṣayẹwo iru le tiraka lati sọ iru naa ni deede, ti o yori si awọn aṣiṣe.

Ṣe awọn irinṣẹ lati ṣe iranlọwọ ṣakoso awọn ọran titẹ ni awọn iṣẹ akanṣe nla bi?

Bẹẹni, awọn oluṣayẹwo iru ilọsiwaju bii Pyright (eyiti o ni agbara Pylance ni koodu VS) dara ni pataki ni mimu itọkasi idiju mu. Fun awọn ipilẹ koodu nla, awọn iru ẹrọ bii Mewayz (nfunni awọn modulu itupalẹ 207 fun $ 19 / oṣu kan) le pese jinle, iru iṣayẹwo deede diẹ sii ati iranlọwọ lati fi ipa mu awọn iṣe asọye kọja gbogbo ẹgbẹ rẹ, dinku awọn aiṣedeede ti a jiroro ninu nkan naa.

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