Chemen pou tcheke 4 milyon liy kòd Python. Pati 1

Jodi a nou pote atansyon ou a premye pati nan tradiksyon an nan materyèl la sou fason Dropbox fè fas ak kontwòl kalite nan kòd Python.

Chemen pou tcheke 4 milyon liy kòd Python. Pati 1

Dropbox ekri anpil nan Python. Li se yon lang ke nou itilize trè lajman, tou de pou sèvis back-end ak aplikasyon pou kliyan Desktop. Nou itilize tou Go, TypeScript ak Rust anpil, men Python se lang prensipal nou an. Lè nou konsidere echèl nou an, epi n ap pale de dè milyon de liy kòd Python, li te tounen soti ke sezisman dinamik kòd sa a san nesesite konplike konpreyansyon li epi yo te kòmanse seryezman afekte pwodiktivite travay. Pou bese pwoblèm sa a, nou te kòmanse fè tranzisyon piti piti kòd nou an nan tcheke tip estatik lè l sèvi avèk mypy. Sa a se pwobableman sistèm nan tcheke kalite otonòm ki pi popilè pou Python. Mypy se yon pwojè sous louvri, devlopè prensipal li yo travay nan Dropbox.

Dropbox se te youn nan premye konpayi yo te aplike kalite estatik tcheke nan kòd Python nan echèl sa a. Mypy yo itilize nan dè milye de pwojè jou sa yo. Zouti sa a inonbrabl fwa, jan yo di, "teste nan batay." Nou te fè anpil wout pou rive kote nou ye kounye a. Sou wout la, te gen anpil antrepriz san siksè ak eksperyans echwe. Pòs sa a kouvri istwa tcheke kalite estatik nan Python, soti nan kòmansman wòch li yo kòm yon pati nan pwojè rechèch mwen an, jiska jounen jodi a, lè tcheke tip ak sijesyon kalite yo te vin komen pou devlopè inonbrabl ki ekri nan Python. Mekanis sa yo kounye a sipòte pa anpil zouti tankou IDE ak analizè kòd.

Li dezyèm pati a

Poukisa tcheke tip nesesè?

Si ou te janm itilize dinamik tape Python, ou ta ka gen kèk konfizyon sou poukisa te gen yon melodi konsa nan sezisman estatik ak mypy dènyèman. Oswa petèt ou renmen Python jisteman paske nan sezisman dinamik li yo, ak sa k ap pase tou senpleman fache ou. Kle a nan valè a nan sezisman estatik se echèl la nan solisyon yo: pi gwo pwojè ou a, plis ou panche nan sezisman estatik, ak nan fen a, plis ou reyèlman bezwen li.

Sipoze yon sèten pwojè te rive nan gwosè a nan dè dizèn de milye de liy, epi li te tounen soti ke pwogramasyon plizyè ap travay sou li. Gade nan yon pwojè menm jan an, ki baze sou eksperyans nou an, nou ka di ke konprann kòd li yo pral kle nan kenbe devlopè pwodiktif. San yo pa tip anotasyon, li ka difisil pou konnen, pou egzanp, ki agiman yo pase nan yon fonksyon, oswa ki kalite yon fonksyon ka retounen. Men kesyon tipik ki souvan difisil pou reponn san yo pa itilize tip annotations:

  • Èske fonksyon sa a ka retounen None?
  • Ki sa ki ta dwe agiman sa a? items?
  • Ki kalite atribi yo ye id: int se li, str, oswa petèt kèk kalite koutim?
  • Èske agiman sa a ta dwe yon lis? Èske li posib pou pase yon tuple pou li?

Si w gade ti bout kòd ki anons kalite sa a epi eseye reponn kesyon menm jan an, li sanble ke sa a se travay ki pi senp:

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

  • read_metadata pa retounen None, depi kalite a retounen se pa Optional[…].
  • Agiman items se yon sekans liy. Li pa ka repete owaza.
  • Atribi id se yon seri bytes.

Nan yon mond ideyal, yon moun ta espere ke tout sibtilite sa yo ta dekri nan dokiman an entegre (docstring). Men, eksperyans bay yon anpil nan egzanp lefèt ke dokiman sa yo souvan pa obsève nan kòd la ak ki ou gen nan travay. Menm si dokiman sa yo prezan nan kòd la, yon moun pa ka konte sou kòrèkteman absoli li yo. Dokiman sa a kapab vag, inexacte, ak louvri pou malantandi. Nan gwo ekip oswa gwo pwojè, pwoblèm sa a ka vin trè grav.

Pandan ke Python ekselan nan etap yo byen bonè oswa entèmedyè nan pwojè, nan kèk pwen pwojè siksè ak konpayi ki sèvi ak Python ka fè fas a kesyon an vital: "Èske nou ta dwe reekri tout bagay nan yon lang tape estatik?".

Sistèm tcheke tip tankou mypy rezoud pwoblèm ki anwo a lè yo bay pwomotè a yon langaj fòmèl pou dekri kalite yo, epi lè yo tcheke deklarasyon kalite yo matche ak aplikasyon pwogram lan (e, opsyonèlman, lè yo tcheke egzistans yo). An jeneral, nou ka di ke sistèm sa yo mete a dispozisyon nou yon bagay tankou ak anpil atansyon tcheke dokiman.

Itilize nan sistèm sa yo gen lòt avantaj, epi yo deja konplètman ki pa trivial:

  • Sistèm tcheke kalite a ka detekte kèk ti (epi pa tèlman piti) erè. Yon egzanp tipik se lè yo bliye trete yon valè None oswa kèk lòt kondisyon espesyal.
  • Refactoring Kòd anpil senplifye paske sistèm tcheke kalite a souvan trè egzat sou ki kòd ki bezwen chanje. An menm tan an, nou pa bezwen espere pou 100% pwoteksyon kòd ak tès, ki, nan nenpòt ka, anjeneral pa posib. Nou pa bezwen fouye nan pwofondè nan tras la chemine pou chèche konnen kòz pwoblèm nan.
  • Menm sou gwo pwojè, mypy ka souvan fè tcheke kalite konplè nan yon fraksyon nan yon segonn. Ak ekzekisyon tès yo anjeneral pran dè dizèn de segonn oswa menm minit. Sistèm tcheke tip bay pwogramè a enstantane fidbak epi li pèmèt li fè travay li pi vit. Li pa bezwen ekri frajil ak difisil pou kenbe tès inite ki ranplase antite reyèl ak mok ak plak jis pou jwenn rezilta tès kòd pi vit.

IDE ak editè tankou PyCharm oswa Visual Studio Code sèvi ak pouvwa anotasyon kalite pou bay devlopè yo ranpli kòd, mete aksan sou erè, ak sipò pou konstriksyon lang yo souvan itilize. Ak sa yo se jis kèk nan benefis ki genyen nan sezisman. Pou kèk pwogramè, tout bagay sa a se agiman prensipal la an favè sezisman. Sa a se yon bagay ki benefisye imedyatman apre aplikasyon an. Ka itilizasyon sa a pou kalite yo pa mande pou yon sistèm tcheke tip separe tankou mypy, byenke li ta dwe remake ke mypy ede kenbe annotations tip ki konsistan avèk kòd.

Jan nou koumanse nan mypy

Istwa mypy te kòmanse nan UK a, nan Cambridge, kèk ane anvan mwen te rantre nan Dropbox. Mwen te patisipe, nan kad rechèch doktora mwen, nan inifikasyon lang ki tape estatik ak lang dinamik. Mwen te enspire pa yon atik sou sezisman incrémentielle pa Jeremy Siek ak Walid Taha, ak pa pwojè rakèt la. Mwen te eseye jwenn fason yo sèvi ak menm langaj pwogramasyon an pou plizyè pwojè - soti nan ti scripts nan baz kòd ki fòme ak plizyè milyon liy. An menm tan an, mwen te vle asire ke nan yon pwojè nan nenpòt echèl, yon moun pa ta dwe fè konpwomi twò gwo. Yon pati enpòtan nan tout bagay sa a se te lide pou yo te deplase piti piti soti nan yon pwojè pwototip ki pa tape nan yon pwodwi fini ki te teste konplè. Jou sa yo, ide sa yo lajman pran pou yo akòde, men an 2010 se te yon pwoblèm ki te toujou ap aktivman eksplore.

Travay orijinal mwen an nan tcheke tip pa te vize a Python. Olye de sa, mwen te itilize yon ti lang "endijèn". Alore. Men yon egzanp ki pral pèmèt ou konprann de sa n ap pale (anòtasyon kalite yo opsyonèl isit la):

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

Sèvi ak yon lang natif natal senplifye se yon apwòch komen yo itilize nan rechèch syantifik. Sa a se konsa, pa pi piti paske li pèmèt ou byen vit fè eksperyans, epi tou akòz lefèt ke sa ki pa gen anyen fè ak rechèch ka fasil inyore. Lang programmasyon nan mond reyèl la yo gen tandans fè gwo echèl fenomèn ak aplikasyon konplèks, e sa ralanti eksperimantasyon. Sepandan, nenpòt rezilta ki baze sou yon lang senplifye sanble yon ti kras sispèk, paske nan jwenn rezilta sa yo chèchè a te ka sakrifye konsiderasyon enpòtan pou itilizasyon pratik lang yo.

Checker kalite mwen an pou Alore te sanble trè pwomèt, men mwen te vle teste li pa fè eksperyans ak kòd reyèl, ki, ou ta ka di, pa te ekri nan Alore. Chans pou mwen, lang Alore te lajman baze sou menm lide ak Python. Li te fasil ase pou chanje typechecker la pou li te kapab travay ak sentaks ak semantik Python. Sa a te pèmèt nou eseye tip tcheke nan sous louvri kòd Python. Anplis de sa, mwen te ekri yon transpiler pou konvèti kòd ki ekri nan Alore nan kòd Python epi mwen itilize li pou tradui kòd typechecker mwen an. Koulye a, mwen te gen yon sistèm tcheke tip ekri nan Python ki sipòte yon sous-ensemble nan Python, yon kalite lang sa a! (Sèten desizyon achitekti ki te fè sans pou Alore yo te mal adapte pou Python, e sa toujou aparan nan pati nan kod mypy la.)

An reyalite, langaj ki sipòte pa sistèm tip mwen an pa t 'kapab byen rele Python nan pwen sa a: li te yon varyant nan Python akòz kèk limit nan sentaks annotasyon kalite Python 3.

Li te sanble ak yon melanj de Java ak Python:

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

Youn nan lide mwen yo nan moman sa a se te sèvi ak tip annotations amelyore pèfòmans pa konpile sa a kalite Python nan C, oswa petèt JVM bytecode. Mwen te rive nan etap la nan ekri yon pwototip du, men mwen abandone lide sa a, depi tip tcheke tèt li gade byen itil.

Mwen te fini prezante pwojè mwen an nan PyCon 2013 nan Santa Clara. Mwen te pale sou sa tou ak Guido van Rossum, diktatè Python pou lavi a. Li konvenk mwen pou m lage pwòp sentaks mwen epi rete sou sentaks estanda Python 3. Python 3 sipòte annotasyon fonksyon, kidonk egzanp mwen an ka reekri jan yo montre anba a, sa ki lakòz yon pwogram Python nòmal:

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

Mwen te oblije fè kèk konpwomi (premye tout bagay, mwen vle sonje ke mwen te envante pwòp sentaks mwen pou rezon sa a). An patikilye, Python 3.3, vèsyon ki pi resan lang nan epòk la, pa t sipòte anotasyon varyab. Mwen te diskite ak Guido pa imèl divès posiblite pou konsepsyon sentaktik nan anotasyon sa yo. Nou deside sèvi ak kalite kòmantè pou varyab yo. Sa a te sèvi objektif entansyon an, men li te yon ti jan ankonbran (Python 3.6 te ban nou yon sentaks pi bèl):

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

Kòmantè kalite yo te vin an pratik tou pou sipòte Python 2, ki pa gen sipò entegre pou anotasyon kalite:

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

Li te tounen soti ke sa yo (ak lòt) komès-konpwomi pa t reyèlman gen pwoblèm - benefis ki genyen nan sezisman estatik vle di ke itilizatè yo byento bliye sou mwens-pase-pafè sentaks. Piske pa gen okenn konstriksyon sentaktik espesyal yo te itilize nan kòd Python ki tcheke tip, zouti Python ki deja egziste ak pwosesis pwosesis kòd kontinye travay nòmalman, sa ki fè li pi fasil pou devlopè yo aprann nouvo zouti a.

Guido te konvenk mwen tou pou m rantre nan Dropbox apre m te fin fè tèz gradye mwen an. Sa a se kote pati ki pi enteresan nan istwa mypy la kòmanse.

A kontinye…

Chè lektè! Si w itilize Python, tanpri fè nou konnen echèl pwojè w ap devlope nan lang sa a.

Chemen pou tcheke 4 milyon liy kòd Python. Pati 1
Chemen pou tcheke 4 milyon liy kòd Python. Pati 1

Sous: www.habr.com

Add nouvo kòmantè