Ang dalan sa pag-typecheck sa 4 ka milyon nga linya sa Python code. Bahin 3

Gipresentar namo sa imong pagtagad ang ikatulo nga bahin sa paghubad sa materyal mahitungod sa dalan nga gikuha sa Dropbox sa dihang nag-implementar og type checking system alang sa Python code.

Ang dalan sa pag-typecheck sa 4 ka milyon nga linya sa Python code. Bahin 3

β†’ Miagi nga mga bahin: una ΠΈ ikaduha

Pag-abot sa 4 milyon nga linya sa gi-type nga code

Laing dakong hagit (ug ang ikaduha nga kasagarang gikabalak-an sa mga gi-survey sa sulod) mao ang pagdugang sa gidaghanon sa code nga nasakup sa mga type check sa Dropbox. Gisulayan namo ang pipila ka mga pamaagi aron masulbad kini nga problema, gikan sa natural nga pagpadako sa gidak-on sa gi-type nga codebase ngadto sa pag-focus sa mga paningkamot sa mypy team sa static ug dynamic nga automated type inference. Sa katapusan, ingon og walay yano nga pamaagi sa pagdaog, apan nakahimo kami sa pagkab-ot sa paspas nga pagtubo sa gidaghanon sa annotated code pinaagi sa paghiusa sa daghang mga pamaagi.

Ingon usa ka sangputanan, ang among pinakadako nga repository sa Python (nga adunay backend code) adunay hapit 4 milyon nga linya sa annotated code. Ang trabaho sa static nga pag-type sa code nahuman sa gibana-bana nga tulo ka tuig. Ang Mypy karon nagsuporta sa nagkalain-laing matang sa code coverage nga mga report nga nagpasayon ​​sa pagmonitor sa pag-uswag sa pag-type. Sa partikular, makahimo kami og mga taho sa code nga adunay mga ambiguity sa mga tipo, sama sa, pananglitan, klaro nga paggamit sa usa ka tipo. Any sa mga anotasyon nga dili mapamatud-an, o sa mga butang sama sa pag-import sa mga librarya sa ikatulo nga partido nga wala’y mga anotasyon sa tipo. Isip bahin sa usa ka proyekto aron mapauswag ang katukma sa pagsusi sa tipo sa Dropbox, nakatampo kami sa pagpaayo sa mga kahulugan sa tipo (gitawag nga mga stub file) alang sa pipila ka sikat nga bukas nga gigikanan nga mga librarya sa usa ka sentralisado nga repositoryo sa Python. gi-typed.

Among gipatuman (ug gi-standardize sa sunod nga mga PEP) ang mga bag-ong feature sa tipo nga sistema nga nagtugot sa mas tukma nga mga tipo alang sa pipila ka piho nga mga pattern sa Python. Usa ka talagsaong pananglitan niini mao ang TypeDict, nga naghatag og mga tipo alang sa sama sa JSON nga mga diksyonaryo nga adunay usa ka pirmi nga hugpong sa mga yawe sa pisi, ang matag usa adunay bili sa kaugalingon nga tipo. Magpadayon kami sa pagpalapad sa tipo nga sistema. Ang among sunod nga lakang lagmit mao ang pagpauswag sa suporta alang sa mga kapabilidad sa numero sa Python.

Ang dalan sa pag-typecheck sa 4 ka milyon nga linya sa Python code. Bahin 3
Gidaghanon sa mga linya sa annotated code: server

Ang dalan sa pag-typecheck sa 4 ka milyon nga linya sa Python code. Bahin 3
Gidaghanon sa mga linya sa annotated code: kliyente

Ang dalan sa pag-typecheck sa 4 ka milyon nga linya sa Python code. Bahin 3
Kinatibuk-ang gidaghanon sa mga linya sa annotated code

Ania ang usa ka kinatibuk-ang ideya sa mga nag-unang bahin sa mga butang nga among gihimo aron madugangan ang gidaghanon sa annotated code sa Dropbox:

Katig-a sa anotasyon. Among hinayhinay nga gidugangan ang mga kinahanglanon alang sa kahigpit sa pag-annotate sa bag-ong code. Nagsugod kami sa mga tip sa linter nga nagsugyot sa pagdugang mga anotasyon sa mga file nga adunay pipila ka mga anotasyon. Nanginahanglan kami karon og mga anotasyon sa tipo sa bag-ong mga file sa Python ug sa kadaghanan nga mga file.

Pag-type sa mga taho. Nagpadala kami mga team matag semana nga mga taho sa lebel sa pag-type sa ilang code ug naghatag tambag kung unsa ang kinahanglan una nga i-annotate.

Popularisasyon sa mypy. Naghisgot kami bahin sa mypy sa mga panghitabo ug nakigsulti sa mga team aron matabangan sila nga makasugod sa mga anotasyon sa tipo.

Mga botohan. Naghimo kami mga pana-panahon nga mga survey sa tiggamit aron mahibal-an ang dagkong mga problema. Andam na kami nga moadto ug layo sa pagsulbad niini nga mga problema (bisan ang paghimo og bag-ong pinulongan aron mapadali ang mypy!).

Pagpasundayag. Gipauswag namo pag-ayo ang performance sa mypy pinaagi sa paggamit sa daemon ug mypyc. Gihimo kini aron mahapsay ang mga kahasol nga motumaw sa panahon sa proseso sa anotasyon, ug aron makahimo sa pagtrabaho sa daghang mga code.

Paghiusa sa mga editor. Naghimo kami mga himan aron suportahan ang pagpadagan sa mypy sa mga editor nga sikat sa Dropbox. Naglakip kini sa PyCharm, Vim ug VS Code. Gipasimple kaayo niini ang proseso sa pag-annotate sa code ug pagsusi sa pagpaandar niini. Kini nga mga matang sa mga aksyon kasagaran kung mag-annotate sa kasamtangan nga code.

Static nga pagtuki. Naghimo kami usa ka himan aron mahibal-an ang mga pirma sa function gamit ang static nga mga himan sa pagtuki. Kini nga himan mahimo lamang nga magamit sa medyo yano nga mga sitwasyon, apan kini nakatabang kanamo nga madugangan ang among code type coverage nga walay daghang paningkamot.

Suporta alang sa mga librarya sa ikatulo nga partido. Daghan sa among mga proyekto naggamit sa toolkit sa SQLAlchemy. Gipahimuslan niini ang dinamikong kapabilidad sa Python nga ang mga tipo sa PEP 484 dili makahimo sa direktang modelo. Kami, uyon sa PEP 561, naghimo sa katugbang nga stub file ug misulat og plugin para sa mypy (bukas nga tinubdan), nga nagpauswag sa suporta sa SQLAlchemy.

Mga kalisdanan nga among nasugatan

Ang agianan padulong sa 4 milyon nga linya sa gi-type nga code dili kanunay sayon ​​alang kanamo. Niini nga dalan nasugatan namo ang daghang mga buho ug nakahimog daghang mga sayop. Kini ang pipila sa mga problema nga among nasugatan. Kami naglaum nga ang pagsulti bahin kanila makatabang sa uban nga malikayan ang susamang mga problema.

Nawala nga mga file. Gisugdan namo ang among trabaho pinaagi sa pagsusi sa gamay lang nga gidaghanon sa mga file. Ang bisan unsa nga wala maapil niini nga mga file wala gisusi. Ang mga file gidugang sa listahan sa pag-scan sa dihang ang unang mga anotasyon nagpakita niini. Kung adunay usa ka butang nga gi-import gikan sa usa ka module nga nahimutang sa gawas sa sakup sa pag-verify, nan naghisgot kami bahin sa pagtrabaho sa mga kantidad sama sa Any, nga wala gisulayan sa tanan. Misangpot kini sa dakong pagkawala sa katukma sa pag-type, ilabina sa unang mga yugto sa paglalin. Katingad-an nga nagtrabaho kini nga pamaagi hangtod karon, bisan kung ang usa ka kasagaran nga kahimtang mao nga ang pagdugang mga file sa sakup sa pagrepaso nagpadayag mga problema sa ubang mga bahin sa codebase. Sa pinakagrabe nga kaso, kung ang duha ka nahilit nga mga lugar sa code gihiusa, diin, nga independente sa usag usa, ang mga tipo nasusi na, nahimo nga ang mga tipo niini nga mga lugar dili magkauyon sa usag usa. Misangpot kini sa panginahanglan sa paghimog daghang kausaban sa mga anotasyon. Sa paghinumdom karon, nahibal-an namon nga kinahanglan namon nga idugang ang mga core library module sa mypy's type checking area sa labing madali. Kini maghimo sa atong trabaho nga mas matag-an.

Pag-annotate sa daan nga code. Sa dihang nagsugod kami, kami adunay mga 4 ka milyon nga linya sa kasamtangan nga Python code. Klaro nga ang pag-annotate niining tanan nga code dili sayon ​​nga buluhaton. Naghimo kami usa ka himan nga gitawag PyAnnotate nga makakolekta sa tipo nga impormasyon samtang ang mga pagsulay modagan ug makadugang sa tipo nga anotasyon sa imong code base sa impormasyon nga nakolekta. Bisan pa, wala kami nakamatikod sa usa ka labi ka kaylap nga pagsagop sa kini nga himan. Hinay ang pagtigom sa tipo sa impormasyon, ug ang awtomatikong namugna nga mga anotasyon kasagarang nanginahanglan ug daghang manwal nga pag-edit. Naghunahuna kami bahin sa awtomatik nga pagpadagan niini nga himan sa matag higayon nga among susihon ang code, o bahin sa pagkolekta sa tipo nga impormasyon base sa pagtuki sa pipila ka gamay nga gidaghanon sa aktuwal nga mga hangyo sa network, apan mihukom nga dili tungod kay ang bisan unsang pamaagi peligroso kaayo.

Ingon usa ka sangputanan, mahibal-an nga kadaghanan sa code manual nga gi-annotate sa mga tag-iya niini. Aron sa paggiya niini nga proseso sa husto nga direksyon, kami nag-andam sa mga taho sa partikular nga importante nga mga module ug mga gimbuhaton nga kinahanglan nga annotated. Pananglitan, importante ang paghatag og type annotation para sa usa ka library module nga gigamit sa gatosan ka lugar. Apan ang usa ka karaan nga serbisyo nga gipulihan sa usa ka bag-o dili na hinungdanon nga i-annotate. Nag-eksperimento usab kami sa paggamit sa static nga pag-analisa aron makamugna og mga anotasyon sa tipo alang sa legacy code.

Siklik nga import. Sa ibabaw, naghisgot ako bahin sa cyclic imports (ang "dependency tangles"), ang pagkaanaa niini nakapalisud sa pagpadali sa mypy. Kinahanglan usab namon nga magtrabaho pag-ayo aron masuportahan sa mypy ang tanan nga mga klase sa mga idiom nga gipahinabo sa kini nga mga cyclic import. Bag-o lang namo nakompleto ang usa ka mayor nga proyekto sa pagdesinyo pag-usab sa sistema nga nag-ayo sa kadaghanan sa mga isyu sa mypy bahin sa mga circular import. Kini nga mga problema sa tinuod naggikan sa unang mga adlaw sa proyekto, balik gikan sa Alore, ang edukasyonal nga pinulongan nga ang mypy nga proyekto orihinal nga naka-focus sa. Ang alore syntax nagpasayon ​​sa pagsulbad sa mga problema sa cyclic import commands. Ang modernong mypy nakapanunod sa pipila ka mga limitasyon gikan sa una, yano nga panghunahuna nga pagpatuman (nga usa ka maayo nga angay alang sa Alore). Gihimo sa Python nga lisud ang pagtrabaho sa mga circular import, labi na tungod kay ang mga ekspresyon dili klaro. Pananglitan, ang usa ka buluhaton sa buluhaton mahimong tinuod nga naghubit sa usa ka tipo nga alias. Ang Mypy dili kanunay makamatikod sa mga butang nga sama niini hangtod nga ang kadaghanan sa import loop naproseso. Wala’y ingon nga mga ambiguity sa Alore. Ang dili maayo nga mga desisyon nga gihimo sa sayong mga yugto sa pag-uswag sa sistema mahimo’g magpakita usa ka dili maayo nga katingala sa programmer daghang tuig ang milabay.

Resulta: ang agianan sa 5 milyon nga linya sa code ug bag-ong mga kapunawpunawan

Ang mypy nga proyekto dugay na nga naabot - gikan sa unang mga prototype ngadto sa usa ka sistema nga nagkontrolar sa 4 ka milyon nga linya sa mga tipo sa produksiyon nga code. Samtang nag-uswag ang mypy, ang mga tip sa tipo sa Python gi-standardize. Karong mga adlawa, usa ka gamhanan nga ekosistema ang naugmad sa palibot sa pag-type sa Python code. Adunay kini usa ka lugar alang sa suporta sa librarya, kini adunay sulud nga auxiliary nga mga himan alang sa mga IDE ug mga editor, kini adunay daghang mga sistema sa pagkontrol sa tipo, nga ang matag usa adunay kaugalingon nga mga bentaha ug disbentaha.

Bisan kung ang pagsusi sa tipo gihatag na sa Dropbox, nagtuo ko nga naa pa kita sa unang mga adlaw sa pag-type sa Python code. Sa akong hunahuna ang mga teknolohiya sa pagsusi sa tipo magpadayon sa pag-uswag ug pag-uswag.

Kung wala pa nimo gigamit ang pagsusi sa tipo sa imong dako nga proyekto sa Python, nan hibal-i nga karon ang usa ka maayo kaayo nga panahon sa pagsugod sa paglihok sa static nga pag-type. Nakigsulti ko niadtong nakahimo og susama nga transisyon. Walay usa kanila ang nagbasol niini. Ang pagsusi sa tipo naghimo sa Python nga usa ka sinultian nga labi ka haum sa paghimo og dagkong mga proyekto kaysa sa "regular nga Python."

Minahal nga magbabasa! Gigamit ba nimo ang pagsusi sa tipo sa imong mga proyekto sa Python?

Ang dalan sa pag-typecheck sa 4 ka milyon nga linya sa Python code. Bahin 3
Ang dalan sa pag-typecheck sa 4 ka milyon nga linya sa Python code. Bahin 3

Source: www.habr.com

Idugang sa usa ka comment