{"id":38479,"date":"2019-10-31T22:23:56","date_gmt":"2019-10-31T19:23:56","guid":{"rendered":"https:\/\/prohoster.info\/blog\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2\/"},"modified":"2019-10-31T22:23:56","modified_gmt":"2019-10-31T19:23:56","slug":"put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2","status":"publish","type":"post","link":"https:\/\/prohoster.info\/az\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2","title":{"rendered":"Python kodunun 4 milyon sat\u0131r\u0131n\u0131n tiplerini kontrol etme yolu. B\u00f6l\u00fcm 2","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bug\u00fcn Dropbox'ta birka\u00e7 milyon sat\u0131rl\u0131k Python kodunun tip kontrol\u00fcn\u00fc nas\u0131l organize etti\u011fimize dair materyalin ikinci b\u00f6l\u00fcm\u00fcn\u00fc yay\u0131ml\u0131yoruz.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468235\/\"><img decoding=\"async\" alt=\"Python kodunun 4 milyon sat\u0131r\u0131n\u0131n tiplerini kontrol etme yolu. B\u00f6l\u00fcm 2\" src=\"\/wp-content\/uploads\/2019\/09\/3f8f396d724153a0374a3fadca190d55.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>\u2192 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468233\/\">\u0130lk b\u00f6l\u00fcm\u00fc oku<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Resmi tip deste\u011fi (PEP 484)<\/h2>\n<p>\nDropbox'ta 2014 Hack Week s\u0131ras\u0131nda mypy ile ilk ciddi deneylerimizi ger\u00e7ekle\u015ftirdik. Hack Week, Dropbox'\u0131n bir hafta boyunca d\u00fczenledi\u011fi bir etkinliktir. Bu s\u00fcre zarf\u0131nda \u00e7al\u0131\u015fanlar istedikleri herhangi bir konuda \u00e7al\u0131\u015fabilirler! Dropbox'\u0131n en \u00fcnl\u00fc teknolojik projelerinden baz\u0131lar\u0131 bu t\u00fcr etkinliklerde ba\u015flam\u0131\u015ft\u0131r. Bu deneyin sonucunda mypy'nin umut verici g\u00f6r\u00fcnd\u00fc\u011f\u00fcne dair \u00e7\u0131kar\u0131mlar yapt\u0131k, ancak bu proje hen\u00fcz yayg\u0131n kullan\u0131m i\u00e7in haz\u0131r de\u011fildi.<\/p>\n<p>O d\u00f6nemde Python i\u00e7in tip ipucu (type hint) verme sistemlerinin standartla\u015ft\u0131r\u0131lmas\u0131 fikri havada dola\u015f\u0131yordu. Daha \u00f6nce de belirtti\u011fim gibi, Python 3.0 ile birlikte i\u015flevler i\u00e7in tip notlar\u0131 kullan\u0131labiliyordu, ancak bu yaln\u0131zca keyfi ifadelerdi, belirli bir s\u00f6zdizimi ve anlam\u0131 yoktu. Program \u00e7al\u0131\u015f\u0131rken, bu notlar \u00e7o\u011funlukla sadece g\u00f6z ard\u0131 ediliyordu. Hack Week'ten sonra, anlamlar\u0131n standartla\u015ft\u0131r\u0131lmas\u0131 \u00fczerine \u00e7al\u0131\u015fmaya ba\u015flad\u0131k. Bu \u00e7al\u0131\u015fma, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/dev\/peps\/pep-0484\/\">PEP 484<\/a><\/noindex> \u00fczerinde Guido van Rossum, \u0141ukasz Langa ve benim birlikte \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z bir belgedir.<\/p>\n<p>Motivasyonlar\u0131m\u0131z iki a\u00e7\u0131dan de\u011ferlendirilebilirdi. \u0130lk olarak, t\u00fcm Python ekosisteminin tip ipu\u00e7lar\u0131n\u0131 kullanma konusunda ortak bir yakla\u015f\u0131m benimsemesini umuyorduk (tip ipu\u00e7lar\u0131 \u2014 Python'da \u00abtip notlar\u0131\u00bb terimi i\u00e7in kullan\u0131lan kar\u015f\u0131l\u0131k). Bu, olas\u0131 riskler g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, bir \u00e7ok birbiriyle uyumsuz yakla\u015f\u0131m kullanmaktan daha iyi olurdu. \u0130kinci olarak, Python toplulu\u011funun bir\u00e7ok temsilcisiyle tip notlar\u0131 mekanizmas\u0131n\u0131 a\u00e7\u0131k\u00e7a tart\u0131\u015fmak istedik. K\u0131smen, bu arzunun nedeni, geni\u015f kitleler aras\u0131nda Python dilinin temel d\u00fc\u015f\u00fcncelerinden<\/p>\n<p>uzakla\u015fanlar gibi g\u00f6z\u00fckmek istemememizdi. Bu, \u00ab\u00f6rdek tipi\u00bb olarak bilinen dinamik olarak tiplenmi\u015f bir dildir. Toplumda, ba\u015flang\u0131\u00e7ta, statik tiplenme fikrine kar\u015f\u0131 birka\u00e7 \u015f\u00fcpheci tutum olu\u015fmaktan ka\u00e7\u0131n\u0131lmad\u0131. Ancak bu tutum sonunda zay\u0131flad\u0131 \u2014 statik tiplenmenin zorunlu hale gelmeyece\u011fi belli olduktan sonra (ve insanlar\u0131n ger\u00e7ekten faydal\u0131 oldu\u011funu anlamas\u0131yla) bu inan\u00e7 de\u011fi\u015fti.<\/p>\n<h2>G\u00f6sterimlerin sonunda kabul edilen tip ipu\u00e7lar\u0131n\u0131n s\u00f6zdizimi, o d\u00f6nemde mypy'nin destekledi\u011fi s\u00f6zdizime \u00e7ok benziyordu. PEP 484 belgesi, Python 3.5 ile 2015 y\u0131l\u0131nda piyasaya s\u00fcr\u00fcld\u00fc. Python art\u0131k sadece dinamik tiplenmeyi destekleyen bir dil de\u011fildi. Bu olay\u0131 Python tarihindeki \u00f6nemli bir d\u00f6n\u00fcm noktas\u0131 olarak d\u00fc\u015f\u00fcnmekten ho\u015flan\u0131yorum.<\/h2>\n<p>\n2015-ci ilin sonunda Dropbox-da mypy \u00fcz\u0259rind\u0259 i\u015fl\u0259m\u0259k \u00fc\u00e7\u00fcn \u00fc\u00e7 n\u0259f\u0259rd\u0259n ibar\u0259t bir komanda yarad\u0131ld\u0131. Bu komandaya Guido van Rossum, Greg Price v\u0259 David Fisher daxil idi. O andan etibar\u0259n v\u0259ziyy\u0259t s\u00fcr\u0259tl\u0259 inki\u015faf etm\u0259y\u0259 ba\u015flad\u0131. Mypy-nin b\u00f6y\u00fcm\u0259si yolunda ilk mane\u0259 performans oldu. Yuxar\u0131da da qeyd etdiyim kimi, layih\u0259nin ba\u015flan\u011f\u0131c d\u00f6vr\u00fcnd\u0259 mypy-nin realla\u015fmas\u0131n\u0131 C dilin\u0259 ke\u00e7irm\u0259k bar\u0259d\u0259 d\u00fc\u015f\u00fcn\u00fcrd\u00fcm, amma bu fikir h\u0259l\u0259lik siyah\u0131dan \u00e7\u0131xar\u0131ld\u0131. Biz mypy \u00fc\u00e7\u00fcn CPython interpretatorunun istifad\u0259 olunmas\u0131 il\u0259 \u0259laq\u0259li qald\u0131q, bu da mypy kimi al\u0259tl\u0259r \u00fc\u00e7\u00fcn kifay\u0259t q\u0259d\u0259r s\u00fcr\u0259tli deyil. (PyPy layih\u0259si, JIT t\u0259rtib\u00e7isi il\u0259 alternativ Python realla\u015fmas\u0131, biz\u0259 d\u0259 k\u00f6m\u0259k etm\u0259di.)<\/p>\n<p>Xo\u015fb\u0259xtlikd\u0259n, burada b\u0259zi alqoritmik t\u0259kmill\u0259\u015fdirm\u0259l\u0259r k\u00f6m\u0259yimiz\u0259 \u00e7atd\u0131. \u0130lk g\u00fccl\u00fc \"s\u00fcr\u0259tl\u0259ndirici\" inkremental yoxlaman\u0131n realla\u015fmas\u0131 oldu. Bu t\u0259kmill\u0259\u015fdirm\u0259nin ideyas\u0131 sad\u0259 idi: \u0259g\u0259r modulumuzun b\u00fct\u00fcn as\u0131l\u0131l\u0131qlar\u0131 \u0259vv\u0259lki mypy i\u015find\u0259n b\u0259ri d\u0259yi\u015fm\u0259yibs\u0259, o zaman as\u0131l\u0131l\u0131qlar \u00fcz\u0259rind\u0259 i\u015fl\u0259diyimiz zaman, \u0259vv\u0259llki i\u015f sessiyas\u0131nda k\u0259silmi\u015f m\u0259lumatlar\u0131 istifad\u0259 ed\u0259 bil\u0259rik. Yaln\u0131z d\u0259yi\u015fdirilmi\u015f fayllardak\u0131 tip yoxlamalar\u0131n\u0131 h\u0259yata ke\u00e7irm\u0259liydik v\u0259 onlara as\u0131l\u0131 olan fayllarda. Mypy daha da ir\u0259lil\u0259y\u0259r\u0259k: \u0259g\u0259r modulumuzun xarici interfeysi d\u0259yi\u015fm\u0259yibs\u0259 \u2013 mypy bu modulu idxal ed\u0259n dig\u0259r modullar\u0131 yenid\u0259n yoxlamaq laz\u0131m olmad\u0131\u011f\u0131n\u0131 hesab edirdi.<\/p>\n<p>\u0130ncremental yoxlama, m\u00f6vcud kodun b\u00f6y\u00fck h\u0259cmli annotasiyas\u0131n\u0131 h\u0259yata ke\u00e7irm\u0259k \u00fc\u00e7\u00fcn biz\u0259 \u00e7ox k\u00f6m\u0259k etdi. M\u0259s\u0259l\u0259 buras\u0131ndad\u0131r ki, bu proses ad\u0259t\u0259n mypy-ni bir \u00e7ox iterativ i\u015fl\u0259rl\u0259 \u0259hat\u0259 edir, \u00e7\u00fcnki annotasiyalar kodu t\u0259dric\u0259n \u0259lav\u0259 edilir v\u0259 t\u0259dric\u0259n yax\u015f\u0131la\u015fd\u0131r\u0131l\u0131r. \u0130lk mypy i\u015finin h\u0259l\u0259 d\u0259 \u00e7ox yava\u015f olmas\u0131, onun yerin\u0259 yetirilm\u0259si zaman\u0131 bir \u00e7ox as\u0131l\u0131l\u0131\u011f\u0131n yoxlanmas\u0131n\u0131 t\u0259l\u0259b etm\u0259sidir. Bu v\u0259ziyy\u0259ti yax\u015f\u0131la\u015fd\u0131rmaq \u00fc\u00e7\u00fcn biz uzaqdan k\u0259\u015ff edici mexanizmini h\u0259yata ke\u00e7irdik. \u018fg\u0259r mypy yerli k\u0259\u015ffi k\u00f6hn\u0259lmi\u015f hesab edirs\u0259, o, b\u00fct\u00fcn kod bazas\u0131 \u00fc\u00e7\u00fcn m\u0259rk\u0259zl\u0259\u015fdirilmi\u015f repozitoriyadan k\u0259\u015ff g\u00f6r\u00fcn\u00fc\u015f\u00fcn\u00fc y\u00fckl\u0259yir. Sonra bu g\u00f6r\u00fcn\u00fc\u015fd\u0259n istifad\u0259 ed\u0259r\u0259k inkremental yoxlama h\u0259yata ke\u00e7irir. Bu, mypy-nin performans\u0131n\u0131 art\u0131rmaq yolunda bizi bir add\u0131m ir\u0259lil\u0259dib.<\/p>\n<p>Bu, Dropbox-da tip yoxlama sisteminin s\u00fcr\u0259tli v\u0259 t\u0259bii \u015f\u0259kild\u0259 t\u0259tbiq olundu\u011fu bir d\u00f6vr idi. 2016-c\u0131 ilin sonunda, bizd\u0259 art\u0131q t\u0259xmin\u0259n 420000 Python kod s\u0259tiri var idi ki, bunlar da tip annotasiyalar\u0131 il\u0259 t\u0259min edilmi\u015fdi. Bir \u00e7ox istifad\u0259\u00e7i tip yoxlamas\u0131na b\u00f6y\u00fck h\u0259v\u0259s g\u00f6st\u0259rdi. Dropbox-da mypy istifad\u0259 ed\u0259n inki\u015faf komandalar\u0131n\u0131n say\u0131 artd\u0131.<\/p>\n<p>H\u0259r \u015fey o vaxt yax\u015f\u0131 g\u00f6r\u00fcn\u00fcrd\u00fc, amma h\u0259l\u0259 \u00e7ox i\u015fimiz qalm\u0131\u015fd\u0131. Problemli sah\u0259l\u0259ri m\u00fc\u0259yy\u0259n etm\u0259k v\u0259 hans\u0131 suallar\u0131n ilk n\u00f6vb\u0259d\u0259 h\u0259ll edilm\u0259li oldu\u011funu anlamaq \u00fc\u00e7\u00fcn m\u00fct\u0259madi istifad\u0259\u00e7i sor\u011fular\u0131 ke\u00e7irm\u0259y\u0259 ba\u015flad\u0131q (bu praktika \u015firk\u0259td\u0259 indiy\u0259 q\u0259d\u0259r istifad\u0259 olunur). Ayd\u0131n oldu ki, \u0259n vacib iki problem var idi. Birincisi, kodun daha \u00e7ox tip \u00f6rt\u00fcy\u00fcn\u0259 ehtiyac var idi, ikincisi is\u0259 mypy-n\u0131n daha s\u00fcr\u0259tli i\u015fl\u0259m\u0259si laz\u0131m idi. mypy-n\u0131 s\u00fcr\u0259tl\u0259ndirm\u0259k v\u0259 onu \u015firk\u0259tin layih\u0259l\u0259rin\u0259 yerl\u0259\u015fdirm\u0259k istiqam\u0259tind\u0259ki i\u015fimizin h\u0259l\u0259 d\u0259 tamamlanmad\u0131\u011f\u0131 tamamil\u0259 ayd\u0131n idi. Bu iki problemin \u0259h\u0259miyy\u0259tini tamamlaya bildiyimizd\u0259n, onlar\u0131n h\u0259llin\u0259 ba\u015flad\u0131q.<\/p>\n<h2>Daha \u00e7ox performans!<\/h2>\n<p>\n\u0130ncremental yoxlamalar mypy-ni s\u00fcr\u0259tl\u0259ndirdi, amma bu al\u0259t h\u0259l\u0259 d\u0259 kifay\u0259t q\u0259d\u0259r s\u00fcr\u0259tli deyil. \u00c7ox sayda ikincremental yoxlama t\u0259xmin\u0259n bir d\u0259qiq\u0259 s\u00fcrd\u00fc. Bunun s\u0259b\u0259bi ilkin d\u00f6vriliyidir. Bu, Python-da yaz\u0131lm\u0131\u015f b\u00f6y\u00fck kod bazalar\u0131 il\u0259 i\u015fl\u0259m\u0259yi t\u0259cr\u00fcb\u0259si olanlar\u0131 t\u0259\u0259cc\u00fcbl\u0259ndirmir. Bizd\u0259 y\u00fczl\u0259rl\u0259 moduldan ibar\u0259t d\u0259stl\u0259r var idi ki, h\u0259r biri dig\u0259r b\u00fct\u00fcn modullar\u0131 dolay\u0131 yolla idxal edirdi. \u0130xrac edil\u0259n h\u0259r hans\u0131 bir fayl d\u00f6vr\u00fc importlarla d\u0259yi\u015fdirs\u0259, mypy bu d\u00f6vr\u0259 daxil olan b\u00fct\u00fcn fayllar\u0131 i\u015fl\u0259tm\u0259li olurdu, tez-tez is\u0259 bu d\u00f6vr\u0259d\u0259ki modullar\u0131 idxal ed\u0259n dig\u0259r modullar\u0131 da. Bel\u0259 bir d\u00f6vr, Dropbox-da bir \u00e7ox narahatl\u0131\u011fa s\u0259b\u0259b olan m\u0259\u015fhur<\/p>\n<p>\u00c7evrili as\u0131l\u0131l\u0131qlar\u0131 \"\u00e7\u00f6z\u00fcml\u0259m\u0259yi\" d\u00fc\u015f\u00fcnd\u00fck, amma bunu etm\u0259k \u00fc\u00e7\u00fcn resurslar\u0131m\u0131z yox idi. Tan\u0131\u015f olmad\u0131\u011f\u0131m\u0131z \u00e7ox kod var idi. N\u0259tic\u0259d\u0259 alternativ bir yana\u015fmaya ke\u00e7dik. Mypy-n\u0131n \"as\u0131l\u0131l\u0131q topalar\u0131\" olan hallarda bel\u0259 s\u00fcr\u0259tl\u0259 i\u015fl\u0259m\u0259sini t\u0259min etm\u0259y\u0259 q\u0259rar verdik. Bu m\u0259qs\u0259d\u0259 mypy demonunu t\u0259tbiq ed\u0259r\u0259k nail olduq. Demon, iki maraql\u0131 funksiyan\u0131 icra ed\u0259n server prosesi. Birincisi, o, b\u00fct\u00fcn kod bazas\u0131 haqq\u0131nda m\u0259lumat\u0131 yadda saxlay\u0131r. Bu, h\u0259r mypy i\u015f\u0259 sal\u0131nd\u0131qda, minl\u0259rl\u0259 idxal olunan as\u0131l\u0131l\u0131qlara aid g\u00f6zl\u0259nil\u0259n m\u0259lumatlar\u0131 y\u00fckl\u0259m\u0259m\u0259yi t\u0259min edir. \u0130kincisi, o, funksiyalar v\u0259 dig\u0259r varl\u0131qlar aras\u0131nda as\u0131l\u0131l\u0131qlar\u0131 diqq\u0259tl\u0259, inc\u0259 struktural s\u0259viyy\u0259sind\u0259 analiz edir. M\u0259s\u0259l\u0259n, \u0259g\u0259r funksiya <code>foo<\/code> funksiyan\u0131 \u00e7a\u011f\u0131r\u0131rsa <code>bar<\/code>\", o zaman as\u0131l\u0131l\u0131q var. <code>foo<\/code> ayl\u0131q <code>bar<\/code>. Fayl d\u0259yi\u015f\u0259nd\u0259 \u2014 demon \u0259vv\u0259lc\u0259, izolyasiyada, yaln\u0131z d\u0259yi\u015f\u0259n fayl\u0131 emal edir. Sonra o, bu fayl\u0131n xaricd\u0259n g\u00f6r\u00fcn\u0259n d\u0259yi\u015fiklikl\u0259rin\u0259, d\u0259yi\u015f\u0259n funksiya imzalar\u0131na bax\u0131r. Demon, yaln\u0131z d\u0259yi\u015fdirilmi\u015f funksiyan\u0131 h\u0259qiq\u0259t\u0259n istifad\u0259 ed\u0259n funksiyalar\u0131 yoxlamaq \u00fc\u00e7\u00fcn idxallara dair \u0259trafl\u0131 m\u0259lumatdan istifad\u0259 edir. Bu yana\u015fma il\u0259 ad\u0259t\u0259n yaln\u0131z bir ne\u00e7\u0259 funksiyan\u0131 yoxlamaq laz\u0131m g\u0259lir.<\/p>\n<p>B\u00fct\u00fcn bunlar\u0131n h\u0259yata ke\u00e7irilm\u0259si asan olmad\u0131, \u00e7\u00fcnki mypy-nin ilkin versiyas\u0131 bir vaxtda bir fayl \u00fcz\u0259rind\u0259 i\u015fl\u0259m\u0259y\u0259 \u00e7ox meyl edirdi. Biz \u00e7oxsayl\u0131 h\u0259dd v\u0259ziyy\u0259tl\u0259ri il\u0259 \u00fczl\u0259\u015fm\u0259li olduq ki, bunlar kodda bir \u015fey d\u0259yi\u015f\u0259nd\u0259 yenid\u0259n yoxlan\u0131lma t\u0259l\u0259b edirdi. M\u0259s\u0259l\u0259n, bu, bir sinf\u0259 yeni bir \u0259sas sinif t\u0259yin edildikd\u0259 ba\u015f verir. \u0130st\u0259diyimiz i\u015fi bitirdikd\u0259n sonra, \u0259ks\u0259r inkremental yoxlamalar\u0131n icra m\u00fcdd\u0259tini bir ne\u00e7\u0259 saniy\u0259y\u0259 endirm\u0259y\u0259 m\u00fcv\u0259ff\u0259q olduq. Bu, bizim \u00fc\u00e7\u00fcn b\u00f6y\u00fck bir q\u0259l\u0259b\u0259 idi.<\/p>\n<h2>Daha \u00e7ox m\u0259hsuldarl\u0131q!<\/h2>\n<p>\nYuxar\u0131da dan\u0131\u015fd\u0131\u011f\u0131m uzaqdan ke\u015fl\u0259m\u0259 il\u0259 birlikd\u0259, mypy demonu, proqram\u00e7\u0131n\u0131n tez-tez n\u00f6v yoxlamas\u0131n\u0131 ki\u00e7ik fayllarda d\u0259yi\u015fiklik ed\u0259rk\u0259n ba\u015flad\u0131\u011f\u0131 zaman yaranan probleml\u0259ri dem\u0259k olar ki, tamamil\u0259 h\u0259ll etdi. Lakin sistemin yoxsul variantda istifad\u0259si zaman\u0131 m\u0259hsuldarl\u0131\u011f\u0131 h\u0259l\u0259 d\u0259 optimaldan \u00e7ox uzaq idi. mypy-nin tam ba\u015flay\u0131\u015f\u0131 15 d\u0259qiq\u0259d\u0259n \u00e7ox apara bil\u0259rdi. Bu, bizi qane ed\u0259c\u0259kd\u0259n \u00e7ox idi. H h\u0259r h\u0259ft\u0259 v\u0259ziyy\u0259t daha da pisl\u0259\u015firdi, \u00e7\u00fcnki proqram\u00e7\u0131lar yeni kod yazma\u011fa v\u0259 m\u00f6vcud koda annotasiyalar \u0259lav\u0259 etm\u0259y\u0259 davam edirdil\u0259r. \u0130stifad\u0259\u00e7il\u0259rimiz daha \u00e7ox m\u0259hsuldarl\u0131q t\u0259l\u0259b edirdil\u0259r, biz d\u0259 m\u0259mnuniyy\u0259tl\u0259 onlara k\u00f6m\u0259k etm\u0259y\u0259 haz\u0131r idik.<\/p>\n<p>Biz mypy il\u0259 ba\u011fl\u0131 \u0259vv\u0259lki fikirl\u0259rd\u0259n birin\u0259 qay\u0131tma\u011f\u0131 q\u0259rara ald\u0131q. Y\u0259ni, Python kodunu C koduna \u00e7evirm\u0259k. Cython il\u0259 apard\u0131\u011f\u0131m\u0131z eksperimentl\u0259r (bu, Python-da yaz\u0131lm\u0131\u015f kodu C koduna \u00e7evirm\u0259y\u0259 imkan ver\u0259n bir sistemdir) biz\u0259 g\u00f6r\u00fcn\u0259n bir s\u00fcr\u0259t art\u0131m\u0131 verm\u0259di, buna g\u00f6r\u0259 d\u0259 \u00f6z kompilatorumuzu yaratma\u011f\u0131 yenid\u0259n d\u00fc\u015f\u00fcnm\u0259y\u0259 ba\u015flad\u0131q. Mypy-nin kod bazas\u0131 (Python-da yaz\u0131lm\u0131\u015f) art\u0131q b\u00fct\u00fcn laz\u0131m olan tip annotasiyalar\u0131n\u0131 \u00f6z\u00fcnd\u0259 birl\u0259\u015fdirirdi, buna g\u00f6r\u0259 d\u0259 bu annotasiyalardan istifad\u0259 ed\u0259r\u0259k sistemin i\u015fini s\u00fcr\u0259tl\u0259ndirm\u0259k \u00fc\u00e7\u00fcn bir c\u0259hd etm\u0259y\u0259 d\u0259y\u0259c\u0259yini d\u00fc\u015f\u00fcnd\u00fck. Bu fikri yoxlamaq \u00fc\u00e7\u00fcn tez bir prototip yaratd\u0131m. Bu prototip m\u00fcxt\u0259lif mikro-benchmarklarda 10 qat daha y\u00fcks\u0259k performans g\u00f6st\u0259rdi. Bizim fikrimiz Python modullar\u0131n\u0131 C moduluna Cython vasit\u0259sil\u0259 kompilyasiya etm\u0259k v\u0259 tip annotasiyalar\u0131n\u0131 proqram\u0131n icras\u0131 zaman\u0131 h\u0259yata ke\u00e7iril\u0259c\u0259k tip yoxlamalar\u0131na \u00e7evirm\u0259k idi (tip annotasiyalar\u0131 ad\u0259t\u0259n proqram icras\u0131 zaman\u0131 n\u0259z\u0259r\u0259 al\u0131nm\u0131r v\u0259 yaln\u0131z tip yoxlama sisteml\u0259ri t\u0259r\u0259find\u0259n istifad\u0259 olunur). \u018fslind\u0259, mypy-nin implementasiyas\u0131n\u0131 Python-dan statik tipli bir dil\u0259 k\u00f6\u00e7\u00fcrm\u0259yi planla\u015fd\u0131r\u0131rd\u0131q ki, bu da Python-un \u00f6z\u00fcn\u0259 b\u0259nz\u0259y\u0259c\u0259k (v\u0259 b\u00f6y\u00fck \u00f6l\u00e7\u00fcd\u0259 \u00e7al\u0131\u015facaq). (Bu c\u00fcr dilaras\u0131 k\u00f6\u00e7\u00fcrm\u0259 mypy layih\u0259si \u00fc\u00e7\u00fcn bir \u0259n\u0259n\u0259y\u0259 \u00e7evrilmi\u015fdir. Mypy-nin ilkin implementasiyas\u0131 Alore-da yaz\u0131lm\u0131\u015fd\u0131r, sonra is\u0259 Java v\u0259 Python-un sintaksis hibridi meydana g\u0259lmi\u015fdir.)<\/p>\n<p>CPython geni\u015fl\u0259nm\u0259l\u0259rinin API-y\u0259 y\u00f6n\u0259lm\u0259k layih\u0259 idar\u0259etm\u0259 imkanlar\u0131n\u0131 itirm\u0259m\u0259k \u00fc\u00e7\u00fcn a\u00e7ar idi. Mypy-y\u0259 laz\u0131m olan virtual ma\u015f\u0131n v\u0259 ya h\u0259r hans\u0131 kitabxanalar\u0131 h\u0259yata ke\u00e7irm\u0259k laz\u0131m deyildi. \u00dcst\u0259g\u0259l, Python ekosisteminin b\u00fct\u00fcn imkanlar\u0131 biz\u0259 h\u0259l\u0259 d\u0259 t\u0259qdim olunacaq, b\u00fct\u00fcn al\u0259tl\u0259r (m\u0259s\u0259l\u0259n, pytest) \u0259l\u00e7atan olacaqd\u0131. Bu, inki\u015faf zaman\u0131 interpretasiya olunmu\u015f Python kodundan istifad\u0259 etm\u0259y\u0259 davam etm\u0259yimiz dem\u0259k idi, bu da kodu kompilyasiya etm\u0259y\u0259 g\u00f6zl\u0259m\u0259zd\u0259n \u00e7ox, kodda d\u00fcz\u0259li\u015fl\u0259r etm\u0259 v\u0259 test etm\u0259 s\u00fcr\u0259tli sxemini davam etdirm\u0259y\u0259 imkan verirdi. El\u0259 g\u00f6r\u00fcn\u00fcrd\u00fc ki, biz iki stulda bir yer\u0259 oturmaqda m\u00fck\u0259mm\u0259l m\u00fcv\u0259ff\u0259q oluruq v\u0259 bundan z\u00f6vq al\u0131rd\u0131q.<\/p>\n<p>Mypy adl\u0131 \u00f6n y\u00fcz\u00fc tip analizi i\u00e7in kullanan mypyc ad\u0131n\u0131 verdi\u011fimiz derleyici olduk\u00e7a ba\u015far\u0131l\u0131 bir proje oldu. Genel olarak, \u00f6nbellekleme olmadan mypy'nin s\u0131k ba\u015flatmalar\u0131nda yakla\u015f\u0131k d\u00f6rt kat h\u0131z art\u0131\u015f\u0131 sa\u011flad\u0131k. Mypy projesinin \u00e7ekirdek geli\u015ftirmesi, Michael Sullivan, Ivan Levkiwski, Hugh Han ve benim yer ald\u0131\u011f\u0131m k\u00fc\u00e7\u00fck bir ekip taraf\u0131ndan yakla\u015f\u0131k d\u00f6rt takvim ay\u0131 s\u00fcrd\u00fc. Bu i\u015f y\u00fck\u00fc, mypy'yi \u00f6rne\u011fin C++ veya Go'ya yeniden yazmak i\u00e7in gerekenlerden \u00e7ok daha az \u00f6l\u00e7ekliydi. Ayr\u0131ca, ba\u015fka bir dilde yeniden yazma durumunda yapmam\u0131z gereken de\u011fi\u015fikliklerden \u00e7ok daha az\u0131n\u0131 projeye eklemek zorunda kald\u0131k. Di\u011fer yandan, mypyc'yi Dropbox'taki di\u011fer geli\u015ftiricilerin kodlar\u0131n\u0131 derleyip h\u0131zland\u0131rmas\u0131 i\u00e7in kullanabilece\u011fi bir seviyeye getirmeyi umuyorduk.<\/p>\n<p>Bu seviyede bir performans elde etmek i\u00e7in baz\u0131 ilgin\u00e7 m\u00fchendislik \u00e7\u00f6z\u00fcmleri uygulamak zorunda kald\u0131k. Derleyici, h\u0131zl\u0131 d\u00fc\u015f\u00fck seviyeli C yap\u0131lar\u0131n\u0131n kullan\u0131m\u0131 sayesinde bir\u00e7ok i\u015flemi h\u0131zland\u0131rabiliyor. \u00d6rne\u011fin, derlenmi\u015f bir fonksiyon \u00e7a\u011fr\u0131s\u0131, C fonksiyonu \u00e7a\u011fr\u0131s\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcyor. Bu t\u00fcr bir \u00e7a\u011fr\u0131, yorumlanan bir fonksiyon \u00e7a\u011fr\u0131s\u0131ndan \u00e7ok daha h\u0131zl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftiriliyor. S\u00f6zl\u00fcklerdeki arama gibi baz\u0131 i\u015flemler, Cpython'dan normal C-API \u00e7a\u011fr\u0131lar\u0131 kullanmaya dayan\u0131yordu ve derleme sonras\u0131 sadece biraz daha h\u0131zl\u0131yd\u0131. Yorumlaman\u0131n yaratt\u0131\u011f\u0131 ek y\u00fckten kurtulmay\u0131 ba\u015fard\u0131k, ancak bu durumda yaln\u0131zca k\u00fc\u00e7\u00fck bir performans kazan\u0131m\u0131 sa\u011flad\u0131.<\/p>\n<p>En yayg\u0131n 'yava\u015f' i\u015flemleri belirlemek i\u00e7in kodu profilledik. Elde etti\u011fimiz verilerle, ya mypyc'yi bu i\u015flemler i\u00e7in daha h\u0131zl\u0131 C kodu \u00fcretecek \u015fekilde 'ayar yapt\u0131k', ya da ilgili Python kodunu daha h\u0131zl\u0131 i\u015flemlerle yeniden yazmaya \u00e7al\u0131\u015ft\u0131k (bazen basit bir \u00e7\u00f6z\u00fcm bulmakta yeterli olam\u0131yorduk). Python kodunu yeniden yazmak, derleyicide ayn\u0131 d\u00f6n\u00fc\u015f\u00fcm\u00fc otomatik olarak ger\u00e7ekle\u015ftirmekten genellikle daha kolay bir \u00e7\u00f6z\u00fcm oluyordu. Uzun vadede, bu d\u00f6n\u00fc\u015f\u00fcmlerin pek \u00e7o\u011funu otomatikle\u015ftirmek istiyorduk, ancak o anda mypy'yi en az \u00e7abayla h\u0131zland\u0131rmaya odaklanm\u0131\u015ft\u0131k. Bu hedefe ula\u015f\u0131rken birka\u00e7 k\u00f6\u015feden k\u0131sald\u0131k.<\/p>\n<p>Davam\u0131 g\u0259lir\u2026<\/p>\n<p><b>H\u00f6rm\u0259tli oxucular!<\/b> Mypy projesini \u00f6\u011frendi\u011finizde nas\u0131l bir izlenim b\u0131rakt\u0131?<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/vps_start\/\"><img decoding=\"async\" alt=\"Python kodunun 4 milyon sat\u0131r\u0131n\u0131n tiplerini kontrol etme yolu. B\u00f6l\u00fcm 2\" src=\"\/wp-content\/uploads\/2019\/09\/e3c1dd40228b56d0196fd65e4df22a59.jpeg\" 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=\"Python kodunun 4 milyon sat\u0131r\u0131n\u0131n tiplerini kontrol etme yolu. B\u00f6l\u00fcm 2\" src=\"\/wp-content\/uploads\/2019\/09\/263173dd3ab487da330ff9063e3c180e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>M\u0259nb\u0259: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468235\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432 Dropbox \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0442\u0438\u043f\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430. \u2192 \u0427\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 (PEP 484) \u041c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0441 mypy \u0432 Dropbox \u0432\u043e \u0432\u0440\u0435\u043c\u044f Hack Week 2014. Hack Week \u2014 \u044d\u0442\u043e \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u0435, \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c\u043e\u0435 Dropbox \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0438. \u0412 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28879,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38479","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.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432 Dropbox \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0442\u0438\u043f\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a 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\/az\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"az_AZ\" \/>\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 2 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432 Dropbox \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0442\u0438\u043f\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/az\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2\" \/>\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:23:56+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:23:56+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\udd474 milyon sat\u0131rl\u0131k Python kodunun tip kontrol\u00fcne giden yol. B\u00f6l\u00fcm 2 | ProHoster","description":"Bug\u00fcn Dropbox'ta birka\u00e7 milyon sat\u0131rl\u0131k Python kodunun tip kontrol\u00fcn\u00fc nas\u0131l organize etti\u011fimize dair materyalin ikinci b\u00f6l\u00fcm\u00fcn\u00fc yay\u0131ml\u0131yoruz.","canonical_url":"https:\/\/prohoster.info\/az\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"az_AZ","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 2 | ProHoster","og:description":"\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432 Dropbox \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0442\u0438\u043f\u043e\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a Python-\u043a\u043e\u0434\u0430.","og:url":"https:\/\/prohoster.info\/az\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2","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:23:56+00:00","article:modified_time":"2019-10-31T19:23:56+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38479","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:13:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:08:32","updated":"2026-08-11 12:50:31","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/posts\/38479","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/comments?post=38479"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/posts\/38479\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/media\/28879"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/media?parent=38479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/categories?post=38479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/tags?post=38479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}