Iyo nzira yekutarisa 4 miriyoni mitsetse yePython kodhi. Chikamu 1

Nhasi tinokuunzira iwe chikamu chekutanga cheshanduro yezvinyorwa pamusoro pekuti Dropbox inobata sei nemhando yekutonga kwePython kodhi.

Iyo nzira yekutarisa 4 miriyoni mitsetse yePython kodhi. Chikamu 1

Dropbox inonyora zvakawanda muPython. Mutauro watinoshandisa zvakanyanya zvakanyanya, zvese zvekumashure-yekupedzisira masevhisi uye desktop client application. Isu tinoshandisa zvakare Go, TypeScript uye Rust zvakanyanya, asi Python ndiwo mutauro wedu mukuru. Tichifunga nezvehukuru hwedu, uye isu tiri kutaura nezve mamirioni emitsara yePython kodhi, zvakazoitika kuti typing ine simba yekodhi yakadai haina kuomesa kunzwisisa kwayo uye yakatanga kukanganisa zvakanyanya kugadzirwa kwevashandi. Kudzikamisa dambudziko iri, tatanga kushandura zvishoma nezvishoma kodhi yedu kuenda kune static type yekutarisa uchishandisa mypy. Iyi ingangove inonyanya kufarirwa yakamira mhando yekutarisa system yePython. Mypy ipurojekiti yakavhurika sosi, vagadziri vayo vakuru vanoshanda muDropbox.

Dropbox yaive imwe yemakambani ekutanga kuita static type yekutarisa muPython kodhi pachikero ichi. Mypy inoshandiswa muzviuru zvezvirongwa mazuva ano. Ichi chishandiso kasingaverengeki, sezvavanotaura, "yakaedzwa muhondo." Isu tabva kure kuti tisvike patave iko zvino. Munzira, pakanga pane mabasa akawanda asina kubudirira uye kuedza kwakakundikana. Iyi positi inovhara nhoroondo ye static type yekutarisa muPython, kubva payakatanga ine matombo sechikamu chepurojekiti yangu yekutsvagisa, kusvika nhasi, kana mhando yekutarisa uye kutapa hinting zvave zvakajairika kune vasingaverengeki vanogadzira vanonyora muPython. Aya masisitimu ave kutsigirwa nemidziyo yakawanda yakadai seIDE uye macode analyzer.

β†’ Verenga chikamu chechipiri

Nei kutariswa kwetaipi kuchidikanwa?

Kana iwe wakamboshandisa dynamically typed Python, unogona kunge uine kumwe kuvhiringika kuti sei kwave nekupokana kwakadai kwakatenderedza static typing uye mypy nguva pfupi yadarika. Kana kuti pamwe iwe unofarira Python chaizvo nekuda kwekuita kwayo kutaipa, uye zviri kuitika zvinongotsamwisa iwe. Kiyi yekukosha kweiyo static typing chiyero chemhinduro: iyo yakakura purojekiti yako, iwe paunonyanya kutsamira kune static typing, uye mukupedzisira, ndipo paunonyanya kuida.

Ngatitii imwe purojekiti yasvika pakukura kwemakumi ezviuru zvemitsara, uye zvakazoitika kuti vagadziri vakawanda vari kushanda pairi. Tichitarisa purojekiti yakafanana, zvichibva pane zvakaitika kwatiri, tinogona kutaura kuti kunzwisisa kodhi yayo kuchave kiyi yekuchengeta vanogadzira vachigadzira. Pasina zvirevo zvemhando, zvinogona kunetsa kufunga, semuenzaniso, ndedzipi nharo dzekupfuudza kune basa, kana kuti ndedzipi mhando dzinogona kudzoka. Heino mibvunzo yakajairwa inowanzo kunetsa kupindura pasina kushandisa mhando zvirevo:

  • Basa iri rinogona kudzoka here None?
  • Nharo iyi inofanira kuva yei? items?
  • Chii chinonzi hunhu id: int ndizvo, str, kana kuti pamwe imwe tsika yerudzi?
  • Nharo iyi inofanira kuva rondedzero here? Zvinoita here kupfuudza tuple kwairi?

Kana iwe ukatarisa inotevera mhando-annotated kodhi snippet uye edza kupindura mibvunzo yakafanana, zvinoonekwa kuti iri ndiro basa rakareruka:

class Resource:
    id: bytes
    ...
    def read_metadata(self, 
                      items: Sequence[str]) -> Dict[str, MetadataItem]:
        ...

  • read_metadata haadzoki None, sezvo rudzi rwekudzoka rusina Optional[…].
  • Kupokana items kutevedzana kwemitsara. Haikwanise kudzokororwa zvisina tsarukano.
  • Ipa id tambo yebhaiti.

Munyika yakanaka, munhu angatarisira kuti zvese zvakapusa zvakadaro zvinotsanangurwa muzvinyorwa zvakavakwa (docstring). Asi ruzivo runopa mienzaniso yakawanda yekuti zvinyorwa zvakadaro hazviwanzoonekwi mukodhi yaunofanira kushanda nayo. Kunyangwe kana zvinyorwa zvakadaro zviripo mukodhi, munhu haagone kuvimba nekurongeka kwayo. Aya magwaro anogona kunge asina kujeka, asina chokwadi, uye akavhurika kune kusanzwisisana. Muzvikwata zvikuru kana mapurojekiti makuru, dambudziko iri rinogona kuoma zvakanyanya.

Nepo Python ichikunda mumatanho ekutanga kana epakati emapurojekiti, pane imwe nguva mapurojekiti akabudirira uye makambani anoshandisa Python anogona kutarisana nemubvunzo unokosha: "Tinofanira kunyorazve zvese mumutauro wakadhindwa?".

Nyora cheki masisitimu senge mypy gadzirisa dambudziko riri pamusoro nekupa mugadziri wemutauro wepamutemo wekutsanangura marudzi, uye nekutarisa kuti mhando yekuzivisa inofanana nekuitwa kwechirongwa (uye, nesarudzo, kutarisa kuvepo kwavo). Kazhinji, tinogona kutaura kuti masisitimu aya anotipa chimwe chinhu senge zvinyorwa zvakanyatsotariswa.

Kushandiswa kweakadaro masisitimu kune zvimwe zvakanakira, uye zvatove zvisizvo zvachose:

  • Iyo mhando yekutarisa system inogona kuona zvimwe zvidiki (uye kwete zvidiki) zvikanganiso. Muenzaniso chaiwo ndepavanokanganwa kugadzirisa kukosha None kana chimwe chimiro chakakosha.
  • Code refactoring inorerutswa zvakanyanya nekuti mhando yekutarisa sisitimu inowanzove yakarurama kwazvo pamusoro peiyo kodhi inoda kuchinjwa. Panguva imwecheteyo, hatidi kutarisira 100% kuvharwa kwekodhi nemiedzo, iyo, chero ipi zvayo, kazhinji haigoneki. Isu hatifanire kunyura mukati memukati meiyo stack trace kuti tizive chakakonzera dambudziko.
  • Kunyangwe pamapurojekiti akakura, mypy anogona kazhinji kuita yakazara mhando yekutarisa muchidimbu chesekondi. Uye kuita kwebvunzo kunowanzo kunotora makumi emasekonzi kana kunyange maminetsi. Mhando yekutarisa system inopa mugadziri mhinduro nekukurumidza uye inomubvumira kuita basa rake nekukurumidza. Iye haachadi kunyora zvisina kusimba uye zvakaoma kuchengetedza mayuniti bvunzo anotsiva chaiwo masangano nemaseke uye zvigamba kuti uwane kodhi bvunzo mhinduro nekukurumidza.

IDE uye vapepeti vakaita sePyCharm kana Visual Studio Code vanoshandisa simba remhando yezvinyorwa kupa vanogadzira kodhi kupera, kukanganisa kukanganisa, uye tsigiro yezvinowanzo shandiswa mitauro inovaka. Uye izvi ndezvimwe zvezvakanakira kutaipa. Kune vamwe vanogadzira mapurogiramu, zvese izvi ndiyo nharo huru mukufarira kutaipa. Ichi chinhu chinobatsira pakarepo mushure mekuita. Iyi kesi yekushandisa yemhando haidi yakaparadzana yemhando yekutarisa system senge mypy, kunyangwe zvichifanira kucherechedzwa kuti mypy inobatsira kuchengetedza mhando zvirevo zvinoenderana nekodhi.

Nhoroondo ye mypy

Nhoroondo yemypy yakatanga kuUK, muCambridge, makore mashoma ndisati ndajoinha Dropbox. Ndakabatanidzwa, sechikamu chekutsvagisa kwangu kwachiremba, mukubatana kwemitauro yakadhindwa uye ine simba. Ndakafemerwa nechinyorwa chekuwedzera typing naJeremy Siek naWalid Taha, uye neiyo Typed Racket chirongwa. Ndakaedza kutsvaga nzira dzekushandisa iwo mumwechete programming mutauro kune akasiyana mapurojekiti - kubva kudiki zvinyorwa kusvika kumakodhi mabhesi ane mamirioni mazhinji emitsara. Panguva imwecheteyo, ndaida kuve nechokwadi kuti mune chirongwa chechiyero chero chipi zvacho, munhu aisazofanira kuita zvibvumirano zvakakura. Chinhu chakakosha pane zvese izvi yaive pfungwa yekufamba zvishoma nezvishoma kubva kune isina kunyorwa prototype purojekiti kuenda kune yakazara yakaedzwa yakadhindwa yakagadzirwa chigadzirwa. Mazuva ano, pfungwa idzi dzinotorwa sedzechokwadi, asi muna 2010 raive dambudziko rakanga richiri kuongororwa.

Basa rangu rekutanga mukutarisa mhando rakanga risina kunangana nePython. Pane kudaro, ndakashandisa mutauro muduku "wekumba". Alore. Heino muenzaniso unozoita kuti unzwisise zvatiri kutaura nezvazvo (mhando zvirevo ndezvesarudzo pano):

def Fib(n as Int) as Int
  if n <= 1
    return n
  else
    return Fib(n - 1) + Fib(n - 2)
  end
end

Kushandisa mutauro wekuzvarwa wakapfava inzira inowanzoshandiswa mukutsvakurudza kwesainzi. Izvi zvakadaro, kwete zvishoma nekuti zvinokutendera iwe kukurumidza kuita zviedzo, uye zvakare nekuda kwekuti izvo zvisina chekuita nechidzidzo zvinogona kuregererwa nyore. Mitauro chaiyo-yepasirese yekuronga inoita kunge yakakura-mwero zviitiko nekuita kwakaoma, uye izvi zvinodzikisira kuyedza. Zvisinei, chero mibairo inobva pamutauro wakareruka inoratidzika kuva inonyumwira zvishoma, sezvo mukuwana migumisiro iyi mutsvakurudzi angave akarega kufunga kwakakosha pakushandiswa kwemitauro.

My type checker yeAlore yaitaridzika kuvimbisa, asi ndaida kuiyedza nekuyedza nekodhi chaiyo, iyo, yaungati, haina kunyorwa muAlore. Sezvineiwo kwandiri, mutauro weAlore waive wakavakirwa papfungwa dzakafanana nePython. Zvakanga zviri nyore kugadzirisa typechecker kuti ishande nePython's syntax uye semantics. Izvi zvakatibvumira kuti tiedze kunyora kutarisa mune yakavhurika sosi Python kodhi. Pamusoro pezvo, ndakanyora transpiler kushandura kodhi yakanyorwa muAlore kuenda kuPython kodhi uye ndakaishandisa kushandura kodhi yangu yetypechecker. Zvino ini ndaive nemhando yekutarisa system yakanyorwa muPython yaitsigira subset yePython, imwe mhando yemutauro iwoyo! (Dzimwe sarudzo dzekuvaka dzakaita zvine musoro kuAlore dzaive dzisina kukodzera Python, uye izvi zvichiri kuoneka muzvikamu zvemypy codebase.)

Muchokwadi, mutauro unotsigirwa nemhando yangu system haugone kunzi Python panguva ino: yaive musiyano wePython nekuda kwezvimwe zvipimo zvePython 3 type annotation syntax.

Zvaiita senge musanganiswa weJava nePython:

int fib(int n):
    if n <= 1:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

Imwe yemazano angu panguva iyoyo yaive yekushandisa rondedzero yemhando yekuvandudza mashandiro nekunyora rudzi urwu rwePython kuC, kana pamwe JVM bytecode. Ndakasvika padanho rekunyora compiler prototype, asi ndakasiya zano iri, sezvo mhando yekuzviongorora pachayo yairatidzika kubatsira.

Ndakapedzisira ndapa chirongwa changu paPyCon 2013 muSanta Clara. Ndakataurawo pamusoro peizvi naGuido van Rossum, mutongi ane mutsa wePython kwehupenyu hwose. Akandinyengetedza kuti ndidonhedze syntax yangu ndonamatira neyakajairwa Python 3. Python 3 inotsigira zvirevo zvebasa, saka muenzaniso wangu unogona kunyorwa zvakare sezvaratidzwa pazasi, zvichikonzera chirongwa chePython chakajairika:

def fib(n: int) -> int:
    if n <= 1:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

Ini ndaifanira kuita zvimwe zvibvumirano (kutanga pane zvese, ndinoda kuona kuti ndakagadzira yangu syntax nekuda kweichi chikonzero). Kunyanya, Python 3.3, iyo yazvino vhezheni yemutauro panguva iyoyo, haina kutsigira zvirevo zvakasiyana. Ndakakurukura naGuido ne-e-mail mikana yakasiyana-siyana yekugadzira dhizaini yezvirevo zvakadaro. Isu takasarudza kushandisa mhando mhinduro kune zvinosiyana. Izvi zvakashanda chinangwa chaidiwa, asi chaive chakati netsei (Python 3.6 yakatipa yakanaka syntax):

products = []  # type: List[str]  # Eww

Type zvirevo zvakauyawo zvakabatsira kutsigira Python 2, iyo isina yakavakirwa-mukati rutsigiro rwemhando yezvinyorwa:

f fib(n):
    # type: (int) -> int
    if n <= 1:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

Zvakazoitika kuti izvi (nezvimwe) zvekutengeserana hazvina basa - mabhenefiti ekunyora static aireva kuti vashandisi vakakurumidza kukanganwa nezve kushoma-kupfuura-yakakwana syntax. Sezvo pasina akakosha ekugadzira ekugadzira akashandiswa mumhando-yakatariswa Python kodhi, iripo Python maturusi uye kodhi maitirwo ekugadzirisa akaenderera mberi achishanda zvakajairika, zvichiita kuti zvive nyore kune vanogadzira kudzidza chishandiso chitsva.

Guido akandinyengetedzawo kuti ndijoine Dropbox mushure mekunge ndapedza thesis yangu yekupedza kudzidza. Apa ndipo panotanga chikamu chinonakidza che mypy story.

Zvichaenderera mberi…

Vanodiwa vaverengi! Kana ukashandisa Python, ndapota tiudze nezvehukuru hwemapurojekiti aunogadzira mumutauro uyu.

Iyo nzira yekutarisa 4 miriyoni mitsetse yePython kodhi. Chikamu 1
Iyo nzira yekutarisa 4 miriyoni mitsetse yePython kodhi. Chikamu 1

Source: www.habr.com

Voeg