Ọna lati ṣe ayẹwo awọn laini miliọnu mẹrin ti koodu Python. Apa 4

Loni a mu si akiyesi rẹ apakan akọkọ ti itumọ ohun elo lori bii Dropbox ṣe n ṣe pẹlu iru iṣakoso ti koodu Python.

Ọna lati ṣe ayẹwo awọn laini miliọnu mẹrin ti koodu Python. Apa 4

Dropbox kọ pupọ ni Python. O jẹ ede ti a lo lọpọlọpọ, mejeeji fun awọn iṣẹ-ipari ati awọn ohun elo alabara tabili. A tun lo Go, TypeScript ati Rust pupọ, ṣugbọn Python ni ede akọkọ wa. Ṣiyesi iwọn wa, ati pe a n sọrọ nipa awọn miliọnu awọn laini ti koodu Python, o yipada pe titẹ agbara ti iru koodu lainidi idiju oye rẹ ati bẹrẹ si ni ipa ni pataki iṣelọpọ iṣẹ. Lati dinku iṣoro yii, a ti bẹrẹ lati yipada diẹdiẹ koodu wa si ṣiṣe ayẹwo iru aimi nipa lilo mypy. Eyi le jẹ eto ṣiṣe ayẹwo iru adaduro olokiki julọ fun Python. Mypy jẹ iṣẹ akanṣe orisun ṣiṣi, awọn olupilẹṣẹ akọkọ ṣiṣẹ ni Dropbox.

Dropbox jẹ ọkan ninu awọn ile-iṣẹ akọkọ lati ṣe iṣayẹwo iru aimi ni koodu Python ni iwọn yii. Mypy ti lo ni ẹgbẹẹgbẹrun awọn iṣẹ akanṣe ni awọn ọjọ wọnyi. Ọpa yii ainiye igba, bi wọn ti sọ, “idanwo ni ogun.” A ti wa ọna pipẹ lati de ibi ti a wa ni bayi. Ni ọna, ọpọlọpọ awọn iṣẹ ṣiṣe ti ko ni aṣeyọri ati awọn adanwo ti o kuna. Ifiweranṣẹ yii ni wiwa itan-akọọlẹ ti iṣayẹwo iru aimi ni Python, lati awọn ibẹrẹ apata rẹ gẹgẹ bi apakan ti iṣẹ akanṣe iwadii mi, titi di oni, nigbati iru ṣayẹwo ati iru hinting ti di aaye ti o wọpọ fun awọn olupilẹṣẹ ainiye ti o kọ ni Python. Awọn ọna ṣiṣe wọnyi ni atilẹyin nipasẹ ọpọlọpọ awọn irinṣẹ bii IDE ati awọn itupalẹ koodu.

Ka apakan keji

Kini idi ti iṣayẹwo iru jẹ dandan?

Ti o ba ti lo Python ti o ni agbara ti o ni agbara, o le ni iruju diẹ si idi ti iru ariwo kan wa ni ayika titẹ aimi ati mypy laipẹ. Tabi boya o fẹran Python ni pipe nitori titẹ agbara rẹ, ati pe ohun ti n ṣẹlẹ ni o binu ọ. Bọtini si iye ti titẹ aimi ni iwọn awọn ojutu: ti iṣẹ akanṣe rẹ ti tobi, diẹ sii ni o tẹra si titẹ aimi, ati ni ipari, diẹ sii o nilo rẹ gaan.

Ṣebi iṣẹ akanṣe kan ti de iwọn awọn ẹgbẹẹgbẹrun awọn laini, ati pe o jẹ pe ọpọlọpọ awọn pirogirama n ṣiṣẹ lori rẹ. Wiwo iru iṣẹ akanṣe kan, ti o da lori iriri wa, a le sọ pe agbọye koodu rẹ yoo jẹ bọtini lati jẹ ki awọn olupilẹṣẹ jẹ iṣelọpọ. Laisi awọn asọye iru, o le nira lati ro ero, fun apẹẹrẹ, kini awọn ariyanjiyan lati kọja si iṣẹ kan, tabi iru iru iṣẹ kan le pada. Eyi ni awọn ibeere aṣoju ti o nira nigbagbogbo lati dahun laisi lilo awọn asọye iru:

  • Le iṣẹ yi pada None?
  • Kini o yẹ ki ariyanjiyan yii jẹ? items?
  • Kini iru abuda naa id: int se beeni, str, tabi boya diẹ ninu awọn aṣa iru?
  • Ṣe o yẹ ki ariyanjiyan yii jẹ atokọ kan? Ṣe o ṣee ṣe lati kọja tuple kan si rẹ?

Ti o ba wo iru-akọsilẹ koodu snippet ti o tẹle ati gbiyanju lati dahun awọn ibeere ti o jọra, o wa ni pe eyi ni iṣẹ ti o rọrun julọ:

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

  • read_metadata ko pada None, niwon awọn pada iru ni ko Optional[…].
  • Ariyanjiyan items jẹ ọkọọkan awọn ila. Ko le ṣe atunto laileto.
  • Ẹya-ara id jẹ okun ti awọn baiti.

Ninu aye ti o peye, eniyan yoo nireti pe gbogbo iru awọn arekereke yoo jẹ apejuwe ninu iwe ti a ṣe sinu (docstring). Ṣugbọn iriri funni ni ọpọlọpọ awọn apẹẹrẹ ti o daju pe iru iwe bẹ nigbagbogbo ko ṣe akiyesi ni koodu pẹlu eyiti o ni lati ṣiṣẹ. Paapaa ti iru iwe bẹ ba wa ninu koodu, ọkan ko le gbekele lori pipe pipe rẹ. Iwe yi le jẹ aiduro, aiṣedeede, ati ṣiṣi si awọn aiyede. Ni awọn ẹgbẹ nla tabi awọn iṣẹ akanṣe nla, iṣoro yii le di nla pupọ.

Lakoko ti Python bori ni ibẹrẹ tabi awọn ipele agbedemeji ti awọn iṣẹ akanṣe, ni aaye kan awọn iṣẹ akanṣe aṣeyọri ati awọn ile-iṣẹ ti o lo Python le dojuko ibeere pataki naa: “Ṣe o yẹ ki a tun kọ ohun gbogbo ni ede ti a tẹ ni iṣiro?”.

Iru awọn eto ṣiṣe ayẹwo bi mypy yanju iṣoro ti o wa loke nipa fifun oluṣe idagbasoke pẹlu ede ti o ṣe deede fun apejuwe awọn iru, ati nipa ṣiṣe ayẹwo iru awọn ikede ni ibamu pẹlu imuse eto (ati, ni iyan, nipasẹ ṣayẹwo fun wiwa wọn). Ni gbogbogbo, a le sọ pe awọn ọna ṣiṣe wọnyi fi nkan wa si isọnu bi iwe ti a ṣayẹwo ni pẹkipẹki.

Lilo iru awọn ọna ṣiṣe ni awọn anfani miiran, ati pe wọn ti wa tẹlẹ ti kii ṣe bintin:

  • Awọn iru yiyewo eto le ri diẹ ninu awọn kekere (ati ki o ko ki kekere) aṣiṣe. Apẹẹrẹ aṣoju jẹ nigbati wọn gbagbe lati ṣe ilana iye kan None tabi diẹ ninu awọn miiran pataki majemu.
  • Iṣatunṣe koodu jẹ irọrun pupọ nitori pe iru eto ṣiṣe ayẹwo jẹ deede deede nipa iru koodu ti o nilo lati yipada. Ni akoko kanna, a ko nilo lati ni ireti fun 100% koodu agbegbe pẹlu awọn idanwo, eyiti, ni eyikeyi ọran, nigbagbogbo ko ṣee ṣe. A ko nilo lati ṣawari sinu awọn ijinle ti itọpa akopọ lati wa idi ti iṣoro naa.
  • Paapaa lori awọn iṣẹ akanṣe nla, mypy nigbagbogbo le ṣe ayẹwo iru kikun ni ida kan ti iṣẹju kan. Ati awọn ipaniyan ti awọn idanwo nigbagbogbo gba to mewa ti aaya tabi paapa iṣẹju. Eto ṣiṣe ayẹwo iru naa fun olupilẹṣẹ esi lẹsẹkẹsẹ ati gba u laaye lati ṣe iṣẹ rẹ ni iyara. Ko nilo lati kọ ẹlẹgẹ ati lile lati ṣetọju awọn idanwo ẹyọkan ti o rọpo awọn nkan gidi pẹlu ẹgan ati awọn abulẹ kan lati gba awọn abajade idanwo koodu ni iyara.

IDE ati awọn olootu bii PyCharm tabi Visual Studio Code lo agbara iru awọn asọye lati pese awọn olupilẹṣẹ pẹlu ipari koodu, afihan aṣiṣe, ati atilẹyin fun awọn itumọ ede ti o wọpọ. Ati pe iwọnyi jẹ diẹ ninu awọn anfani ti titẹ. Fun diẹ ninu awọn pirogirama, gbogbo eyi ni ariyanjiyan akọkọ ni ojurere ti titẹ. Eyi jẹ ohun ti o ni anfani lẹsẹkẹsẹ lẹhin imuse. Ọrọ lilo yii fun awọn oriṣi ko nilo eto ṣiṣe ayẹwo iru lọtọ bi mypy, botilẹjẹpe o yẹ ki o ṣe akiyesi pe mypy ṣe iranlọwọ lati tọju iru awọn asọye ni ibamu pẹlu koodu.

Lẹhin ti mypy

Itan-akọọlẹ ti mypy bẹrẹ ni UK, ni Cambridge, ọdun diẹ ṣaaju ki Mo darapọ mọ Dropbox. Mo ti kopa, gẹgẹ bi apakan ti iwadii dokita mi, ninu isọpọ ti awọn ede ti a tẹ ni iṣiro ati ti o ni agbara. Mo ni atilẹyin nipasẹ nkan kan lori titẹ afikun nipasẹ Jeremy Siek ati Walid Taha, ati nipasẹ iṣẹ akanṣe Titẹ Racket. Mo gbiyanju lati wa awọn ọna lati lo ede siseto kanna fun awọn iṣẹ akanṣe - lati awọn iwe afọwọkọ kekere si awọn ipilẹ koodu ti o ni ọpọlọpọ awọn miliọnu awọn laini. Ni akoko kanna, Mo fẹ lati rii daju pe ninu iṣẹ akanṣe ti iwọn eyikeyi, ọkan kii yoo ni lati ṣe awọn adehun nla ju. Apakan pataki ti gbogbo eyi ni imọran gbigbe diẹdiẹ lati iṣẹ akanṣe afọwọṣe ti a ko tẹ si ọja ti o ti pari ni idanwo ni kikun. Awọn ọjọ wọnyi, awọn imọran wọnyi ni a gba fun lasan, ṣugbọn ni ọdun 2010 o jẹ iṣoro kan ti o tun n ṣawari ni itara.

Iṣẹ atilẹba mi ni iru iṣayẹwo ko ni ifọkansi si Python. Lọ́pọ̀ ìgbà, èdè “ìbílẹ̀” kékeré ni mo lò Alore. Eyi ni apẹẹrẹ ti yoo jẹ ki o loye ohun ti a n sọrọ nipa (iru awọn asọye jẹ iyan nibi):

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

Lilo ede abinibi ti o rọrun jẹ ọna ti o wọpọ ti a lo ninu iwadii imọ-jinlẹ. Eyi jẹ bẹ, kii ṣe o kere ju nitori pe o fun ọ laaye lati ṣe awọn idanwo ni kiakia, ati nitori otitọ pe ohun ti ko ni nkankan lati ṣe pẹlu iwadi naa le ni irọrun bikita. Awọn ede siseto gidi-aye maa n jẹ awọn iyalẹnu iwọn-nla pẹlu awọn imuse idiju, ati pe eyi fa fifalẹ adanwo. Bibẹẹkọ, eyikeyi awọn abajade ti o da lori ede ti o rọrun dabi ifura diẹ, nitori ni gbigba awọn abajade wọnyi oniwadi le ti rubọ awọn ero pataki fun lilo iṣe ti awọn ede.

Oluyẹwo iru mi fun Alore dabi ẹni ti o ni ileri pupọ, ṣugbọn Mo fẹ lati ṣe idanwo rẹ nipa ṣiṣe idanwo pẹlu koodu gidi, eyiti, o le sọ, ko kọ ni Alore. Ni Oriire fun mi, ede Alore da lori awọn imọran kanna bi Python. O rọrun to lati ṣe oluṣayẹwo typechecker ki o le ṣiṣẹ pẹlu sintasi Python ati itumọ. Eyi gba wa laaye lati gbiyanju iru ṣayẹwo ni koodu orisun orisun ṣiṣi. Ni afikun, Mo kowe transpiler lati yi koodu ti a kọ si Alore pada si koodu Python ati lo lati tumọ koodu itẹwe mi. Bayi Mo ni iru eto ṣiṣe ayẹwo ti a kọ sinu Python ti o ṣe atilẹyin ipin kan ti Python, iru ede yẹn! (Awọn ipinnu ayaworan kan ti o ni oye fun Alore ko dara fun Python, ati pe eyi tun jẹ akiyesi ni awọn apakan ti codebase mypy.)

Ni otitọ, ede ti o ni atilẹyin nipasẹ eto iru mi ko le pe ni Python ni aaye yii: o jẹ iyatọ ti Python nitori diẹ ninu awọn idiwọn ti Python 3 iru annotation syntax.

O dabi adalu Java ati Python:

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

Ọkan ninu awọn imọran mi ni akoko yẹn ni lati lo iru awọn asọye lati mu ilọsiwaju ṣiṣẹ nipasẹ ṣiṣe akojọpọ iru Python si C, tabi boya JVM bytecode. Mo de ipele ti kikọ apẹrẹ alakojọ kan, ṣugbọn Mo kọ imọran yii silẹ, nitori pe iru ṣayẹwo funrararẹ dabi iwulo pupọ.

Mo pari lati ṣafihan iṣẹ akanṣe mi ni PyCon 2013 ni Santa Clara. Mo tun sọrọ nipa eyi pẹlu Guido van Rossum, olupaṣẹ Python alaanu fun igbesi aye. O da mi loju lati ju sintasi ti ara mi silẹ ati ki o duro pẹlu boṣewa Python 3 syntax. Python 3 ṣe atilẹyin awọn alaye iṣẹ, nitorinaa apẹẹrẹ mi le tun kọ bi a ṣe han ni isalẹ, ti o mu eto Python deede:

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

Mo ni lati ṣe diẹ ninu awọn adehun (akọkọ, Mo fẹ lati ṣe akiyesi pe Mo ṣẹda sintasi ti ara mi fun idi pataki yii). Ni pataki, Python 3.3, ẹya tuntun julọ ti ede ni akoko yẹn, ko ṣe atilẹyin awọn asọye oniyipada. Mo jiroro pẹlu Guido nipasẹ imeeli ọpọlọpọ awọn aye fun apẹrẹ syntactic ti iru awọn asọye. A pinnu lati lo iru awọn asọye fun awọn oniyipada. Eyi ṣiṣẹ fun idi ti a pinnu, ṣugbọn o jẹ wiwọ diẹ (Python 3.6 fun wa ni sintasi ti o dara julọ):

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

Tẹ awọn asọye tun wa ni ọwọ lati ṣe atilẹyin Python 2, eyiti ko ni atilẹyin ti a ṣe sinu fun awọn asọye iru:

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

O wa jade pe iwọnyi (ati awọn miiran) awọn iṣowo-owo ko ṣe pataki gaan - awọn anfani ti titẹ aimi tumọ si pe awọn olumulo laipẹ gbagbe nipa sintasi ti o kere ju-bojumu. Niwọn igba ti ko si awọn itumọ syntactic pataki ti a lo ni iru koodu Python ti a ṣayẹwo, awọn irinṣẹ Python ti o wa ati awọn ilana ṣiṣe koodu tẹsiwaju lati ṣiṣẹ ni deede, ṣiṣe ni irọrun pupọ fun awọn olupilẹṣẹ lati kọ ẹkọ ọpa tuntun naa.

Guido tun gba mi loju lati darapọ mọ Dropbox lẹhin ti Mo pari iwe-ẹkọ giga mi. Eyi ni ibi ti apakan ti o nifẹ julọ ti itan mypy bẹrẹ.

A tun ma a se ni ojo iwaju…

Eyin onkawe! Ti o ba lo Python, jọwọ sọ fun wa nipa iwọn awọn iṣẹ akanṣe ti o dagbasoke ni ede yii.

Ọna lati ṣe ayẹwo awọn laini miliọnu mẹrin ti koodu Python. Apa 4
Ọna lati ṣe ayẹwo awọn laini miliọnu mẹrin ti koodu Python. Apa 4

orisun: www.habr.com

Fi ọrọìwòye kun