Hanyar da za a bi don bincika layin 4 miliyan na lambar Python. Kashi na 1

A yau mun kawo hankalinku ɓangaren farko na fassarar kayan kan yadda Dropbox ke hulɗa da nau'in sarrafa lambar Python.

Hanyar da za a bi don bincika layin 4 miliyan na lambar Python. Kashi na 1

Dropbox yana rubuta abubuwa da yawa a cikin Python. Harshe ne da muke amfani da shi sosai, duka don sabis na ƙarshen baya da aikace-aikacen abokin ciniki na tebur. Hakanan muna amfani da Go, TypeScript da Tsatsa da yawa, amma Python shine babban yaren mu. Idan aka yi la'akari da sikelinmu, kuma muna magana ne game da miliyoyin layin lambar Python, ya nuna cewa ƙarfin bugun irin wannan lambar ya rikitar da fahimtarsa ​​ba dole ba kuma ya fara tasiri sosai ga yawan aiki. Don rage wannan matsalar, mun fara canza lambar mu sannu a hankali zuwa nau'in bincike na tsaye ta amfani da mypy. Wannan tabbas shine mafi mashahuri tsarin bincika nau'in nau'in nau'in nau'in Python. Mypy aikin buɗaɗɗen tushe ne, manyan masu haɓakawa suna aiki a Dropbox.

Dropbox yana ɗaya daga cikin kamfanoni na farko da suka aiwatar da nau'in bincike na tsaye a cikin lambar Python a wannan sikelin. Ana amfani da Mypy a cikin dubban ayyuka kwanakin nan. Wannan kayan aiki sau da yawa, kamar yadda suke faɗa, "an gwada a cikin yaƙi." Mun yi nisa don isa inda muke a yanzu. A kan hanyar, akwai ayyuka da yawa marasa nasara da gwaje-gwajen da suka gaza. Wannan sakon ya kunshi tarihin duba nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'in nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i nau'i-nau'i-kaya)) a matsayin wani ɓangare na aikin bincike na,har zuwa yau,lokacin da nau'in dubawa da nau'in hinting suka zama ruwan dare ga masu ƙirƙira da yawa waɗanda ke rubutu da Python. Waɗannan hanyoyin yanzu ana samun goyan bayan kayan aikin da yawa kamar IDEs da masu tantance lambobin.

Karanta kashi na biyu

Me yasa duba nau'in ya zama dole?

Idan kun taɓa yin amfani da Python mai ƙarfi da ƙarfi, kuna iya samun ɗan ruɗani game da dalilin da yasa aka sami irin wannan hargitsi game da buga rubutu da mypy kwanan nan. Ko wataƙila kuna son Python daidai saboda ƙarfin bugawa, kuma abin da ke faruwa yana ba ku haushi. Makullin darajar buga rubutu a tsaye shine ma'aunin mafita: girman aikin ku, gwargwadon yadda kuke karkata zuwa ga buga rubutu a tsaye, kuma a ƙarshe, gwargwadon buƙatarku da gaske.

A ce wani aikin ya kai girman dubunnan layukan, kuma ya zamana cewa masu shirye-shirye da yawa suna aiki a kai. Duban irin wannan aikin, dangane da kwarewarmu, zamu iya cewa fahimtar lambar sa zai zama mabuɗin ci gaba da ci gaba. Ba tare da annotations na nau'in ba, yana iya zama da wahala a gano, alal misali, menene mahawara don wucewa zuwa aiki, ko nau'ikan nau'ikan aikin zai iya dawowa. Ga tambayoyi na yau da kullun waɗanda galibi suna da wahalar amsawa ba tare da yin amfani da bayanan rubutu ba:

  • Shin wannan aikin zai iya dawowa None?
  • Menene ya kamata wannan hujja ta kasance? items?
  • Menene nau'in sifa id: int ba, str, ko watakila wani nau'in al'ada?
  • Ya kamata wannan hujja ta zama jeri? Shin zai yiwu a wuce tuple zuwa gare shi?

Idan ka kalli wannan snippet code na rubutu mai zuwa kuma kayi ƙoƙarin amsa tambayoyi iri ɗaya, ya zama cewa wannan shine aiki mafi sauƙi:

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

  • read_metadata baya dawowa None, tunda nau'in dawowa ba haka bane Optional[…].
  • shaida items shi ne jerin layi. Ba za a iya maimaita shi ba da gangan.
  • Kasancewa id shi ne kirtani na bytes.

A cikin kyakkyawar duniya, mutum zai yi tsammanin cewa za a bayyana duk irin waɗannan dabaru a cikin takaddun da aka gina (docstring). Amma kwarewa yana ba da misalai da yawa na gaskiyar cewa irin waɗannan takaddun ba a kiyaye su sau da yawa a cikin lambar da dole ne ku yi aiki tare da su. Ko da irin waɗannan takaddun suna nan a cikin lambar, mutum ba zai iya ƙidaya cikakken daidaitonsa ba. Wannan takaddun na iya zama m, mara kyau, kuma buɗe ga rashin fahimta. A cikin manyan ƙungiyoyi ko manyan ayyuka, wannan matsala na iya zama mai tsanani.

Yayin da Python ya yi fice a farkon ko matsakaicin matakan ayyukan, a wani lokaci ayyukan nasara da kamfanonin da ke amfani da Python na iya fuskantar muhimmiyar tambaya: "Shin za mu sake rubuta komai a cikin yare mai ƙima?".

Nau'in tsarin dubawa kamar mypy yana magance matsalar da ke sama ta hanyar samarwa mai haɓaka yare na yau da kullun don kwatanta nau'ikan, da kuma bincika cewa nau'in sanarwar ya dace da aiwatar da shirin (kuma, ba zaɓi, bincika wanzuwarsu ba). Gabaɗaya, za mu iya cewa waɗannan tsarin sun sanya a hannunmu wani abu kamar takaddun da aka bincika a hankali.

Yin amfani da irin waɗannan tsarin yana da wasu fa'idodi, kuma sun riga sun kasance marasa mahimmanci:

  • Tsarin duba nau'in na iya gano wasu ƙananan kurakurai (kuma ba ƙanƙanta ba). Misali na yau da kullun shine lokacin da suka manta aiwatar da ƙima None ko wani yanayi na musamman.
  • An sauƙaƙa gyaran lamba sosai saboda tsarin duba nau'in sau da yawa daidai yake game da abin da ake buƙatar canza lambar. A lokaci guda, ba ma buƙatar fatan 100% ɗaukar hoto tare da gwaje-gwaje, wanda, a kowane hali, yawanci ba zai yiwu ba. Ba mu buƙatar zurfafa cikin zurfafan tari don gano musabbabin matsalar.
  • Ko da akan manyan ayyuka, mypy sau da yawa na iya yin cikakken nau'in dubawa a cikin ɗan daƙiƙa kaɗan. Kuma aiwatar da gwaje-gwaje yakan ɗauki dubun daƙiƙai ko ma mintuna. Tsarin duba nau'in yana ba mai shirye-shirye amsa nan take kuma yana ba shi damar yin aikinsa cikin sauri. Ba ya buƙatar rubuta mai rauni da wuya don kula da gwaje-gwajen naúrar waɗanda ke maye gurbin ainihin mahalli tare da izgili da faci kawai don samun sakamakon gwajin lamba cikin sauri.

IDEs da masu gyara irin su PyCharm ko Visual Studio Code suna amfani da ikon nau'in annotations don samar da masu haɓakawa tare da kammala lamba, haskaka kurakurai, da goyan baya don gina harshe da aka saba amfani da su. Kuma wadannan kadan ne daga cikin fa'idodin bugawa. Ga wasu masu shirye-shirye, duk wannan shine babbar hujjar da ke goyon bayan bugawa. Wannan wani abu ne da ke amfana nan da nan bayan aiwatarwa. Wannan yanayin amfani don nau'ikan baya buƙatar tsarin bincika nau'in daban kamar mypy, kodayake ya kamata a lura cewa mypy yana taimakawa ci gaba da rubuta bayanan daidai da lamba.

Bayanan mypy

Tarihin mypy ya fara a Burtaniya, a Cambridge, ƴan shekaru kafin in shiga Dropbox. Na shiga, a matsayin wani ɓangare na binciken digiri na, a cikin haɗe-haɗe da ƙwaƙƙwaran harsuna. Wani labarin Jeremy Siek da Walid Taha sun ƙarfafa ni ta hanyar buga rubutu na ƙara, da kuma aikin Typed Racket. Na yi ƙoƙarin nemo hanyoyin yin amfani da yaren shirye-shirye iri ɗaya don ayyuka daban-daban - daga ƙananan rubutun zuwa tushe mai lamba wanda ya ƙunshi miliyoyin layukan. A lokaci guda kuma, ina so in tabbatar da cewa a cikin wani aiki na kowane ma'auni, ba dole ba ne mutum ya yi babban sulhu ba. Wani muhimmin sashi na duk wannan shine ra'ayin ƙaura sannu a hankali daga aikin samfurin da ba a buga ba zuwa ingantaccen samfurin da aka gama bugawa. A kwanakin nan, waɗannan ra'ayoyin ana ɗaukarsu da yawa, amma a cikin 2010 matsala ce da har yanzu ana bincikar ta sosai.

Aikina na asali na duba nau'in ba ya nufin Python ba. Maimakon haka, na yi amfani da ƙaramin yare na "na gida". Alore. Ga misali da zai ba ku damar fahimtar abin da muke magana akai (nau'in bayanan ba zaɓaɓɓu ba ne a nan):

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

Amfani da sauƙaƙan harshe na asali hanya ce ta gama gari da ake amfani da ita wajen binciken kimiyya. Wannan haka yake, ba wai don yana ba ku damar yin gwaje-gwaje da sauri ba, kuma saboda gaskiyar cewa abin da ba shi da alaƙa da bincike ana iya yin watsi da shi cikin sauƙi. Harsunan shirye-shirye na duniyar gaske sun kasance manyan abubuwan mamaki tare da aiwatarwa masu rikitarwa, kuma wannan yana rage gwaji. Koyaya, duk wani sakamakon da ya dogara akan sauƙaƙan harshe yana kallon ɗan shakku, tunda a samun waɗannan sakamakon mai yiwuwa mai binciken ya sadaukar da la'akari masu mahimmanci don amfani da harshe a aikace.

Mai duba nau'ina na Alore ya yi kyau sosai, amma ina so in gwada shi ta hanyar gwaji tare da ainihin code, wanda, za ku iya cewa, ba a rubuta shi da Alore ba. An yi sa'a a gare ni, yaren Alore ya dogara ne akan ra'ayoyi iri ɗaya da Python. Ya kasance mai sauƙi don canza ma'aunin rubutu ta yadda zai iya aiki tare da syntax na Python da ma'ana. Wannan ya ba mu damar gwada nau'in dubawa a cikin buɗaɗɗen tushen lambar Python. Bugu da kari, na rubuta mai jujjuya lambar da aka rubuta a cikin Alore zuwa lambar Python kuma na yi amfani da ita wajen fassara lambar ta na'ura. Yanzu ina da tsarin duba nau'in da aka rubuta a cikin Python wanda ke tallafawa wani yanki na Python, wani nau'in wannan harshe! (Wasu hukunce-hukuncen gine-ginen da suka yi ma'ana ga Alore ba su dace da Python ba, kuma har yanzu ana iya ganin wannan a sassan mypy codebase.)

A haƙiƙa, harshen da tsarin nau'ina ke goyan bayan ba za a iya kiransa da sunan Python ba a wannan lokacin: bambance-bambancen Python ne saboda wasu iyakoki na ƙirar annotation na Python 3.

Ya yi kama da cakuda Java da Python:

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

Ɗaya daga cikin ra'ayoyina a lokacin shine in yi amfani da nau'in annotations don inganta aiki ta hanyar haɗa irin wannan nau'in Python zuwa C, ko watakila JVM bytecode. Na isa matakin rubuta samfurin tarawa, amma na watsar da wannan ra'ayin, tunda nau'in tantancewar kanta ya yi matukar amfani.

Na ƙare gabatar da aikina a PyCon 2013 a Santa Clara. Na kuma yi magana game da wannan tare da Guido van Rossum, mai tausayin Python kama-karya na rayuwa. Ya rinjaye ni in sauke nawa syntax kuma in tsaya tare da daidaitaccen tsarin Python 3. Python 3 yana goyan bayan bayanan aiki, don haka za'a iya sake rubuta misalina kamar yadda aka nuna a ƙasa, yana haifar da tsarin Python na yau da kullum:

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

Dole ne in yi wasu sasantawa (na farko, ina so in lura cewa na ƙirƙira ma'anar tawa don wannan dalili). Musamman, Python 3.3, sigar yaren kwanan nan a lokacin, bai goyi bayan annotations masu canzawa ba. Na tattauna tare da Guido ta e-mail dama dama daban-daban don ƙirƙira irin waɗannan bayanan. Mun yanke shawarar yin amfani da nau'in sharhi don masu canji. Wannan ya yi aiki da manufar da aka yi niyya, amma ya ɗan ɗan yi tauri (Python 3.6 ya ba mu kyakkyawar ma'ana):

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

Rubutun sharhi kuma ya zo da amfani don tallafawa Python 2, wanda ba shi da ginanniyar tallafi don nau'in bayanin:

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

Sai ya zama cewa waɗannan (da sauran) cinikin-offs ba su da mahimmanci - fa'idodin buga rubutu na tsaye yana nufin cewa ba da daɗewa ba masu amfani sun manta game da abin da bai dace ba. Tun da ba a yi amfani da ginin haɗin kai na musamman a cikin nau'in lambar Python da aka bincika ba, kayan aikin Python da ke akwai da tsarin sarrafa lambobin sun ci gaba da aiki akai-akai, yana sa ya fi sauƙi ga masu haɓakawa su koyi sabon kayan aikin.

Guido kuma ya rinjaye ni in shiga Dropbox bayan na kammala karatun digiri na. Anan ne ɓangaren mafi ban sha'awa na labarin mypy ya fara.

A ci gaba…

Ya ku masu karatu! Idan kuna amfani da Python, da fatan za a gaya mana game da girman ayyukan da kuke haɓakawa a cikin wannan harshe.

Hanyar da za a bi don bincika layin 4 miliyan na lambar Python. Kashi na 1
Hanyar da za a bi don bincika layin 4 miliyan na lambar Python. Kashi na 1

source: www.habr.com

Add a comment