De Wee fir 4 Millioune Linnen Python Code ze tippen. Deel 3

Mir presentéieren Iech den drëtten Deel vun der Iwwersetzung vum Material iwwer de Wee deen Dropbox geholl huet wann Dir en Typprüfungssystem fir Python Code implementéiert.

De Wee fir 4 Millioune Linnen Python Code ze tippen. Deel 3

→ Virdrun Deeler: éischt и déi zweet

Erreechen 4 Millioune Zeilen vun getippten Code

Eng aner grouss Erausfuerderung (an déi zweet heefegst Suerg ënner deenen intern befrote) war d'Erhéijung vun der Quantitéit vum Code ofgedeckt duerch Typchecken an Dropbox. Mir hu verschidde Approche probéiert fir dëse Problem ze léisen, vun der natierlecher Erhéijung vun der Gréisst vun der getippten Codebase bis zum Fokus vum Mypy Team seng Efforten op statesch an dynamesch automatiséiert Typinferenz. Zum Schluss huet et geschéngt wéi wann et keng einfach Gewënnstrategie wier, awer mir konnten e schnelle Wuesstum am Volume vum annotéierte Code erreechen andeems Dir vill Approche kombinéiert.

Als Resultat huet eise gréisste Python Repository (mat Backend Code) bal 4 Millioune Linnen annotéiert Code. D'Aarbechte fir statesch Code Tippen goufen an ongeféier dräi Joer ofgeschloss. Mypy ënnerstëtzt elo verschidden Aarte vu Codedeckungsberichter, déi et méi einfach maachen d'Tippfortschrëtter ze iwwerwaachen. Besonnesch kënne mir Berichter iwwer Code generéieren mat Ambiguititéiten an Typen, wéi zum Beispill explizit Notzung vun engem Typ Any an Annotatiounen déi net verifizéiert kënne ginn, oder mat Saachen wéi Drëtt-Parteibibliothéiken importéieren déi keng Typ Annotatiounen hunn. Als Deel vun engem Projet fir d'Genauegkeet vun der Typprüfung an Dropbox ze verbesseren, hu mir bäigedroen fir d'Typdefinitioune (sougenannte Stubbdateien) fir e puer populär Open Source Bibliothéiken an engem zentraliséierte Python Repository ze verbesseren typesch.

Mir hunn nei Features vum Typsystem implementéiert (a standardiséiert an de spéideren PEPs) déi méi präzis Aarte fir e puer spezifesch Python Muster erlaben. E bemierkenswäert Beispill vun dësem ass TypeDict, déi Zorte fir JSON-ähnlech Dictionnairen ubitt, déi e fixe Set vu Stringschlësselen hunn, jidderee mat engem Wäert vu sengem eegenen Typ. Mir wäerte weider den Typ System ausbaue. Eise nächste Schrëtt wäert méiglecherweis d'Ënnerstëtzung fir Python seng numeresch Fäegkeeten verbesseren.

De Wee fir 4 Millioune Linnen Python Code ze tippen. Deel 3
Zuel vun Zeilen vun annotéiert Code: Server

De Wee fir 4 Millioune Linnen Python Code ze tippen. Deel 3
Zuel vun Zeilen vun annotéiert Code: Client

De Wee fir 4 Millioune Linnen Python Code ze tippen. Deel 3
Total Zuel vun Zeilen vun annotéiert Code

Hei ass en Iwwerbléck iwwer d'Haaptmerkmale vun de Saachen déi mir gemaach hunn fir d'Quantitéit vum annotéierte Code an Dropbox ze erhéijen:

Annotatioun streng. Mir hunn d'Ufuerderunge lues a lues erhéicht fir d'Strengheet fir neie Code annotéieren. Mir hunn ugefaang mat Linter Tipps déi virgeschloen hunn Annotatiounen un Dateien ze addéieren déi schonn e puer Annotatiounen haten. Mir erfuerderen elo Typ Annotatiounen an neie Python Dateien an an de meescht existente Dateien.

Schreift Berichter. Mir schécken Teams wöchentlech Berichter iwwer den Niveau vum Typ an hirem Code a ginn Rotschléi iwwer wat als éischt annotéiert soll ginn.

Populariséierung vun mypy. Mir schwätzen iwwer Mypy bei Eventer a schwätze mat Teams fir hinnen ze hëllefen mat Typannotatiounen unzefänken.

Ëmfroen. Mir maachen periodesch Benotzer Ëmfroe fir grouss Problemer z'identifizéieren. Mir si prett fir zimmlech wäit ze goen fir dës Probleemer ze léisen (souguer eng nei Sprooch erstellen fir Mypy ze beschleunegen!).

Leeschtung. Mir hunn d'Leeschtung vu mypy staark verbessert andeems mir den Daemon a mypyc benotzen. Dëst gouf gemaach fir d'Onbequemlechkeeten, déi während dem Annotatiounsprozess entstinn, ze glatteren, a fir mat grousse Quantitéite vu Code ze schaffen.

Integratioun mat Redaktoren. Mir hunn Tools gebaut fir mypy an Redaktoren ze ënnerstëtzen déi populär op Dropbox sinn. Dëst beinhalt PyCharm, Vim a VS Code. Dëst huet de Prozess vun der Annotatioun vum Code staark vereinfacht a seng Funktionalitéit ze kontrolléieren. Dës Aarte vun Aktiounen sinn heefeg wann Dir existente Code annotéiert.

Statesch Analyse. Mir hunn en Tool erstallt fir Funktiounssignaturen mat statesch Analyse Tools ofzeschléissen. Dëst Tool kann nëmmen a relativ einfache Situatiounen funktionnéieren, awer et huet eis gehollef eis Code Typ Ofdeckung ouni vill Effort ze erhéijen.

Ënnerstëtzung fir Drëtt Partei Bibliothéiken. Vill vun eise Projete benotzen den SQLAlchemy Toolkit. Et profitéiert vun den dynamesche Fäegkeeten vum Python datt PEP 484 Typen net fäeg sinn direkt ze modelléieren. Mir hunn am Aklang mam PEP 561 déi entspriechend Stubbdatei erstallt an e Plugin fir mypy (oppe Quell), wat SQLAlchemy Ënnerstëtzung verbessert.

Schwieregkeeten hu mir begéint

De Wee op 4 Millioune Zeilen vun getippten Code war net ëmmer einfach fir eis. Op dësem Wee hu mir vill Potholes begéint an e puer Feeler gemaach. Dëst sinn e puer vun de Problemer déi mir begéint hunn. Mir hoffen, datt iwwer hinnen erzielen wäert anerer hëllefen ähnlech Problemer vermeiden.

Vermësst Fichieren. Mir hunn eis Aarbecht ugefaang andeems mir nëmmen eng kleng Quantitéit vu Fichieren iwwerpréift hunn. Alles wat net an dësen Dateien abegraff ass gouf net kontrolléiert. Dateien goufen op d'Scannenlëscht bäigefüügt wann déi éischt Annotatiounen an hinnen opgetaucht sinn. Wann eppes aus engem Modul importéiert gouf ausserhalb vum Ëmfang vun der Verifizéierung, da schwätze mir iwwer d'Aarbecht mat Wäerter wéi Any, déi guer net getest goufen. Dëst huet zu engem bedeitende Verloscht vun der Tippgenauegkeet gefouert, besonnesch an de fréie Stadien vun der Migratioun. Dës Approche huet bis elo iwwerraschend gutt geschafft, obwuel eng typesch Situatioun ass datt Dateien an den Ëmfang vun der Iwwerpréiwung bäidroen Problemer an aneren Deeler vun der Codebase. Am schlëmmste Fall, wann zwee isoléiert Codeberäicher fusionéiert goufen, an deenen, onofhängeg vuneneen, Typen scho gepréift goufen, huet sech erausgestallt datt d'Zorte vun dëse Beräicher matenee inkompatibel waren. Dëst huet dozou gefouert datt vill Ännerungen an den Annotatiounen gemaach goufen. Wann Dir elo zréckkuckt, mierken mir datt mir Kärbibliothéiksmoduler méi fréi an d'Mypy's Typprüfungsberäich bäigefüügt hunn. Dëst géif eis Aarbecht vill méi prévisibel maachen.

Annotéieren ale Code. Wéi mir ugefaang hunn, hu mir ongeféier 4 Millioune Linnen vum existente Python Code. Et war kloer datt all dëse Code annotéieren net eng einfach Aufgab war. Mir hunn en Tool mam Numm PyAnnotate erstallt deen Typinformatioun sammele kann wéi Tester lafen a kënnen Typannotatiounen op Äre Code addéieren op Basis vun der gesammelt Informatioun. Wéi och ëmmer, mir hu keng besonnesch verbreet Adoptioun vun dësem Tool gemierkt. D'Informatiounstyp sammelen war lues, an automatesch generéiert Annotatiounen erfuerdert dacks vill manuell Ännerungen. Mir hu geduecht iwwer dëst Tool automatesch ze lafen all Kéier wann mir de Code iwwerpréiwen, oder d'Typinformatioun sammelen baséiert op der Analyse vun e puer klenge Volumen vun aktuellen Netzwierkfuerderunge, awer hunn decidéiert net ze maachen well entweder Approche ze riskant war.

Als Resultat kann et feststellen datt de gréissten Deel vum Code manuell vu senge Besëtzer annotéiert gouf. Fir dëse Prozess an déi richteg Richtung ze guidéieren, preparéiere mir Berichter iwwer besonnesch wichteg Moduler a Funktiounen, déi annotéiert musse ginn. Zum Beispill ass et wichteg Typ Annotatiounen fir e Bibliothéiksmodul ze bidden deen op Honnerte vu Plazen benotzt gëtt. Awer en alen Service deen duerch en neien ersat gëtt ass net méi sou wichteg ze kommentéieren. Mir experimentéieren och mat statesch Analyse ze benotzen fir Typ Annotatiounen fir Legacy Code ze generéieren.

Cyclesch Importer. Uewendriwwer hunn ech iwwer zyklesch Importer geschwat (déi "Ofhängegkeetsstécker"), d'Existenz vun deenen et schwéier gemaach huet mypy ze beschleunegen. Mir hunn och haart misse schaffen fir datt mypy all Zorte vu Idiomen ënnerstëtzt, déi duerch dës zyklesch Importer verursaacht ginn. Mir hunn viru kuerzem e gréissere Systemredesignprojet ofgeschloss, deen déi meescht Mypy Themen betreffend kreesfërmeg Importer fixéiert huet. Dës Problemer stamen eigentlech aus de ganz fréien Deeg vum Projet, zréck vum Alore, der pädagogescher Sprooch op déi de mypy-Projet ursprénglech konzentréiert war. Alore Syntax mécht et einfach Problemer mat zyklesche Import Kommandoen ze léisen. Modern mypy huet e puer Aschränkungen vun hirer fréierer, einfach-minded Implementatioun ierflecher (wat e super fit fir Alore war). Python mécht d'Aarbecht mat kreesfërmeg Importer schwéier, haaptsächlech well Ausdréck zweedeiteg sinn. Zum Beispill, eng Aufgab Operatioun kann tatsächlech en Typ Alias ​​definéieren. Mypy ass net ëmmer fäeg Saachen wéi dëst z'entdecken bis de gréissten Deel vun der Importschleife veraarbecht gouf. Et waren keng sou Ambiguitéiten zu Alore. Schlecht Entscheedungen, déi an de fréie Stadien vun der Systementwécklung gemaach goufen, kënnen de Programméierer vill Joer méi spéit eng désagréabel Iwwerraschung presentéieren.

Resultater: de Wee op 5 Millioune Codelinnen an nei Horizont

De mypy Projet ass e laange Wee komm - vu fréie Prototypen bis e System deen 4 Millioune Linne vu Produktiounscodetypen kontrolléiert. Wéi mypy evoluéiert huet, goufen Python's Typ Hiweiser standardiséiert. Dës Deeg huet e mächtege Ökosystem ronderëm d'Type Python Code entwéckelt. Et huet eng Plaz fir Bibliothéik Ënnerstëtzung, et enthält Hilfsinstrumenter fir IDEs an Redaktoren, et huet e puer Typ Kontrollsystemer, jidderee vun deenen seng eegen Virdeeler an Nodeeler huet.

Och wann d'Typprüfung scho bei Dropbox gegeben ass, gleewen ech datt mir nach ëmmer an de fréie Deeg vum Python Code tippen. Ech denken datt Typprüfungstechnologien sech weider entwéckelen a verbesseren.

Wann Dir nach net Typprüfung an Ärem grousse Python-Projet benotzt hutt, da wësst datt elo eng ganz gutt Zäit ass fir op statesch Tippen ze plënneren. Ech hu mat deenen geschwat, déi en ähnlechen Iwwergang gemaach hunn. Keen vun hinnen huet et bedauert. Typprüfung mécht Python eng Sprooch déi vill besser gëeegent ass fir grouss Projeten z'entwéckelen wéi "normale Python."

Léif Lieser! Benotzt Dir Typprüfung an Äre Python Projeten?

De Wee fir 4 Millioune Linnen Python Code ze tippen. Deel 3
De Wee fir 4 Millioune Linnen Python Code ze tippen. Deel 3

Source: will.com

Setzt e Commentaire