{"id":38649,"date":"2019-10-31T22:25:04","date_gmt":"2019-10-31T19:25:04","guid":{"rendered":"https:\/\/prohoster.info\/blog\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3\/"},"modified":"2019-10-31T22:25:04","modified_gmt":"2019-10-31T19:25:04","slug":"put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3","title":{"rendered":"Tee nelja miljoni rea Python-koodi t\u00fc\u00fcpide kontrollimiseks. Osa 3","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Esitleme teile Dropboxi teekonna kolmandat osa, kuidas nad loobusid Python-koodi t\u00fc\u00fcpide kontrollimise s\u00fcsteemist.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468237\/\"><img decoding=\"async\" alt=\"Tee nelja miljoni rea Python-koodi t\u00fc\u00fcpide kontrollimiseks. Osa 3\" src=\"\/wp-content\/uploads\/2019\/10\/757669265e870de604388c66adef814d.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>\u2192 Eelnevad osad: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468233\/\">esmalt<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468235\/\">teine<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>4 miljoni t\u00fc\u00fcbitud koodi rida saavutamine<\/h2>\n<p>\nTeiseks oluliseks \u00fclesandeks (see oli teiseks k\u00f5ige populaarsem probleem, mis puudutas sisemisi uuringutes osalejaid) oli suurendada Dropboxis t\u00fc\u00fcbid kontrolli alla langeva koodi mahtu. Katsetasime mitmeid l\u00e4henemisviise selle \u00fclesande lahendamiseks - looduslikust kasvust t\u00fc\u00fcbitud koodibaasi mahus kuni meeskonna mypy liikmete j\u00f5upingutuste suunamiseni staatilise ja d\u00fcnaamilise automaatse t\u00fc\u00fcbiv\u00e4ljundi poole. Tekkis mulje, et siin puudub lihtne v\u00f5idustrateegia, kuid suutsime saavutada kiiret kasvu m\u00e4rgitud koodi mahtude osas, kombineerides mitmeid l\u00e4henemisviise.<\/p>\n<p>Tulemuseks j\u00f5udis meie suurimas Python-repositooriumis (tagakoodi jaoks) m\u00e4rgitud koodi ridade arv peaaegu 4 miljoni ni. Koodi staatiline t\u00fc\u00fcbistamine viidi l\u00e4bi umbes kolme aasta jooksul. Mypy toetab n\u00fc\u00fcd erinevaid koodi katvuse aruanne, mis lihtsustavad t\u00fc\u00fcbistamise j\u00e4lgimist. Eelk\u00f5ige suudame genereerida aruandeid koodi kohta, kus on ebamugavusi t\u00fc\u00fcpidega, n\u00e4iteks selge t\u00fc\u00fcbiga kasutuselemendid <code>Any<\/code> t\u00fc\u00fcpide annotatsioonides, mida ei saa kontrollida, v\u00f5i sellised, nagu kolmandate osade raamatukogude import, kus ei ole t\u00fc\u00fcbide annotatsioone. Dropboxi t\u00fc\u00fcbide kontrollimise t\u00e4psuse suurendamise projekti raames oleme panustanud mitmete populaarsete avatud l\u00e4htekoodiga raamatukogude t\u00fc\u00fcbide m\u00e4\u00e4ratlemise (nn stub-failide) parandamisse keskendunud Python-repositooriumis <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/python\/typeshed\">typeshed<\/a><\/noindex>.<\/p>\n<p>Olemes oleme rakendanud (ja standardiseerinud hilisemate PEP-ituse k\u00e4igus) uusi t\u00fc\u00fcbis\u00fcsteemi v\u00f5imalusi, mis v\u00f5imaldavad kasutada t\u00e4psemaid t\u00fc\u00fcpe teatud spetsiifiliste Python-mustrite jaoks. Silmapaistvaks n\u00e4iteks on <code>TypeDict<\/code>, mis pakub t\u00fc\u00fcpe JSON-sarnastele s\u00f5nastikele, millel on fikseeritud hulk stringi v\u00f5tmeid, kus igal on oma t\u00fc\u00fcbi v\u00e4\u00e4rtus. J\u00e4tkame t\u00fcbis\u00fcsteemi laiendamist. T\u00f5en\u00e4oliselt on meie j\u00e4rgmine samm Python-i numbrite t\u00f6\u00f6tlemise v\u00f5imekuse toetuse parandamine.<\/p>\n<p><img decoding=\"async\" alt=\"Tee nelja miljoni rea Python-koodi t\u00fc\u00fcpide kontrollimiseks. Osa 3\" src=\"\/wp-content\/uploads\/2019\/10\/297b9e823141d6cb0d2f19f9a78a1153.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Annoteritud koodi ridade arv: server<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Tee nelja miljoni rea Python-koodi t\u00fc\u00fcpide kontrollimiseks. Osa 3\" src=\"\/wp-content\/uploads\/2019\/10\/c183a9227e51d847bfdb2b8f6153684f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Annotatud koodi ridade arv: klient<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Tee nelja miljoni rea Python-koodi t\u00fc\u00fcpide kontrollimiseks. Osa 3\" src=\"\/wp-content\/uploads\/2019\/10\/0a8b936fa454a34c09a9c6a2694485c9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Annotatud koodi koguarv<\/i><\/p>\n<p>Siin on \u00fclevaade peamistest omadustest, mida oleme teinud, et suurendada annotatsioonide arvu Dropboxis:<\/p>\n<p>Annotatsioonide rangus. Oleme j\u00e4rk-j\u00e4rgult suurendanud uusi koodi annotatsioonide ranguse n\u00f5udeid. Alustasime linteri soovitustega, milles soovitati lisada annotatsioone failidesse, kus juba on m\u00f5ningad annotatsioonid. N\u00fc\u00fcd n\u00f5uame, et uusis Python-failides oleksid t\u00fc\u00fcpide annotatsioonid ning enamikus olemasolevates failides.<\/p>\n<p>T\u00fc\u00fcpide raportid. Saadame igan\u00e4dalasi aruandeid meeskondadele nende koodi t\u00fc\u00fcpide taseme kohta ja jagame n\u00e4pun\u00e4iteid selle kohta, mida tuleks k\u00f5igepealt annotatsiooniks v\u00f5tta.<\/p>\n<p>Mypy populariseerimine. Tutvustame mypy-d erinevatel \u00fcritustel ja suhtleme meeskondadega, aidates neil alustada t\u00fc\u00fcpide annotatsioonide kasutamisega.<\/p>\n<p>K\u00fcsimustikud. Kasutame perioodilisi k\u00fcsimustikke, et tuvastada peamised probleemid. Oleme valmis minema otsustavalt kaugemale nende probleemide lahendamisel (kuni uue keele loomise vajaduseni mypy kiirendamiseks!).<\/p>\n<p>J\u00f5udlus. Oleme oluliselt parandanud mypy j\u00f5udlust, kasutades demonaid ja mypyc-d. See on tehtud selleks, et v\u00e4hendada annotatsiooniprotsessis esinevaid ebamugavusi ja v\u00f5imaldada t\u00f6\u00f6d suuremate koodimahustega.<\/p>\n<p>Toimetajate integreerimine. Oleme loonud t\u00f6\u00f6riistad mypy k\u00e4itamise toetamiseks Dropboxis populaarsetes toimetajates. Nendeks on PyCharm, Vim ja VS Code. See on oluliselt lihtsustanud koodi annotatsiooni ja selle t\u00f6\u00f6kindluse kontrollimise protsessi. Sellised tegevused on tavaliselt iseloomulikud olemasoleva koodi annotatsioonile.<\/p>\n<p>Staatiline anal\u00fc\u00fcs. Oleme loonud t\u00f6\u00f6riista funktsioonide allkirjade genereerimiseks staatilise anal\u00fc\u00fcsi abil. See t\u00f6\u00f6riist t\u00f6\u00f6tab ainult suhteliselt lihtsates olukordades, kuid see aitas meil vaevata suurendada t\u00fc\u00fcpide katvust koodis.<\/p>\n<p>Kolmandate osapoolte raamatukogude toetaminen. Paljusid meie projekte toetab SQLAlchemy t\u00f6\u00f6riistade komplekt. See kasutab d\u00fcnaamilisi Python'i v\u00f5imalusi, mida PEP 484 t\u00fc\u00fcbid ei suuda otse modelleerida. Vastavalt PEP 561 oleme loonud vastava stub-faili ja kirjutanud mypy jaoks plugina.<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dropbox\/sqlalchemy-stubs\">avaldatud<\/a><\/noindex>), parandab SQLAlchemy tuge.<\/p>\n<h2>Kohtumised keerukustega<\/h2>\n<p>\nTeekond 4 miljoni rida t\u00fc\u00fcbitud koodini ei olnud alati lihtne. Sellel teel kohtasime palju takistusi ja tegime mitmeid vigu. Siin on m\u00f5ned probleemid, millega silmitsi seisisime. Loodame, et nende juurde p\u00e4\u00e4semine aitab teistel sarnastest probleemidest m\u00f6\u00f6da minna.<\/p>\n<p>Puuduolevad failid. Alustasime t\u00f6\u00f6d vaid v\u00e4ikese hulga failide kontrollimisega. Midagi, mis ei kuulunud nende failide hulka, ei kontrollitud. Failid lisati kontrollimisnimekirja, kui neis ilmnesid esimesed annotatsioonid. Kui midagi imporditi moodulist, mis asub kontrollimise ulkest v\u00e4ljaspool, siis r\u00e4\u00e4kisime t\u00fc\u00fcpide v\u00e4\u00e4rtustest, <code>Any<\/code>, mida \u00fcldse ei kontrollitud. See viis m\u00e4rkimisv\u00e4\u00e4rse t\u00fc\u00fcbi t\u00e4psuse kadumiseni, eriti migreerimise varases etapis. See l\u00e4henemine t\u00f6\u00f6tas endiselt \u00fcllatavalt h\u00e4sti, kuigi t\u00fc\u00fcpiline olukord oli see, et failide lisamine kontrollimisalasse paljastas probleeme koodi aluse teistes osades. K\u00f5ige halvemal juhul, kui kaks isoleeritud koodi valdkonda, kus t\u00fc\u00fcbid olid juba s\u00f5ltumatult kontrollitud, kokku pandi, selgus, et nende valdkondade t\u00fc\u00fcbid ei olnud omavahel \u00fchilduvad. See t\u00f5i kaasa vajaduse teha palju muudatusi annotatsioonides. N\u00fc\u00fcd, tagasi vaadates, m\u00f5istame, et oleksime pidanud v\u00f5imalikult varakult lisama mypy t\u00fc\u00fcpide kontrollimise alasse p\u00f5hiraamatukogude moodulid. See oleks teinud meie t\u00f6\u00f6 palju ennustatavamaks.<\/p>\n<p>Vanade koodide anoteerimine. Kui me alustasime, oli meil umbes 4 miljonit juba olemasolevat Python-koodi rida. Oli selge, et kogu selle koodi anoteerimine on keeruline \u00fclesanne. Loome t\u00f6\u00f6riista nimega PyAnnotate, mis suudab koguda t\u00fc\u00fcbiandmeid t\u00f6\u00f6 ajal testide k\u00e4igus ja suudab lisada koodile t\u00fc\u00fcbiannotatsioone p\u00f5hinedes kogutud andmetele. Kuid me ei ole m\u00e4rganud selle t\u00f6\u00f6riista laialdast kasutuselev\u00f5ttu. T\u00fc\u00fcbiandmete kogumine oli aeglane, automaatselt genereeritud annotatsioonid n\u00f5udsid sageli palju k\u00e4sitsi parandusi. Me m\u00f5tleme automaatse k\u00e4ivitamise \u00fcle iga koodi kontrollimise ajal v\u00f5i t\u00fc\u00fcbiandmete kogumise \u00fcle teatud v\u00e4ikese hulga tegelike v\u00f5rgu p\u00e4ringute anal\u00fc\u00fcsi p\u00f5hjal, kuid otsustasime seda mitte teha, kuna m\u00f5lemad l\u00e4henemised on liiga riskantsed.<\/p>\n<p>Kokkuv\u00f5ttes v\u00f5ib m\u00e4rkida, et enamik koodist on k\u00e4sitsi anoteeritud selle omanike poolt. Me, et suunata seda protsessi \u00f5iges suunas, valmistame ette aruandeid eriti olulistele moodulitele ja funktsioonidele, mis tuleb anoteerida. N\u00e4iteks on oluline varustada anoteeringutega t\u00fc\u00fcbiandmeid raamatukogu moodul, mida kasutatakse sadades kohtades. Kuid vana teenuse anoteerimine, mida asendab uus, ei ole enam nii oluline. Me katsetame ka staatilise anal\u00fc\u00fcsi kasutamist, et genereerida t\u00fc\u00fcbiannotatsioone vana koodi jaoks.<\/p>\n<p>Ts\u00fcklilised impordid. \u00dclalpool r\u00e4\u00e4kisin ts\u00fcklilistest imporditest (\"s\u00f5ltuvuste klubid\"), mille olemasolu on raskendanud mypy kiirendamist. Meil tuli peale selle ka t\u00f5siselt vaeva n\u00e4ha, et varustada mypy k\u00f5igi nende idiomade toega, mille teke tuleneb just nendest ts\u00fcklilistest imporditest. Hiljuti l\u00f5petasime ulatusliku s\u00fcsteemi redigeerimise projekti, mis lahendas enamikku mypyga seotud ts\u00fckliliste impordite probleeme. Need probleemid tekkisid tegelikult juba projekti varajastes p\u00e4evades, veel Alore'ist, \u00f5ppimiskeelest, millele mypy algselt suunatud oli. Alore s\u00fcntaks v\u00f5imaldab ts\u00fckliliste impordite probleeme h\u00f5lpsasti lahendada. Kaasaegne mypy on p\u00e4rinud osa piirangutest oma varasest lihtsast rakendusest (mis sobis Alore'ile suurep\u00e4raselt). Python muudab ts\u00fckliliste imporditega t\u00f6\u00f6tamise keerulisemaks peamiselt v\u00e4ljendite ebaselguse t\u00f5ttu. N\u00e4iteks v\u00f5ib v\u00e4\u00e4rtuse m\u00e4\u00e4ramise k\u00e4igus tegelikult m\u00e4\u00e4ratleda t\u00fc\u00fcbi alias. Mypy ei suuda selliseid asju alati tuvastada, enne kui suurem osa impordi ts\u00fcklis on t\u00f6\u00f6deldud. Alore'is ei esinenud selliseid ebaselgusi. Varaste s\u00fcsteemi arendusetapid v\u00f5etud eba\u00f5nnestunud otsused v\u00f5ivad programmeerijale ebameeldiva \u00fcllatuse tuua palju aastaid hiljem.<\/p>\n<h2>Kokkuv\u00f5tted: tee 5 miljoni koodi realt ja uutele horison'tele<\/h2>\n<p>\nMypy projekt on k\u00e4inud pikka teed \u2013 varasest protot\u00fc\u00fcpide ajast kuni s\u00fcsteemini, mis kontrollib 4 miljoni koodi rea tootmisstandardeid. Mypy arendamise k\u00e4igus toimus Pythonis t\u00fc\u00fcpsignaalide standardimine. T\u00e4nap\u00e4eval on Python-koodi t\u00fc\u00fcpe \u00fcmbritseva tugeva \u00f6kos\u00fcsteemi \u00fcmber tekkinud. Seal leidub toetavaid teeke, IDE ja redigeerijate abivahendeid ning mitmeid t\u00fc\u00fcbi kontrolli s\u00fcsteeme, millest igal on oma plussid ja miinused.<\/p>\n<p>Kuigi t\u00fc\u00fcbi kontrolli peetakse Dropboxis juba iseenesest m\u00f5istetavaks, olen ma kindel, et me elame ikka veel Python-koodi t\u00fcpiseerimise alguses. Ma arvan, et t\u00fc\u00fcbi kontrolli tehnoloogiad j\u00e4tkavad arendamist ja t\u00e4iustamist.<\/p>\n<p>Kui te pole veel oma suurtes Python-projektides t\u00fc\u00fcpide kontrolli kasutanud, siis teadke, et praegu on ideaalne aeg alustada \u00fcleminekut staatilisele t\u00fc\u00fcpimisele. Olen r\u00e4\u00e4kinud nendega, kes on sellise \u00fclemineku teinud. Keegi neist ei ole kahetsenud. T\u00fc\u00fcpide kontroll muudab Python'i keeleks, mis sobib palju paremini, kui \"tavaline Python\", suurte projektide arendamiseks.<\/p>\n<p><b>Lugupeetud lugejad!<\/b> Kasutate oma Python-projektides t\u00fc\u00fcpide kontrolli?<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/vps_start\/\"><img decoding=\"async\" alt=\"Tee nelja miljoni rea Python-koodi t\u00fc\u00fcpide kontrollimiseks. Osa 3\" src=\"\/wp-content\/uploads\/2019\/10\/bf2bc557ce4481dd87398515bff60e3f.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/ru-rub\/#order\"><img decoding=\"async\" alt=\"Tee nelja miljoni rea Python-koodi t\u00fc\u00fcpide kontrollimiseks. Osa 3\" src=\"\/wp-content\/uploads\/2019\/10\/098d481c25b3afaba9534c686e8f943a.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468237\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Dropbox, \u0432\u043d\u0435\u0434\u0440\u044f\u044f \u0443 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 Python-\u043a\u043e\u0434\u0430. \u2192 \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u0438: \u043f\u0435\u0440\u0432\u0430\u044f \u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0415\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 (\u044d\u0442\u043e \u0431\u044b\u043b \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0432\u043e\u043b\u043d\u043e\u0432\u0430\u0432\u0448\u0430\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043e\u043f\u0440\u043e\u0441\u0430\u0445) \u0431\u044b\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u0430 \u043a\u043e\u0434\u0430 \u0432 Dropbox, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28992,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38649","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Dropbox, \u0432\u043d\u0435\u0434\u0440\u044f\u044f \u0443 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 Python-\u043a\u043e\u0434\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0443\u0442\u044c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0442\u0438\u043f\u043e\u0432 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430. \u0427\u0430\u0441\u0442\u044c 3 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Dropbox, \u0432\u043d\u0435\u0434\u0440\u044f\u044f \u0443 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 Python-\u043a\u043e\u0434\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:25:04+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:25:04+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Tee 4 miljoni rea Python-koodi t\u00fc\u00fcpide kontrollimiseks. Osa 3 | ProHoster","description":"Esitleme teile Dropboxi teekonna kolmandat osa, kuidas nad loobusid Python-koodi t\u00fc\u00fcpide kontrollimise s\u00fcsteemist.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0443\u0442\u044c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0442\u0438\u043f\u043e\u0432 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430. \u0427\u0430\u0441\u0442\u044c 3 | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Dropbox, \u0432\u043d\u0435\u0434\u0440\u044f\u044f \u0443 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 Python-\u043a\u043e\u0434\u0430.","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:25:04+00:00","article:modified_time":"2019-10-31T19:25:04+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38649","title":null,"description":null,"keywords":null,"keyphrases":{"focus":[],"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 22:54:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:05:23","updated":"2026-08-11 12:50:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/38649","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=38649"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/38649\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/28992"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=38649"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=38649"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=38649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}