{"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":"Teekond 4 miljoni rea Python-koodi t\u00fc\u00fcpi kontrollimiseks. Osa 3","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>K\u00e4esolevaga esitame teile kolmanda osa t\u00f5lgitud materjalist Dropboxi teekonnast, kui nad rakendasid enda Python-koodi t\u00fc\u00fcbi kontrollimise s\u00fcsteemi.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468237\/\"><img decoding=\"async\" alt=\"Teekond 4 miljoni rea Python-koodi t\u00fc\u00fcpi 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\/\">esimene<\/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 rea t\u00fc\u00fcbiga koodi saavutamine<\/h2>\n<p>\nVeel \u00fcks oluline \u00fclesanne (see oli teine populaarseim probleem, mis muretses sisekaalutlustes osalejaid) oli koodi mahu suurendamine Dropboxis, mis on kaetud t\u00fc\u00fcbikontrollidega. Proovisime seda probleemi lahendamiseks mitmeid l\u00e4henemisviise \u2014 alates t\u00fc\u00fcbiga koodibaasi loomulikust kasvust kuni mypy meeskonna liikmete statistilise ja d\u00fcnaamilise automatiseeritud t\u00fcpifitseerimise j\u00f5upingutusteni. L\u00f5puks j\u00e4i mulje, et lihtsat ja v\u00f5itjat strateegiat pole olemas, kuid suutsime saavutada kiire kasvu anoteeritud koodi mahus, kombineerides erinevaid l\u00e4henemisviise.<\/p>\n<p>Kuna meie suurimas Python-repos, kus on tagakoodi, on m\u00e4rgitud koodiridu peaaegu 4 miljonit. Statistiline t\u00fcpiseerimise t\u00f6\u00f6 on kestnud umbes kolm aastat. Mypy toetab n\u00fc\u00fcd erinevaid t\u00fc\u00fcbi kattearuande vorme, mis lihtsustavad t\u00fcpiseerimise edenemise j\u00e4lgimist. Eriti saame koostada aruandeid t\u00fc\u00fcpide ebakindluste kohta, n\u00e4iteks selgete t\u00fc\u00fcpide kasutamise puhul. <code>Any<\/code> anotatsioonides, mida ei saa kontrollida, v\u00f5i sellistes, nagu kolmandate osapoolte raamatukogude import, kus puuduvad t\u00fcpi anotatsioonid. Projekti raames, mille eesm\u00e4rk on parandada t\u00fc\u00fcpide kontrollimise t\u00e4psust Dropboxis, oleme panustanud t\u00fc\u00fcpide m\u00e4\u00e4ratlemise (nii-\u00f6elda stub-failide) parandamisse m\u00f5nede populaarsete avatud l\u00e4htekoodiga raamatukogude jaoks tsentraliseeritud Python-repos. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/python\/typeshed\">typeshed<\/a><\/noindex>.<\/p>\n<p>Me oleme rakendanud (ja standardiseerinud j\u00e4rgnevates PEP-des) uusi t\u00fc\u00fcbis\u00fcsteemi funktsioone, mis v\u00f5imaldavad kasutada t\u00e4psemaid t\u00fc\u00fcpe m\u00f5nede spetsiifiliste Python-mustrite jaoks. M\u00e4rkimisv\u00e4\u00e4rne n\u00e4ide sellest on <code>TypeDict<\/code>, mis pakub JSON-laadsetele s\u00f5nastikele t\u00fc\u00fcpide komplekti, millel on kindel rida stringi v\u00f5tmeid, millest iga\u00fchel on oma t\u00fc\u00fcpi v\u00e4\u00e4rtus. Me j\u00e4tkame t\u00fc\u00fcpide s\u00fcsteemi laiendamist. Meie j\u00e4rgmine samm on t\u00f5en\u00e4oliselt Python'i numbrite t\u00f6\u00f6tlemise v\u00f5imaluste toetuse parandamine.<\/p>\n<p><img decoding=\"async\" alt=\"Teekond 4 miljoni rea Python-koodi t\u00fc\u00fcpi 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=\"Teekond 4 miljoni rea Python-koodi t\u00fc\u00fcpi kontrollimiseks. Osa 3\" src=\"\/wp-content\/uploads\/2019\/10\/c183a9227e51d847bfdb2b8f6153684f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Annoteritud koodi ridade arv: klient<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Teekond 4 miljoni rea Python-koodi t\u00fc\u00fcpi 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 tegevustes, mida oleme teinud annotatud koodi mahu suurendamiseks Dropboxis:<\/p>\n<p>Annotatsiooni rangeus. Oleme j\u00e4rk-j\u00e4rgult suurendanud uue koodi annotatsiooni rangeuse n\u00f5udeid. Alustasime lintersi soovitustega, mis soovitasid lisada annotatsioone failidesse, kus on juba m\u00f5ned annotatsioonid olemas. N\u00fc\u00fcd n\u00f5uame t\u00fc\u00fcbi annotatsioonide olemasolu uutes Python-failides ja enamikus olemasolevates failides.<\/p>\n<p>T\u00fc\u00fcbiaruanded. Saadame meeskondadele igan\u00e4dalasi aruandeid nende koodi t\u00fc\u00fcpide tasemest ja anname soovitusi selle kohta, mida tasub esmalt annotatsiooni alla v\u00f5tta.<\/p>\n<p>mypy populariseerimine. Me r\u00e4\u00e4gime mypy\u2019st erinevatel \u00fcritustel ja suhtleme meeskondadega, aidates neil alustada t\u00fc\u00fcpide annotatsioonide kasutamisega.<\/p>\n<p>K\u00fcsimustikud. Korraldame perioodiliselt kasutajak\u00fcsimustikke, et tuvastada peamised probleemid. Oleme valmis nendest probleemidest p\u00e4ris kaugele minema (sealhulgas uue keele loomine mypy kiirendamiseks!).<\/p>\n<p>J\u00f5udlus. Oleme oluliselt parandanud mypy j\u00f5udlust t\u00e4nu deemonile ja mypyc\u2019ile. See on tehtud, et sujuvdada t\u00fc\u00fcpide annotatsiooni korral tekkivaid ebamugavusi ja v\u00f5imaldada t\u00f6\u00f6tada suuremate koodimassidega.<\/p>\n<p>Redaktoritega integreerimine. Oleme loonud t\u00f6\u00f6riistu mypy k\u00e4ivitamiseks redaktoreides, mida Dropboxis laialdaselt kasutatakse. Nende hulka kuuluvad PyCharm, Vim ja VS Code. See on oluliselt lihtsustanud koodide annotatsioonide tegemise ja nende t\u00f5hususe kontrollimise protsessi. Sellised tegevused on tavaliselt iseloomulikud olemasoleva koodi annotatsioonile.<\/p>\n<p>Statistiline anal\u00fc\u00fcs. Oleme loonud t\u00f6\u00f6riista funktsioonide signatuuride genereerimiseks, kasutades staatilise anal\u00fc\u00fcsi vahendeid. See t\u00f6\u00f6riist toimib ainult suhteliselt lihtsates olukordades, kuid aitas meil vaevata suurendada koodi katvust t\u00fc\u00fcpidega.<\/p>\n<p>Kolmandate osapoolte teekide tugi. Paljudes meie projektides kasutatakse SQLAlchemy t\u00f6\u00f6riistakomplekti. See rakendab Python'i d\u00fcnaamilisi v\u00f5imalusi, mida PEP 484 t\u00fc\u00fcbid ei suuda otse modelleerida. PEP 561 kohaselt l\u00f5ime vastava stub-faili ja kirjutasime mypy jaoks plugina (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dropbox\/sqlalchemy-stubs\">avatud l\u00e4htekoodiga<\/a><\/noindex>), mis parandab SQLAlchemy tuge.<\/p>\n<h2>Kohtume raskustega<\/h2>\n<p>\nTee 4 miljoni t\u00fc\u00fcbitud koodirida juurde ei olnud alati lihtne. Sellel teel kohtasime palju takistusi ja tegime m\u00f5ned vead. Siin on m\u00f5ned probleemid, millega silmitsi seisisime. Loodame, et nende jagamine aitab teisi sarnaste probleemide v\u00e4ltimisel.<\/p>\n<p>Puuduvad failid. Alustasime t\u00f6\u00f6ga vaid v\u00e4ikese arvu failide kontrollimisega. K\u00f5ik, mis ei kuulunud nende failide hulka, ei olnud kontrollitud. Failid lisati kontrollimise nimekirja siis, kui nendes ilmusid esimesed annotatsioonid. Kui midagi imporditi modulist, mis asub v\u00e4ljaspool kontrollimise ala, siis oli jutt v\u00e4\u00e4rtuste t\u00fc\u00fcbist. <code>Any<\/code>, mis ei olnud \u00fcldse kontrollitud. See t\u00f5i kaasa m\u00e4rkimisv\u00e4\u00e4rse t\u00fc\u00fcbistamise t\u00e4psuse languse, eriti migreerimise varajastes etappides. Selline l\u00e4henemine toimis endiselt \u00fcllatavalt h\u00e4sti, kuigi t\u00fc\u00fcpiline oli olukord, kus failide lisamine kontrollitud ala paljastas probleeme koodi muudes osades. K\u00f5ige halvemal juhul, kui kaks isoleeritud koodiala \u00fchendati, kus m\u00f5lemad olid juba iseseisvalt kontrollitud, selgus, et nende t\u00fc\u00fcpide vahel on \u00fchilduvuse probleeme. See viis vajaduseni teha esitustes mitmeid muudatusi. N\u00fc\u00fcd, tagasi vaadates, m\u00f5istame, et oleksime pidanud v\u00f5imalikult varakult lisama mypy t\u00fc\u00fcbikontrolli alla p\u00f5hiraamatukogu moodulid. See oleks teinud meie t\u00f6\u00f6 palju ennustatavamaks.<\/p>\n<p>Vana koodi annotatsioon. Kui alustasime t\u00f6\u00f6d, oli meil umbes 4 miljonit rida juba olemasolevat Python-koodi. Oli selge, et kogu selle koodi annotatsioon on keeruline \u00fclesanne. Me l\u00f5ime t\u00f6\u00f6riista nimega PyAnnotate, mis suudab koguda t\u00fc\u00fcbiteavet testide k\u00e4igus ning oskab koodile lisada t\u00fc\u00fcbianotatsioone p\u00f5hinedes kogutud teabele. Siiski ei m\u00e4rganud me seda t\u00f6\u00f6riista laialdast kasutuselev\u00f5ttu. T\u00fc\u00fcbiteabe kogumine oli aeglane, automaatselt genereeritud annotatsioonid n\u00f5udsid sageli palju k\u00e4sitsi parandusi. M\u00f5tlesime t\u00f6\u00f6riista automaatse k\u00e4ivitamise peale iga koodikontrolli ajal v\u00f5i t\u00fc\u00fcbiteabe kogumise peale, p\u00f5hinedes m\u00f5ne v\u00e4ikese hulga reaalseid veebip\u00e4ringuid anal\u00fc\u00fcsides, kuid otsustasime seda mitte teha, kuna \u00fckski neist l\u00e4henemistest oli liiga riskantne.<\/p>\n<p>Kokkuv\u00f5ttes v\u00f5ib \u00f6elda, et enamik kodeerimist on k\u00e4sitsi annotatsiooni teinud selle omanikud. Me valmistame eriti oluliste moodulite ja funktsioonide kohta aruandeid, et suunata see protsess \u00f5igesse suunda. N\u00e4iteks on oluline varustada t\u00fc\u00fcbid annotatsioonidega raamatukogu moodulit, mida kasutatakse sadades kohtades. Kuid vana teenuse annotatsioon ei ole enam nii oluline, kui see asendatakse uuega. Lisaks katsetame me staatilise anal\u00fc\u00fcsi kasutamist t\u00fc\u00fcbi annotatsioonide genereerimiseks vana koodi jaoks.<\/p>\n<p>Ts\u00fcklilised impordid. \u00dclal r\u00e4\u00e4kisin ts\u00fcklilistest imporditest (\"s\u00f5ltuvuste pundardest\"), mille olemasolu raskendas mypy kiirus. Me pidime t\u00f5siselt vaeva n\u00e4gema, et varustada mypy k\u00f5igi nende ts\u00fckliliste impordite t\u00f5ttu tekkinud idiomade toetusega. Just hiljuti l\u00f5petasime suure projekti, mille k\u00e4igus uuendasime s\u00fcsteemi ja lahendasime suurema osa mypyga seotud ts\u00fckliliste impordite probleemidest. Need probleemid ulatusid tegelikult projekti varajastest p\u00e4evadest, isegi Alore'ist, kergest programmeerimiskeelest, millele mypy algselt suunatud oli. Alore s\u00fcntaks v\u00f5imaldab ts\u00fckliliste importide probleemide lahendamist h\u00f5lpsasti. Kaasaegne mypy on p\u00e4rinud m\u00f5ned piirangud oma varaselt primitiivsest teostusest (mis oli suurep\u00e4raselt sobiv Alore jaoks). Python muudab ts\u00fckliliste importidega t\u00f6\u00f6tamise keeruliseks peamiselt v\u00e4ljendite mitmet\u00e4henduslikkuse t\u00f5ttu. N\u00e4iteks v\u00f5ib v\u00e4\u00e4rtuse m\u00e4\u00e4ramise k\u00e4igus tegelikult m\u00e4\u00e4rata t\u00fc\u00fcpide aliasi. Mypy ei pruugi selliseid asju alati tuvastada, enne kui suur osa impordits\u00fcklist on t\u00f6\u00f6deldud. Alore'isse ei olnud selliseid mitmet\u00e4henduslikkusi. Varases arendusetapis tehtud eba\u00f5nnestunud lahendused v\u00f5ivad programmerijale tuua ebameeldivaid \u00fcllatusi aastaid hiljem.<\/p>\n<h2>Kokkuv\u00f5te: tee 5 miljoni koodireani ja uute horisoniteni<\/h2>\n<p>\nProjekt mypy on l\u00e4binud pika tee \u2013 alates varajastest protot\u00fc\u00fcpidest kuni s\u00fcsteemini, millega hallatakse 4 miljoni koodirea tootmist\u00fc\u00fcpide kontrollimist. MyPy arendamise k\u00e4igus viidi l\u00e4bi Pythonis t\u00fc\u00fcpide soovituste standardimine. T\u00e4nap\u00e4eval on loodud v\u00f5imas \u00f6kos\u00fcsteem, mis \u00fcmbritseb Python-koodi t\u00fc\u00fcpimist. Selles on ruumi teegide toetamiseks, seal on IDE-de ja redaktorite abivahendid, samuti mitmeid t\u00fc\u00fcpide kontrollimise s\u00fcsteeme, millest igal on oma plussid ja miinused.<\/p>\n<p>Kuid kuigi t\u00fc\u00fcpide kontrollimist peetakse Dropboxis juba iseenesestm\u00f5istetavaks, olen ma kindel, et me elame endiselt Python-koodi t\u00fcpiseerimise alguses. Arvan, et t\u00fc\u00fcpide kontrollimise tehnoloogiad j\u00e4tkavad arendamist ja t\u00e4iustamist.<\/p>\n<p>Kui te ei ole veel t\u00fc\u00fcbi kontrolli oma suurtes Python-projektides kasutanud, siis teadke, et praegu on suurep\u00e4rane aeg alustada \u00fcleminekut staatilisele t\u00fc\u00fcbistamisele. Olen r\u00e4\u00e4kinud nendega, kes on sellise \u00fclemineku teinud. Keegi neist ei kahetse seda. T\u00fc\u00fcbikontroll muudab Pythoni keeleks, mis sobib palju paremini suuremate projektide arendamiseks kui 'tavaline Python'.<\/p>\n<p><b>Lugupidamisega lugejad!<\/b> Kas kasutate oma Python-projektides t\u00fc\u00fcbikontrolli?<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/vps_start\/\"><img decoding=\"async\" alt=\"Teekond 4 miljoni rea Python-koodi t\u00fc\u00fcpi 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=\"Teekond 4 miljoni rea Python-koodi t\u00fc\u00fcpi 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 4.9.10 - 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. \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,\" \/>\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) 4.9.10\" \/>\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. \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,\" \/>\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\u00fcbikontrollini. Osa 3 | ProHoster","description":"Esitame teile kolmanda osa t\u00f5lkest materjalist, mis k\u00e4sitleb Dropboxi teekonda Python-koodi t\u00fc\u00fcbikontrolli s\u00fcsteemi rakendamisel. \u2192 Eelmised osad: esimene ja teine. 4 miljoni rida t\u00fc\u00fcbiga koodi saavutamine. Veel \u00fcks oluline \u00fclesanne (see oli teine k\u00f5ige populaarsem probleem, mis muretses neid, kes osalesid sise-uuringutes) oli koodi mahu suurendamine Dropboxis.","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. \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,","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":null,"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-01-23 22:54:19"},"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}]}}