Txoj kev mus rau ntaus ntawv 4 lab kab ntawm Python code. Ntu 2

Niaj hnub no peb tab tom tshaj tawm qhov thib ob ntawm kev txhais cov ntaub ntawv hais txog yuav ua li cas Dropbox txhim kho hom tswj rau ntau lab kab ntawm Python code.

Txoj kev mus rau ntaus ntawv 4 lab kab ntawm Python code. Ntu 2

β†’ Nyeem ib feem

Hom kev txhawb nqa (PEP 484)

Peb tau ua peb thawj qhov kev sim loj nrog mypy ntawm Dropbox thaum lub sij hawm Hack Lub Limtiam 2014. Hack Lub Limtiam yog ib lub limtiam kev tshwm sim los ntawm Dropbox. Lub sijhawm no, cov neeg ua haujlwm tuaj yeem ua haujlwm ntawm qhov lawv xav tau! Qee qhov Dropbox cov haujlwm nto moo tshaj plaws tau pib ntawm cov xwm txheej zoo li no. Raws li qhov tshwm sim ntawm qhov kev sim no, peb tau xaus lus tias mypy zoo li pheej hmoo, txawm tias qhov project tseem tsis tau npaj rau kev siv dav.

Thaum lub sij hawm, lub tswv yim ntawm standardizing Python hom hinting systems nyob rau hauv cov huab cua. Raws li kuv tau hais, txij li Python 3.0 nws tuaj yeem siv hom annotations rau kev ua haujlwm, tab sis cov no tsuas yog cov lus hais tsis raug cai, tsis muaj cov lus piav qhia thiab cov ntsiab lus. Thaum lub sijhawm ua tiav cov haujlwm, cov lus piav qhia no, feem ntau, tsuas yog tsis quav ntsej. Tom qab Hack Lub Limtiam, peb pib ua haujlwm ntawm tus qauv kev hais lus. Txoj hauj lwm no tau coj mus rau qhov tshwm sim SIB 484 (Guido van Rossum, Łukasz Langa thiab kuv tau koom tes hauv daim ntawv no).

Peb lub hom phiaj tuaj yeem pom los ntawm ob sab. Ua ntej, peb cia siab tias tag nrho Python ecosystem tuaj yeem siv txoj hauv kev los siv hom lus qhia (ib lo lus siv hauv Python raws li qhov sib npaug ntawm "hom annotations"). Qhov no, muab cov kev pheej hmoo uas yuav tshwm sim, yuav zoo dua li siv ntau txoj hauv kev tsis sib haum xeeb. Qhov thib ob, peb xav qhib sib tham txog hom annotation mechanisms nrog ntau tus tswv cuab ntawm Python zej zog. Qhov kev ntshaw no yog ib feem los ntawm qhov tseeb tias peb yuav tsis xav zoo li "kev tso siab rau" los ntawm cov tswv yim tseem ceeb ntawm cov lus nyob rau hauv lub qhov muag ntawm cov dav dav ntawm Python programmers. Nws yog ib hom lus dynamically typed, hu ua "duck typing". Nyob rau hauv lub zej zog, thaum pib, ib tug me ntsis txawv txawv cwj pwm ntawm lub tswv yim ntawm static typing yuav pab tsis tau tab sis tshwm sim. Tab sis qhov kev xav ntawd nws thiaj li ploj mus tom qab nws tau pom tseeb tias kev ntaus ntawv zoo li qub tsis yog yuav tsum tau ua (thiab tom qab tib neeg pom tau tias nws muaj txiaj ntsig tiag tiag).

Hom hint syntax uas thaum kawg tau txais yuav zoo ib yam li qhov mypy txhawb nqa thaum lub sijhawm. PEP 484 tau tso tawm nrog Python 3.5 hauv 2015. Python tsis yog hom lus dynamically typed lawm. Kuv nyiam xav txog qhov xwm txheej no yog qhov tseem ceeb hauv keeb kwm Python.

Pib ntawm kev tsiv teb tsaws chaw

Thaum kawg ntawm 2015, Dropbox tsim ib pab neeg ntawm peb tus neeg ua haujlwm ntawm mypy. Lawv suav nrog Guido van Rossum, Greg Nqe thiab David Fisher. Txij thaum ntawd los, qhov xwm txheej tau pib loj hlob sai heev. Thawj qhov teeb meem rau mypy txoj kev loj hlob yog kev ua tau zoo. Raws li kuv hinted saum toj no, nyob rau hauv thaum ntxov hnub ntawm qhov project kuv xav txog kev txhais cov mypy siv rau hauv C, tab sis lub tswv yim no tau hla tawm ntawm daim ntawv tam sim no. Peb tau nyam nrog kev khiav lub kaw lus siv tus neeg txhais lus CPython, uas tsis nrawm txaus rau cov cuab yeej zoo li mypy. (Qhov project PyPy, lwm qhov kev siv Python nrog JIT compiler, tsis pab peb ib yam.)

Hmoov zoo, qee qhov kev txhim kho algorithmic tau los pab peb ntawm no. Thawj lub zog "accelerator" yog qhov kev siv ntawm kev kuaj xyuas ntxiv. Lub tswv yim tom qab qhov kev txhim kho no yog qhov yooj yim: yog tias tag nrho cov qauv kev vam khom tsis tau hloov pauv txij li qhov kev ua haujlwm dhau los ntawm mypy, ces peb tuaj yeem siv cov ntaub ntawv cached thaum lub sijhawm ua haujlwm dhau los thaum ua haujlwm nrog kev vam meej. Peb tsuas yog yuav tsum tau ua hom tshuaj xyuas ntawm cov ntaub ntawv hloov kho thiab ntawm cov ntaub ntawv uas nyob ntawm lawv. Mypy txawm mus me ntsis ntxiv: yog hais tias tus sab nraud interface ntawm ib module tsis hloov, mypy xav tias lwm cov modules uas imported no module tsis tas yuav tsum tau kuaj dua.

Incremental checking tau pab peb ntau heev thaum annotating loj npaum li cas ntawm cov code uas twb muaj lawm. Lub ntsiab lus yog tias cov txheej txheem no feem ntau suav nrog ntau qhov rov ua haujlwm ntawm mypy raws li cov lus piav qhia tau maj mam ntxiv rau cov cai thiab maj mam txhim kho. Thawj qhov kev khiav ntawm mypy tseem qeeb heev vim tias nws muaj ntau qhov kev cia siab los xyuas. Tom qab ntawd, txhawm rau txhim kho qhov xwm txheej, peb tau siv lub tshuab caching tej thaj chaw deb. Yog tias mypy pom tias cov cache hauv zos yuav tsis dhau hnub, nws rub tawm cov cache tam sim no rau tag nrho cov codebase los ntawm lub hauv paus chaw cia khoom. Tom qab ntawd nws ua ib qho kev ntsuam xyuas ntxiv siv qhov snapshot no. Qhov no tau coj peb ib kauj ruam loj ntxiv rau kev ua haujlwm ntawm mypy.

Qhov no yog lub sij hawm ntawm kev txais yuav sai thiab ntuj tsim ntawm hom tshuaj xyuas ntawm Dropbox. Thaum kawg ntawm 2016, peb twb muaj kwv yees li 420000 kab ntawm Python code nrog hom annotations. Ntau tus neeg siv tau zoo siab txog hom kev kuaj xyuas. Ntau thiab ntau pab pawg txhim kho tau siv Dropbox mypy.

Txhua yam zoo li thaum ntawd, tab sis peb tseem muaj ntau yam ua. Peb tau pib ua cov kev tshawb fawb hauv cov neeg siv ib ntus txhawm rau txheeb xyuas qhov teeb meem ntawm qhov project thiab nkag siab txog cov teeb meem dab tsi yuav tsum tau daws ua ntej (qhov kev coj ua no tseem siv hauv lub tuam txhab niaj hnub no). Qhov tseem ceeb tshaj plaws, raws li nws tau pom meej, yog ob txoj haujlwm. Ua ntej, peb xav tau ntau hom kev pab them nqi ntawm tus lej, thib ob, peb xav tau mypy ua haujlwm sai dua. Nws yog qhov tseeb tiag tias peb txoj haujlwm txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau txhawm rau mypy Peb, paub meej txog qhov tseem ceeb ntawm ob txoj haujlwm no, teeb tsa kev daws teeb meem.

Ntau productivity!

Incremental checks ua mypy sai, tab sis cov cuab yeej tseem tsis tau ceev txaus. Ntau qhov kev kuaj ntxiv tau siv sijhawm li ib feeb. Yog vim li cas rau qhov no yog cyclical imports. Qhov no tej zaum yuav tsis surprise leej twg uas tau ua hauj lwm nrog loj codebases sau nyob rau hauv Python. Peb muaj ntau pua ntawm cov modules, txhua tus uas tsis ncaj qha imported tag nrho lwm tus. Yog hais tias tej ntaub ntawv nyob rau hauv ib lub voj ntshuam raug hloov, mypy yuav tsum tau ua tag nrho cov ntaub ntawv nyob rau hauv lub voj, thiab feem ntau cov modules uas imported modules los ntawm lub voj. Ib lub voj voog zoo li no yog qhov tsis zoo "kev vam khom tangle" uas ua rau muaj teeb meem ntau ntawm Dropbox. Thaum cov qauv no muaj ntau pua modules, thaum nws raug xa tawm, ncaj qha lossis tsis ncaj, ntau qhov kev sim, nws kuj tau siv hauv cov cai ntau lawm.

Peb xav txog qhov muaj peev xwm ntawm "untangling" ncig kev vam meej, tab sis peb tsis muaj peev txheej los ua nws. Muaj ntau tus lej uas peb tsis paub. Yog li ntawd, peb tuaj nrog lwm txoj hauv kev. Peb txiav txim siab ua kom mypy ua hauj lwm sai heev txawm nyob rau hauv lub xub ntiag ntawm "dependency tangles". Peb ua tiav lub hom phiaj no siv mypy daemon. Lub daemon yog cov txheej txheem server uas siv ob qho kev nthuav dav. Ua ntej, nws khaws cov ntaub ntawv hais txog tag nrho cov codebase hauv nco. Qhov no txhais tau tias txhua zaus koj khiav mypy, koj tsis tas yuav thauj cov ntaub ntawv cached ntsig txog ntau txhiab tus neeg tuaj txawv teb chaws. Qhov thib ob, nws ua tib zoo, nyob rau theem ntawm cov qauv me me, txheeb xyuas qhov kev vam meej ntawm cov haujlwm thiab lwm qhov chaw. Piv txwv li, yog tias muaj nuj nqi foo hu ua function bar, ces muaj dependence foo los ntawm bar. Thaum cov ntaub ntawv hloov pauv, tus daemon ua ntej, nyob rau hauv kev rho tawm, tsuas yog cov ntaub ntawv hloov pauv. Nws mam li saib cov kev hloov pauv pom sab nraud rau cov ntaub ntawv ntawd, xws li hloov pauv kev kos npe. Lub daemon siv cov ncauj lus kom ntxaws txog kev ntshuam tsuas yog ob zaug tshuaj xyuas cov haujlwm uas tau siv qhov hloov pauv ua haujlwm. Feem ntau, nrog rau txoj hauv kev no, koj yuav tsum kuaj xyuas qee yam haujlwm.

Kev ua txhua yam no tsis yooj yim, txij li qhov kev siv mypy thawj zaug tau tsom mus rau kev ua tiav ib cov ntaub ntawv ib zaug. Peb yuav tsum tau cuam tshuam nrog ntau qhov xwm txheej ciam teb, qhov tshwm sim uas yuav tsum tau rov kuaj xyuas dua nyob rau hauv rooj plaub uas qee yam hloov pauv hauv cov cai. Piv txwv li, qhov no tshwm sim thaum ib chav kawm raug muab rau chav kawm tshiab. Thaum peb tau ua qhov peb xav tau, peb muaj peev xwm txo tau lub sijhawm ua tiav ntawm feem ntau incremental checks rau ob peb feeb xwb. Qhov no zoo li yog ib qho kev yeej loj rau peb.

Txawm ntau productivity!

Ua ke nrog cov chaw taws teeb caching uas kuv tau tham saum toj no, mypy daemon yuav luag tag nrho cov teeb meem uas tshwm sim thaum tus programmer nquag sau hom kev kuaj xyuas, hloov pauv rau cov ntaub ntawv me me. Txawm li cas los xij, qhov kev ua tau zoo hauv qhov kev siv tsawg tshaj plaws yog tseem nyob deb ntawm qhov zoo. Kev pib huv ntawm mypy tuaj yeem siv sijhawm li 15 feeb. Thiab qhov no yog ntau tshaj li peb yuav tau zoo siab nrog. Txhua lub limtiam qhov xwm txheej tau dhau los ua qhov phem dua li cov programmers txuas ntxiv sau cov lej tshiab thiab ntxiv cov lus piav qhia rau cov lej uas twb muaj lawm. Peb cov neeg siv tseem tshaib plab rau kev ua tau zoo dua, tab sis peb zoo siab tau ntsib lawv ib nrab.

Peb txiav txim siab rov qab mus rau ib qho ntawm cov tswv yim ua ntej txog mypy. Namely, hloov Python code rau hauv C code. Kev sim nrog Cython (ib lub kaw lus uas tso cai rau koj los txhais cov lej sau hauv Python rau hauv C code) tsis tau muab rau peb pom kev nrawm, yog li peb txiav txim siab rov kho lub tswv yim ntawm kev sau peb tus kheej compiler. Txij li thaum lub Mypy CodeBase (sau nyob rau hauv sej) twb muaj tag nrho cov ntawv xov xwm hom tsim nyog, peb xav tias nws yuav tsim nyog los sim siv cov ntawv xov xwm no kom ceev cov system. Kuv sai sai tsim ib tug qauv los sim lub tswv yim no. Nws tau pom ntau dua 10-fold nce hauv kev ua tau zoo ntawm ntau yam micro-benchmarks. Peb lub tswv yim yog los sau cov Python modules rau C modules siv Cython, thiab tig hom annotations rau hauv lub sij hawm khiav hom checks (feem ntau hom annotations tsis quav ntsej thaum khiav-lub sij hawm thiab tsuas yog siv los ntawm hom tshuaj xyuas systems). Peb yeej tau npaj los txhais cov kev siv mypy los ntawm Python rau hauv ib hom lus uas tau tsim los ua statically ntaus ntawv, uas yuav saib (thiab, feem ntau, ua haujlwm) raws nraim li Python. (Qhov kev sib txawv ntawm hom lus no tau dhau los ua ib qho kev lig kev cai ntawm qhov project mypy. Thawj qhov kev siv mypy tau sau rau hauv Alore, tom qab ntawd muaj cov syntactic hybrid ntawm Java thiab Python).

Kev tsom mus rau CPython txuas ntxiv API yog qhov tseem ceeb kom tsis txhob poob qhov kev tswj hwm qhov project. Peb tsis tas yuav siv lub tshuab virtual lossis ib lub tsev qiv ntawv uas mypy xav tau. Tsis tas li ntawd, peb tseem yuav tau nkag mus rau tag nrho Python ecosystem thiab tag nrho cov cuab yeej (xws li pytest). Qhov no txhais tau hais tias peb tuaj yeem txuas ntxiv siv tus lej Python thaum lub sijhawm txhim kho, tso cai rau peb txuas ntxiv ua haujlwm nrog cov qauv nrawm heev ntawm kev hloov cov lej thiab sim nws, tsis yog tos rau cov lej sau. Zoo li peb tab tom ua haujlwm zoo los zaum ntawm ob lub rooj zaum, hais lus, thiab peb nyiam.

Lub compiler, uas peb hu ua mypyc (vim nws siv mypy ua ntej-kawg rau kev txheeb xyuas hom), tau los ua ib txoj haujlwm zoo heev. Zuag qhia tag nrho, peb ua tiav kwv yees li 4x speedup rau nquag mypy khiav tsis muaj caching. Tsim cov tub ntxhais ntawm qhov project mypyc coj ib pab pawg me ntawm Michael Sullivan, Ivan Levkivsky, Hugh Hahn, thiab kuv tus kheej txog 4 lub hlis. Cov haujlwm no tsawg dua li qhov xav tau los sau mypy, piv txwv li, hauv C ++ lossis Go. Thiab peb yuav tsum tau hloov pauv tsawg dua rau qhov project dua li peb yuav tsum tau ua thaum rov sau dua ua lwm hom lus. Peb kuj cia siab tias peb tuaj yeem nqa mypyc mus rau theem uas lwm tus Dropbox programmers tuaj yeem siv nws los sau thiab ua kom lawv cov lej nrawm.

Yuav kom ua tiav qib ntawm kev ua tau zoo, peb yuav tsum tau siv qee qhov kev daws teeb meem zoo tshaj plaws. Yog li, lub compiler tuaj yeem ua kom ntau yam haujlwm los ntawm kev siv ceev ceev, qis-qib C tsim, piv txwv li, ib qho kev hu ua compiled tau muab txhais ua C muaj nuj nqi hu. Thiab xws li kev hu xov tooj sai dua li hu rau kev txhais lus. Qee qhov haujlwm, xws li kev tshawb nrhiav phau ntawv txhais lus, tseem koom nrog kev siv C-API hu los ntawm CPython, uas tsuas yog nrawm dua thaum muab tso ua ke. Peb muaj peev xwm tshem tawm cov load ntxiv ntawm lub kaw lus tsim los ntawm kev txhais lus, tab sis qhov no tsuas yog ib qho kev nce me me ntawm kev ua tau zoo.

Txhawm rau txheeb xyuas cov haujlwm "slow" feem ntau, peb tau ua cov lej profile. Armed nrog cov ntaub ntawv no, peb sim tweak mypyc kom nws yuav tsim kom sai C code rau cov kev khiav hauj lwm zoo li no, los yog rewrite tus coj Python code siv kev khiav hauj lwm sai (thiab tej zaum peb tsuas tsis muaj ib tug yooj yim txaus daws rau qhov ntawd los yog lwm yam teeb meem). . Rewriting Python code feem ntau yog ib qho kev daws teeb meem yooj yim dua li muaj cov compiler tau ua tib yam kev hloov pauv. Nyob rau hauv lub sij hawm ntev, peb xav automate ntau ntawm cov kev hloov pauv no, tab sis thaum lub sij hawm peb tau tsom mus rau kev ceev mypy nrog kev siv zog tsawg. Thiab nyob rau hauv kev mus rau lub hom phiaj no, peb txiav ob peb fab.

Kom txuas ntxiv…

Nyob zoo nyeem! Dab tsi yog koj qhov kev xav ntawm qhov project mypy thaum koj kawm txog nws lub neej?

Txoj kev mus rau ntaus ntawv 4 lab kab ntawm Python code. Ntu 2
Txoj kev mus rau ntaus ntawv 4 lab kab ntawm Python code. Ntu 2

Tau qhov twg los: www.hab.com

Ntxiv ib saib