Njira yolembera mizere 4 miliyoni ya Python code. Gawo 1

Lero tikubweretserani gawo loyamba la kumasulira kwazinthu za momwe Dropbox imagwirira ntchito ndi mtundu wa Python code control.

Njira yolembera mizere 4 miliyoni ya Python code. Gawo 1

Dropbox amalemba zambiri mu Python. Ichi ndi chilankhulo chomwe timagwiritsa ntchito kwambiri - pazothandizira zam'mbuyo komanso pamakasitomala apakompyuta. Timagwiritsanso ntchito Go, TypeScript ndi Rust kwambiri, koma Python ndiye chilankhulo chathu chachikulu. Poganizira kukula kwathu, ndipo tikukamba za mamiliyoni a mizere ya Python code, zidapezeka kuti kusindikiza kwamphamvu kwa code yotere kunasokoneza kumvetsetsa kwake ndipo kunayamba kukhudza kwambiri zokolola za antchito. Kuti tichepetse vutoli, tayamba kusintha pang'onopang'ono kachidindo kathu kukhala ma static type checking pogwiritsa ntchito mypy. Iyi mwina ndiye njira yotchuka kwambiri yowonera yokha ya Python. Mypy ndi pulojekiti yotseguka, opanga ake akuluakulu amagwira ntchito ku Dropbox.

Dropbox inali imodzi mwamakampani oyamba kukhazikitsa ma static type checking mu Python code pamlingo uwu. Mypy imagwiritsidwa ntchito masauzande ambiri masiku ano. Chida ichi chakhala, monga akunena, "choyesedwa pankhondo" kambirimbiri. Tinayenera kuyenda mtunda wautali kuti tifike pamene tili pano. Pakhala pali zoyesayesa zambiri zomwe sizinaphule kanthu ndi kuyesa kolephera panjira. Chidutswachi chikufotokoza mbiri ya mtundu wa static kuyang'ana mu Python, kuyambira pachiyambi cha miyala monga gawo la kafukufuku wanga wamaphunziro mpaka lero, pamene macheke amtundu ndi zizindikiro zamtundu zakhala zofala pakati pa opanga Python osawerengeka. Njirazi tsopano zimathandizidwa ndi zida zosiyanasiyana, monga ma IDE ndi ma code analyzer.

β†’ Werengani gawo lachiwiri

N'chifukwa chiyani kuwunika kolemba kumafunika?

Ngati mudagwiritsapo ntchito Python yojambulidwa mwamphamvu, mutha kukhala osokonezeka pang'ono kuti chifukwa chiyani pakhala mkangano wochuluka wokhudza kulemba ndi mypy posachedwa. Kapena mwina mumakonda Python ndendende chifukwa cha kulemba kwake kwamphamvu, ndipo zomwe zikuchitika zimakukhumudwitsani. Chinsinsi cha mtengo wa static typing ndi kukula kwa zisankho: kukula kwa projekiti yanu, m'pamene mumatsamira pamatayipi okhazikika, ndipo, pamapeto pake, m'pamene mumafunikira kwambiri.

Tiyerekeze kuti polojekiti yafika mizere masauzande ambiri, ndipo zikuwoneka kuti opanga mapulogalamu angapo akugwira ntchitoyo. Poganizira za pulojekiti ngati iyi, kutengera zomwe takumana nazo, titha kunena kuti kumvetsetsa kachidindo kake kudzakhala chinsinsi chothandizira kuti chitukuko chikhale bwino. Popanda zilembo zamtundu, zimakhala zovuta kudziwa, mwachitsanzo, ndi mfundo ziti zomwe ziyenera kuperekedwa ku ntchito, kapena ndi mitundu yanji yomwe ntchito inayake ingabwerere. Nawa mafunso omwe nthawi zambiri amakhala ovuta kuyankha popanda kugwiritsa ntchito mawu ofotokozera:

  • Kodi ntchitoyi ingabwerere None?
  • Kodi mkangano uwu uyenera kukhala chiyani? items?
  • Kodi mtundu wake ndi chiyani id: int ndi, str, kapena mwina mtundu wina wake?
  • Kodi mtsutso uwu uyenera kukhala mndandanda? Kodi ndizotheka kupititsa tuple mmenemo?

Mukayang'ana kadulidwe kotsatira kameneka ndikuyesa kuyankha mafunso ngati awa, zimakhala kuti iyi ndi ntchito yosavuta:

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

  • read_metadata sabwerera Nonechifukwa mtundu wobwerera si Optional[…].
  • Kukangana items ndi mndandanda wa mizere. Sizingabwerezedwe mwadongosolo lililonse.
  • Chitani id ndi mndandanda wa ma byte.

M'dziko labwino, munthu angayembekeze kuti zobisika zonsezi zidzafotokozedwa muzolemba zomangidwa (docstring). Koma zochitika zimapereka zitsanzo zambiri zomwe zolembedwa zoterezi nthawi zambiri sizimawonedwa mu code yomwe muyenera kugwira nayo ntchito. Ngakhale zolemba zotere zilipo mu code, simungadalire kulondola kwake kotheratu. Zolemba izi zitha kukhala zosadziwika bwino, zosalondola, komanso zotsegula kuti anthu asamamvetse. M'magulu akuluakulu kapena ntchito zazikulu, vutoli likhoza kukhala lovuta kwambiri.

Ngakhale Python imachita bwino pamapulojekiti oyambilira kapena apakati, nthawi zina mapulojekiti opambana ndi makampani omwe amagwiritsa ntchito Python angayang'ane ndi funso lofunika kwambiri: "Kodi tiyenera kulembanso chilichonse m'chilankhulo choyimira?"

Lembani machitidwe owunika ngati mypy amathetsa vuto lomwe lili pamwambapa popatsa wopanga chilankhulo chofotokozera mitundu, komanso poyang'ana zolengeza zamtunduwu zikugwirizana ndi kukhazikitsidwa kwa pulogalamuyo (ndipo, mwakufuna, kuwona ngati zilipo). Mwambiri, titha kunena kuti makinawa amatipatsa zinthu monga zolemba zotsimikizika bwino.

Kugwiritsa ntchito machitidwe otere kuli ndi zabwino zina, ndipo ndizopanda kanthu:

  • Njira yowunikira mtundu imatha kuzindikira zolakwika zazing'ono (komanso osati zazing'ono). Chitsanzo chabwino ndi pamene amaiwala kukonza mtengo None kapena chikhalidwe china chapadera.
  • Refactoring code imakhala yosavuta chifukwa chowunikira mtundu nthawi zambiri chimakuuzani ndendende code yomwe iyenera kusinthidwa. Panthawi imodzimodziyo, sitiyenera kudalira 100% kuyesa kuyesa kwa code, zomwe nthawi zambiri sizingatheke mulimonsemo. Sitifunika kukumba mozama malipoti opezeka kuti tidziwe chomwe chalakwika.
  • Ngakhale pamapulojekiti akuluakulu, mypy nthawi zambiri amatha kuyesa mtundu wathunthu mumphindi imodzi. Ndipo kuyesa kuyesa nthawi zambiri kumatenga masekondi khumi kapenanso mphindi. Dongosolo loyang'anira mtundu limapereka mayankho apompopompo kwa wopanga mapulogalamu ndikumulola kuti agwire ntchito yake mwachangu. Sakufunikanso kulemba zosalimba komanso zovuta kusunga mayeso a mayunitsi omwe amalowa m'malo mwazinthu zenizeni ndi zoseweretsa ndi zigamba kuti apeze zotsatira zoyeserera mwachangu.

Ma IDE ndi okonza monga PyCharm kapena Visual Studio Code amagwiritsa ntchito mphamvu zamtundu wofotokozera kuti apatse opanga ma code odziwikiratu, kuwunikira zolakwika, ndikuthandizira pakumanga zilankhulo zomwe zimagwiritsidwa ntchito kwambiri. Ndipo izi ndi zina mwazabwino zomwe typification imapereka. Kwa ena opanga mapulogalamu, zonsezi ndiye mtsutso waukulu wokomera kulemba. Ichi ndi chinthu chomwe chimabweretsa phindu mwamsanga pambuyo pokhazikitsa. Mlanduwu wamitundu sufuna njira yowunikira yosiyana monga mypy, ngakhale ziyenera kudziwidwa kuti mypy imathandizira kuti zolemba zamtundu zigwirizane ndi code.

Mypy maziko

Nkhani yodabwitsayi idayamba ku UK, ku Cambridge, zaka zingapo ndisanalowe Dropbox. Monga gawo la kafukufuku wanga wa udokotala, ndinagwira ntchito pa nkhani yogwirizanitsa zilankhulo zotayidwa komanso zosinthika. Ndinalimbikitsidwa ndi nkhani yokhudza kulemba kowonjezereka kwa Jeremy Siek ndi Walid Tah, komanso polojekiti ya Typed Racket. Ndidayesa kupeza njira zogwiritsira ntchito chilankhulo chofananira pamapulojekiti osiyanasiyana - kuyambira zolemba zazing'ono mpaka ma codebase okhala ndi mizere yambirimbiri. Panthawi imodzimodziyo, ndinkafuna kuonetsetsa kuti mu polojekiti yamtundu uliwonse sindidzayenera kuchita zinthu zambiri. Gawo lofunikira pa zonsezi linali lingaliro lakusuntha pang'onopang'ono kuchoka ku pulojekiti yosasindikizidwa kupita ku chinthu chomaliza choyesedwa bwino, cholembedwa mokhazikika. Malingaliro awa amatengedwa mopepuka masiku ano, koma mu 2010 inali nkhani yomwe idafufuzidwabe mwachangu.

Ntchito yanga yoyamba poyang'ana mtundu sinali ya Python. M'malo mwake ndinagwiritsa ntchito chilankhulo chaching'ono "chopanga kunyumba". Alore. Nachi chitsanzo kuti tikupatseni lingaliro la zomwe tikukamba (zofotokozera zamtundu wamtunduwu ndizosankha):

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

Kugwiritsa ntchito chilankhulo chosavuta cha kapangidwe kanu ndi njira yomwe imagwiritsidwa ntchito pofufuza zasayansi. Izi zili choncho, osati chifukwa chakuti izi zimapangitsa kuti zikhale zotheka kuchita zoyesera mwamsanga, komanso chifukwa zomwe sizili zogwirizana ndi kafukufuku zikhoza kunyalanyazidwa mosavuta. Zilankhulo zenizeni zenizeni zimakhala zochitika zazikulu zomwe zimakhala zovuta kukhazikitsa, zomwe zimachepetsa kuyesa. Komabe, zotsatira zilizonse zochokera m'chinenero chosavuta zimakhala zokayikira pang'ono, chifukwa popeza zotsatira izi wofufuzayo angakhale atasiya kuganizira zofunikira kuti agwiritse ntchito zilankhulo.

Chowunikira changa chamtundu wa Alore chinkawoneka chosangalatsa kwambiri, koma ndimafuna kuyesa poyesa ma code enieni omwe sanalembedwe mu Alore. Mwamwayi kwa ine, chilankhulo cha Alore chinali chozikidwa pamalingaliro omwewo monga Python. Zinali zosavuta kukonzanso chowunikira kuti chizitha kugwira ntchito ndi Python syntax ndi semantics. Izi zidatipangitsa kuyesa kuyang'ana mtundu wa Python code yotseguka. Ndinalembanso transpiler kuti ndisinthe kachidindo ka Alore kukhala kachidindo ka Python ndipo ndidagwiritsa ntchito kumasulira nambala yanga yowunika. Tsopano ndinali ndi mtundu wowunika wolembedwa mu Python womwe umathandizira kagawo kakang'ono ka Python, kusiyanasiyana kwa chilankhulo chimenecho! (Zisankho zina zamamangidwe zomwe zinali zomveka kwa Alore zinali zosayenera kwa Python; izi zikuwonekerabe m'malo ena a mypy codebase.)

M'malo mwake, chilankhulo chomwe chimathandizidwa ndi mtundu wanga sichingatchulidwe kuti Python pakadali pano: chinali chosiyana cha Python chifukwa cha zolephera za Python 3's syntax.

Zinkawoneka ngati kusakaniza kwa Java ndi Python:

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

Limodzi mwamalingaliro anga panthawiyo linali kugwiritsa ntchito zofotokozera zamtundu kuti zitheke bwino polemba kukoma kwa Python kukhala C, kapena mwina JVM bytecode. Ndidafika polemba chojambulira, koma ndidasiya lingaliroli chifukwa kudzifufuza komweko kumawoneka kothandiza.

Ndidamaliza kupereka ntchito yanga ku PyCon 2013 ku Santa Clara. Ndinalankhulanso za izi ndi Guido van Rossum, wolamulira wankhanza wa Python kwa moyo wonse. Ananditsimikizira kuti ndisiye kalembedwe kanga ka chizolowezi ndikumamatira ndi mawu a Python 3. Python 3 imathandizira mawu ofotokozera, kotero chitsanzo changa chikhoza kulembedwanso monga pansipa, zomwe zimapangitsa kuti pulogalamu ya Python ikhale yabwino:

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

Ndinayenera kupanga zosagwirizana (choyamba, ndikufuna kunena kuti ndichifukwa chake ndinapanga mawu anga). Makamaka, Python 3.3, mtundu waposachedwa kwambiri wa chilankhulo panthawiyo, sunagwirizane ndi mawu osintha. Ndidakambirana njira zingapo zamawu omasulira ndi Guido kudzera pa imelo. Tinaganiza zogwiritsa ntchito ndemanga zamitundu yosiyanasiyana. Izi zidakwaniritsa cholingacho, koma zimawoneka ngati zovutirapo (Python 3.6 idatipatsa mawu abwino):

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

Ndemanga zamtundu ndizothandizanso pothandizira Python 2, yomwe ilibe chothandizira pazofotokozera zamtundu:

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

Zinapezeka kuti izi (ndi zina) zosagwirizana zinalibe kanthu - phindu la kulemba mosasunthika kumatanthauza kuti ogwiritsa ntchito posakhalitsa amaiwala za mawu ocheperako. Popeza code ya Python yomwe inkalamulira mitundu sinagwiritsenso ntchito mawu apadera, zida za Python zomwe zilipo kale ndi ndondomeko zamakhodi zinapitirizabe kugwira ntchito bwino, zomwe zimapangitsa kuti zikhale zosavuta kwa opanga kuphunzira chida chatsopano.

Guido adandilimbikitsanso kuti ndilowe nawo Dropbox nditamaliza maphunziro anga apamwamba. Apa ndipamene chinthu chosangalatsa kwambiri m'mbiri ya mypy chimayambira.

Zipitilizidwa…

Wokondedwa owerenga! Ngati mugwiritsa ntchito Python, chonde tiwuzeni za kukula kwa mapulojekiti omwe mumapanga m'chinenerochi.

Njira yolembera mizere 4 miliyoni ya Python code. Gawo 1
Njira yolembera mizere 4 miliyoni ya Python code. Gawo 1

Source: www.habr.com

Kuwonjezera ndemanga