Indlela yokuhlola imigqa eyizigidi ezi-4 yekhodi yePython. Ingxenye 1

Namuhla sikulethela ingxenye yokuqala yokuhunyushwa kokuqukethwe mayelana nokuthi iDropbox isebenzisana kanjani nokulawula uhlobo lwekhodi yePython.

Indlela yokuhlola imigqa eyizigidi ezi-4 yekhodi yePython. Ingxenye 1

I-Dropbox ibhala okuningi ku-Python. Lolu wulimi esilusebenzisa kakhulu - kokubili kumasevisi angemuva nezinhlelo zokusebenza zeklayenti ledeskithophu. Siphinde sisebenzisa i-Go, TypeScript kanye neRust kakhulu, kodwa iPython ulimi lwethu oluyinhloko. Uma kucatshangelwa izinga lethu, futhi sikhuluma ngezigidi zemigqa yekhodi yePython, kuvele ukuthi ukuthayipha okuguquguqukayo kwekhodi enjalo kwenza kube nzima ukuqonda kwayo futhi kwaqala ukuba nomthelela omkhulu ekukhiqizeni abasebenzi. Ukuze sinciphise le nkinga, sesiqale ukushintsha kancane kancane ikhodi yethu ibe wukuhlola uhlobo olungashintshi sisebenzisa i-mypy. Lokhu mhlawumbe kuwuhlelo oludume kakhulu lokuhlola uhlobo oluzimele lwePython. I-Mypy iphrojekthi yomthombo ovulekile, abathuthukisi bayo abakhulu basebenza eDropbox.

I-Dropbox yayingenye yezinkampani zokuqala ukusebenzisa ukuhlola uhlobo olumile kukhodi yePython kulesi sikali. I-Mypy isetshenziswa ezinkulungwaneni zamaphrojekthi kulezi zinsuku. Leli thuluzi liye, njengoba besho, "livivinywa empini" izikhathi ezingenakubalwa. Kwadingeka sihambe ibanga elide ukuze sifike lapho esikhona manje. Kube nemizamo eminingi engaphumelelanga kanye nokuhlola okuhlulekile endleleni. Lesi siqeshana silandisa ngomlando wokuhlolwa kohlobo olungaguquki kuPython, kusukela ekuqaleni kwayo okunamatshe njengengxenye yephrojekthi yami yocwaningo lwezemfundo kuze kube namuhla, lapho ukuhlola kohlobo nokusikisela kohlobo sekuyinto evamile phakathi konjiniyela abaningi bePython. Lezi zindlela manje zisekelwa amathuluzi ahlukahlukene, njengama-IDE nabahlaziyi bekhodi.

β†’ Funda ingxenye yesibili

Kungani kudingeka ukuhlola uhlobo?

Uma uke wasebenzisa iPython ethayiphiwe ngokushintshashintshayo, ungase udideke kancane ukuthi kungani kube nokuphikisana okungaka mayelana nokuthayipha okumile kanye ne-mypy muva nje. Noma kungenzeka ukuthi uthanda iPython ngenxa yokuthayipha kwayo okuguquguqukayo, futhi okwenzekayo kumane kukucasule. Isihluthulelo senani lokuthayipha okumile isilinganiso sezinqumo: uma iphrojekthi yakho iba nkulu, yilapho uncika kakhulu ekubhaleni okumile, futhi, ekugcineni, yilapho uyidinga kakhulu.

Ake sithi iphrojekthi isifinyelele amashumi ezinkulungwane zemigqa ngosayizi, futhi kuvele ukuthi abahleli bohlelo abambalwa basebenza kuyo. Uma sicubungula iphrojekthi efana nale, ngokusekelwe kokuhlangenwe nakho kwethu, singasho ukuthi ukuqonda ikhodi yayo kuzoba ukhiye ekugcineni ukukhiqiza konjiniyela. Ngaphandle kwezichasiselo zohlobo, kungaba nzima ukuthola, ngokwesibonelo, ukuthi yiziphi izimpikiswano okufanele zidluliselwe kumsebenzi, noma ukuthi yiziphi izinhlobo zamanani umsebenzi othile ongabuyiswa. Nayi imibuzo ejwayelekile okuvamise ukuba nzima ukuyiphendula ngaphandle kokusebenzisa izichasiselo zohlobo:

  • Ingabe lo msebenzi ungabuya None?
  • Kufanele kube yini le mpikiswano? items?
  • Luyini uhlobo lwesibaluli id: int ingabe, str, noma mhlawumbe uhlobo oluthile lwangokwezifiso?
  • Ingabe lokhu kuphikisana kufanele kube uhlu? Kungenzeka yini ukudlulisa i-tuple kuyo?

Uma ubheka amazwibela ekhodi anezichasiselo ezilandelayo bese uzama ukuphendula imibuzo efana nalena, kuvela ukuthi lona umsebenzi olula:

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

  • read_metadata ayibuyi Nonengoba uhlobo lokubuyisela alukho Optional[…].
  • Ukuphikisana items kuwukulandelana kwemigqa. Akwazi ukuphindwa nganoma iyiphi indlela.
  • Isibaluli id iwuchungechunge lwamabhayithi.

Ezweni elikahle, umuntu angalindela ukuthi konke ubuqili obunjalo buchazwe kumadokhumenti akhelwe ngaphakathi (i-docstring). Kodwa ulwazi lunikeza izibonelo eziningi ukuthi imibhalo enjalo ngokuvamile ayibonwa kukhodi okufanele usebenze ngayo. Ngisho noma imibhalo enjalo ikhona kukhodi, awukwazi ukuthembela ekunembeni kwayo ngokuphelele. Lawa madokhumenti angase angacaci, angaqondile, futhi avuleleke ekungaqondisweni kahle. Emaqenjini amakhulu noma kumaphrojekthi amakhulu, le nkinga ingaba nkulu kakhulu.

Ngenkathi iPython iphumelela kakhulu kumaphrojekthi asekuqaleni noma amaphakathi, kwesinye isikhathi amaphrojekthi aphumelelayo nezinkampani ezisebenzisa iPython zingase zibhekane nombuzo obalulekile: "Ingabe kufanele sibhale kabusha yonke into ngolimi oluthayiphiwe?"

Thayipha amasistimu okuhlola afana ne-mypy axazulule inkinga engenhla ngokunikeza unjiniyela ulimi olusemthethweni lokuchaza izinhlobo, futhi ngokuhlola ukuthi lolo hlobo lwezimemezelo lufana nokuqaliswa kohlelo (futhi, ngokuzikhethela, ukuhlola ubukhona bazo). Ngokuvamile, singasho ukuthi lezi zinhlelo zisinikeza okuthile okufana namadokhumenti aqinisekiswe ngokucophelela.

Ukusetshenziswa kwalezi zinhlelo kunezinye izinzuzo, futhi aziyona into encane:

  • Isistimu yokuhlola uhlobo ingathola amaphutha amancane (futhi hhayi amancane kakhulu). Isibonelo esijwayelekile yilapho bekhohlwa ukucubungula inani None noma esinye isimo esikhethekile.
  • Ikhodi yokwenza kabusha yenziwe lula kakhulu ngoba isihloli sohlobo sivame ukukutshela ukuthi iyiphi ikhodi edinga ukushintshwa. Ngesikhathi esifanayo, akudingeki sithembele ekuhlolweni kwekhodi engu-100%, ngokuvamile okungenakwenzeka kunoma yikuphi. Akudingekile ukuthi simbe sijule emibikweni yokulandela isitaki ukuze sithole ukuthi yini engalungile.
  • Ngisho nakumaphrojekthi amakhulu, i-mypy ngokuvamile ingakwazi ukuhlola uhlobo oluphelele ngengxenyana yomzuzwana. Futhi ukuqalisa ukuhlola kuvame ukuthatha amashumi amasekhondi noma ngisho namaminithi. Uhlelo lokuhlola uhlobo lunikeza umhleli impendulo esheshayo futhi lumvumela ukuthi enze umsebenzi wakhe ngokushesha. Akasadingeki ukuthi abhale izinto ezintekenteke futhi ezinzima ukuze agcine uhlolo lweyunithi olushintshanisa amabhizinisi angempela ngezihlekisayo nezichibiyelo ukuze nje athole imiphumela yokuhlolwa kwekhodi esheshayo.

Ama-IDE nabahleli abanjenge-PyCharm noma Ikhodi Yesitudiyo Esibonakalayo basebenzisa amandla ohlobo lwezichasiselo ukuze banikeze abathuthukisi ukuqedelwa kwekhodi okuzenzakalelayo, ukugqanyiswa kwamaphutha, nokusekelwa kwezakhi zolimi ezivame ukusetshenziswa. Futhi lezi ezinye zezinzuzo ezihlinzekwa ngokuthayipha. Kwabanye abahleli bohlelo, konke lokhu kuyimpikiswano enkulu evuna ukuthayipha. Lokhu kuyinto eletha izinzuzo ngokushesha ngemva kokuqaliswa. Leli cala lokusetshenziswa kwezinhlobo alidingi uhlobo oluhlukile lokuhlola uhlelo olufana ne-mypy, nakuba kufanele kuqashelwe ukuthi i-mypy isiza ukugcina ukuvumelana phakathi kohlobo lwezichasiselo nekhodi.

Mypy background

Indaba eyindida yaqala e-UK, eCambridge, eminyakeni embalwa ngaphambi kokuthi ngijoyine iDropbox. Njengengxenye yocwaningo lwami lobudokotela, ngasebenza endabeni yokuhlanganisa izilimi ezithayiphiwe ngokwezibalo nezishintshashintshayo. Ngigqugquzelwe i-athikili emayelana nokuthayipha okungeziwe kuka-Jeremy Siek no-Walid Tah, kanye nephrojekthi ye-Typed Racket. Ngizamile ukuthola izindlela zokusebenzisa ulimi olufanayo lokuhlela kumaphrojekthi ahlukene - kusuka emibhalweni emincane kuya kumakhodi esisekelo ahlanganisa izigidi eziningi zemigqa. Ngesikhathi esifanayo, ngangifuna ukuqinisekisa ukuthi kuphrojekthi yanoma yisiphi isikali kwakungeke kudingeke ngenze ukuyekethisa okuningi kakhulu. Ingxenye ebalulekile yakho konke lokhu kwakuwumbono wokusuka kancane kancane kuphrojekthi ye-prototype engabhalwanga iye kumkhiqizo oqediwe ohlolwe ngokuphelele, othayiphiwe ngokwezibalo. Le mibono ithathwa njengento nje kulezi zinsuku, kodwa ngo-2010 kwakuyindaba ebisacwaningwa ngokujulile.

Umsebenzi wami wokuqala ekuhloleni uhlobo wawungahloselwe iPython. Kunalokho ngisebenzise ulimi oluncane "olwenziwa ekhaya". Alore. Nasi isibonelo sokukunikeza umbono walokho esikhuluma ngakho (uhlobo lwezichasiselo luyakhethwa):

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

Ukusebenzisa ulimi olulula lokuklama kwakho kuyindlela evamile esetshenziswa ocwaningweni lwesayensi. Lokhu kunjalo, hhayi okungenani ngoba lokhu kwenza kube lula ukwenza izivivinyo ngokushesha, futhi futhi ngoba lokho okungahambisani nocwaningo kungashaywa indiva kalula. Izilimi zohlelo lwempilo yangempela zivame ukuba yizenzakalo ezinkulu ezinokusetshenziswa okuyinkimbinkimbi, okunciphisa ukuhlolwa. Nokho, noma yimiphi imiphumela esekelwe olimini olwenziwe lula ingumsolwa omncane, njengoba ekutholeni le miphumela umcwaningi angase adele ukucatshangelwa okubalulekile ekusetshenzisweni kwezilimi ngokoqobo.

Isihloli sami sohlobo se-Alore besibukeka sithembisa kakhulu, kodwa bengifuna ukusihlola ngokuzama ikhodi yangempela ebingabhalwanga nge-Alore. Ngenhlanhla yami, ulimi lwe-Alore lwalusekelwe kakhulu emibonweni efanayo neyePython. Kwakulula ngokwanele ukuklama kabusha isihloli sohlobo ukuze sisebenze ne-Python syntax ne-semantics. Lokhu kusivumele ukuthi sizame ukuhlola uhlobo lwekhodi yePython yomthombo ovulekile. Ngiphinde ngabhala i-transpiler ukuze ngiguqule ikhodi ye-Alore ibe ikhodi ye-Python futhi ngiyisebenzise ukuhumusha ikhodi yami yokuhlola uhlobo. Manje ngase nginohlelo lokuhlola uhlobo olubhalwe ngePython olusekela i-subset yePython, ukuhluka okuthile kwalolo limi! (Izinqumo ezithile zezakhiwo ezazinengqondo ku-Alore beziyifanelekele kabi iPython; lokhu kusabonakala kwezinye izingxenye ze-mypy codebase.)

Eqinisweni, ulimi olusekelwa uhlelo lwami lohlobo alukwazi ukubizwa ngokuthi iPython okwamanje: bekungukuhluka kwePython ngenxa yemikhawulo ethile ye-syntax yesichasiselo sohlobo lwePython 3.

Ibukeke njengengxube yeJava nePython:

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

Omunye wemibono yami ngaleso sikhathi kwakuwukusebenzisa izichasiselo zohlobo ukuthuthukisa ukusebenza ngokuhlanganisa lokhu kunambitheka kwePython ku-C, noma mhlawumbe ku-JVM bytecode. Ngifike esigabeni sokubhala i-prototype compiler, kodwa ngawushiya lo mbono ngoba uhlobo lokuzihlola lubukeka luwusizo kakhulu.

Ngigcine ngethule iphrojekthi yami ku-PyCon 2013 e-Santa Clara. Ngiphinde ngakhuluma ngalokhu noGuido van Rossum, umashiqela onomusa wePython impilo yakhe yonke. Wangiqinisekisa ukuthi ngilahle i-syntax yami yangokwezifiso futhi nginamathele ku-syntax evamile yePython 3. I-Python 3 isekela izichasiselo zokusebenza, ngakho isibonelo sami singabhalwa kabusha njengoba ngezansi, kuphumele ohlelweni oluvamile lwePython:

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

Kwadingeka ngenze ukuvumelana okuthile (okokuqala, ngifuna ukuveza ukuthi yingakho ngizisungulele eyami i-syntax). Ikakhulukazi, i-Python 3.3, inguqulo yakamuva yolimi ngaleso sikhathi, ayizange isekele izichasiselo eziguquguqukayo. Ngixoxe ngezinketho ezihlukahlukene zokwenziwa kwezichasiselo ezinjalo noGuido nge-imeyili. Sinqume ukusebenzisa uhlobo lwamazwana kokuguquguqukayo. Lokhu kufinyelele umgomo, kodwa kubukeka kunzima (Python 3.6 isinike i-syntax enhle):

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

Uhlobo lwamazwana luwusizo futhi ekusekeleni i-Python 2, engenakho ukusekelwa okwakhelwe ngaphakathi kohlobo lwezichasiselo:

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

Kuvele ukuthi lokhu (kanye nokunye) ukuvumelana akunandaba ngempela - izinzuzo zokuthayipha okumile zisho ukuthi abasebenzisi basheshe bakhohlwa mayelana ne-syntax engaphelele. Njengoba ikhodi ye-Python eyayilawula izinhlobo ingasasebenzisi i-syntax ekhethekile, amathuluzi akhona e-Python nezinqubo zekhodi aqhubeka nokusebenza ngokujwayelekile, okwenza kube lula kakhulu kubathuthukisi ukuthi bafunde ithuluzi elisha.

U-Guido uphinde wangiqinisekisa ukuthi ngijoyine i-Dropbox ngemva kokuqeda ithisisi yami ephezulu. Yilapho into ethakazelisa kakhulu emlandweni we-mypy iqala khona.

Kuzoqhubeka ...

Bafundi abathandekayo! Uma usebenzisa i-Python, sicela usitshele mayelana nesilinganiso samaphrojekthi owakhayo ngalolu limi.

Indlela yokuhlola imigqa eyizigidi ezi-4 yekhodi yePython. Ingxenye 1
Indlela yokuhlola imigqa eyizigidi ezi-4 yekhodi yePython. Ingxenye 1

Source: www.habr.com

Engeza amazwana