{"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\/hu\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2","title":{"rendered":"\u00dat a 4 milli\u00f3 sor Python k\u00f3d t\u00edpusainak ellen\u0151rz\u00e9s\u00e9hez. 2. r\u00e9sz","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ma k\u00f6zz\u00e9tessz\u00fck a Dropbox-ban a Python-k\u00f3d t\u00f6bb milli\u00f3 sor\u00e1nak t\u00edpuskontrollj\u00e1r\u00f3l sz\u00f3l\u00f3 anyag ford\u00edt\u00e1s\u00e1nak m\u00e1sodik r\u00e9sz\u00e9t.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468235\/\"><img decoding=\"async\" alt=\"\u00dat a 4 milli\u00f3 sor Python k\u00f3d t\u00edpusainak ellen\u0151rz\u00e9s\u00e9hez. 2. r\u00e9sz\" 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\/\">Els\u0151 r\u00e9sz olvas\u00e1sa<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Hivatalos t\u00edpus t\u00e1mogat\u00e1s (PEP 484)<\/h2>\n<p>\n2014 Hack Week sor\u00e1n v\u00e9gezt\u00fck el az els\u0151 komoly k\u00eds\u00e9rleteinket a mypy-val a Dropbox-ban. A Hack Week egy esem\u00e9ny, amelyet a Dropbox sz\u00e1m\u00e1ra szerveznek egy h\u00e9ten kereszt\u00fcl, amikor az alkalmazottak b\u00e1rmin dolgozhatnak! A Dropbox legnevesebb technol\u00f3giai projektjei k\u00f6z\u00fcl sok \u00e9ppen ezeken a rendezv\u00e9nyeken indult. E k\u00eds\u00e9rlet eredm\u00e9nyek\u00e9nt arra a k\u00f6vetkeztet\u00e9sre jutottunk, hogy a mypy \u00edg\u00e9retesnek t\u0171nik, b\u00e1r ez a projekt m\u00e9g nem volt k\u00e9sz a sz\u00e9lesk\u00f6r\u0171 haszn\u00e1latra.<\/p>\n<p>Akkoriban a t\u00edpusokkal kapcsolatos javaslatok standardiz\u00e1l\u00e1s\u00e1nak \u00f6tlete volt a leveg\u0151ben. Ahogy m\u00e1r eml\u00edtettem, a Python 3.0-t\u00f3l lehetett haszn\u00e1lni a t\u00edpus-annot\u00e1ci\u00f3kat a funkci\u00f3khoz, de ezek csup\u00e1n tetsz\u0151leges kifejez\u00e9sek voltak, meghat\u00e1rozott szintaxis \u00e9s szemantika n\u00e9lk\u00fcl. A program v\u00e9grehajt\u00e1sa sor\u00e1n ezeket az annot\u00e1ci\u00f3kat nagyr\u00e9szt figyelmen k\u00edv\u00fcl hagyt\u00e1k. A Hack Week ut\u00e1n elkezdt\u00fcnk a szemantika standardiz\u00e1l\u00e1s\u00e1n dolgozni. Ez a munka a k\u00f6vetkez\u0151h\u00f6z vezetett: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.python.org\/dev\/peps\/pep-0484\/\">PEP 484<\/a><\/noindex> (ez a dokumentum Guido van Rossum, Luk\u00e1s Langa \u00e9s az \u00e9n k\u00f6zrem\u0171k\u00f6d\u00e9semmel k\u00e9sz\u00fclt).<\/p>\n<p>Mot\u00edvumainkat k\u00e9t szempontb\u00f3l lehetett vizsg\u00e1lni. El\u0151sz\u00f6r is, rem\u00e9lt\u00fck, hogy a Python \u00f6kosziszt\u00e9m\u00e1ja mag\u00e1\u00e9v\u00e1 teheti a t\u00edpusokkal kapcsolatos javaslatok (type hints \u2014 a Pythonban \u201et\u00edpus-annot\u00e1ci\u00f3k\u201d anal\u00f3gi\u00e1jak\u00e9nt haszn\u00e1lt kifejez\u00e9s) k\u00f6z\u00f6s megk\u00f6zel\u00edt\u00e9s\u00e9t. Ez a lehets\u00e9ges kock\u00e1zatokat figyelembe v\u00e9ve jobbnak t\u0171nt, mint sok k\u00f6lcs\u00f6n\u00f6sen inkompatibilis megk\u00f6zel\u00edt\u00e9s alkalmaz\u00e1sa. M\u00e1sodsorban szeretn\u00e9nk ny\u00edltan megvitatni a t\u00edpusok annot\u00e1l\u00e1s\u00e1nak mechanizmusait a Python k\u00f6z\u00f6ss\u00e9g sok k\u00e9pvisel\u0151j\u00e9vel. R\u00e9szben ezt a v\u00e1gyat az indokolta, hogy nem akartunk a Python programoz\u00f3k sz\u00e9les k\u00f6r\u00e9ben \u201el\u00e1zad\u00f3k\u00e9nt\u201d megjelenni. Ez egy dinamikusan t\u00edpusozott nyelv, amelyet \u201ekacsa t\u00edpiz\u00e1l\u00e1snak\u201d ismernek. A k\u00f6z\u00f6ss\u00e9gben kezdetben nem lehetett megker\u00fclni a statikus t\u00edpusok \u00f6tlet\u00e9vel szembeni n\u00e9mi gyanakv\u00e1st. De ez a hozz\u00e1\u00e1ll\u00e1s v\u00e9g\u00fcl enyh\u00fclt \u2014 miut\u00e1n vil\u00e1goss\u00e1 v\u00e1lt, hogy a statikus t\u00edpusok k\u00f6telez\u0151v\u00e9 t\u00e9tele nem v\u00e1rhat\u00f3 (\u00e9s miut\u00e1n az emberek meg\u00e9rtett\u00e9k, hogy val\u00f3ban hasznosak).<\/p>\n<p>A v\u00e9glegesen elfogadott t\u00edpusokkal kapcsolatos javaslat szintaxisa nagyon hasonl\u00f3 volt ahhoz, amit a mypy abban az id\u0151ben t\u00e1mogatott. A PEP 484 dokumentum 2015-ben, a Python 3.5-tel egy\u00fctt jelent meg. A Python m\u00e1r nem csup\u00e1n dinamikus t\u00edpusk\u00e9nt m\u0171k\u00f6d\u0151 nyelv volt. \u00dagy gondolom, hogy ez az esem\u00e9ny jelent\u0151s m\u00e9rf\u00f6ldk\u0151 a Python t\u00f6rt\u00e9net\u00e9ben.<\/p>\n<h2>A migr\u00e1ci\u00f3 kezdete<\/h2>\n<p>\n2015 v\u00e9g\u00e9n a Dropboxn\u00e1l, a mypy fejleszt\u00e9s\u00e9re h\u00e1rom f\u0151s csapatot alak\u00edtottak. Tagjai voltak Guido van Rossum, Greg Price \u00e9s David Fisher. Ekkort\u00f3l kezdve a helyzet rendk\u00edv\u00fcl gyorsan fejl\u0151d\u00f6tt. Az els\u0151 akad\u00e1ly a mypy n\u00f6veked\u00e9se el\u0151tt a teljes\u00edtm\u00e9ny volt. Ahogy azt kor\u00e1bban jeleztem, a projekt korai fejleszt\u00e9se sor\u00e1n azon t\u0171n\u0151dtem, hogy a mypy megval\u00f3s\u00edt\u00e1s\u00e1t C nyelvre kellene \u00e1t\u00edrni, de ezt az \u00f6tletet egyel\u0151re elvetett\u00fck. Az a t\u00e9ny, hogy a rendszer futtat\u00e1s\u00e1hoz a CPython interpretert haszn\u00e1ltuk, nem volt el\u00e9g gyors a mypy-hoz hasonl\u00f3 eszk\u00f6z\u00f6k sz\u00e1m\u00e1ra. (A PyPy projekt, egy JIT-kompil\u00e1torral rendelkez\u0151 alternat\u00edv Python megval\u00f3s\u00edt\u00e1s, szint\u00e9n nem seg\u00edtett.)<\/p>\n<p>Szerencs\u00e9re itt egy sor algoritmikus fejleszt\u00e9s seg\u00edtett nek\u00fcnk. Az els\u0151 komoly \"gyors\u00edt\u00f3\" az inkrement\u00e1lis ellen\u0151rz\u00e9s megval\u00f3s\u00edt\u00e1sa volt. E fejleszt\u00e9s \u00f6tlete egyszer\u0171 volt: ha a mypy legut\u00f3bbi fut\u00e1sa \u00f3ta a modul \u00f6sszes f\u00fcgg\u0151s\u00e9ge nem v\u00e1ltozott, akkor a f\u00fcgg\u0151s\u00e9gek kezel\u00e9se sor\u00e1n a legutols\u00f3 munkamenet sor\u00e1n t\u00e1rolt gyors\u00edt\u00f3t\u00e1razott adatokat haszn\u00e1lhatjuk. Csak a m\u00f3dos\u00edtott f\u00e1jlok \u00e9s a t\u0151l\u00fck f\u00fcgg\u0151 f\u00e1jlok t\u00edpusellen\u0151rz\u00e9s\u00e9t kellett elv\u00e9gezni. A mypy m\u00e9g egy l\u00e9p\u00e9ssel tov\u00e1bb ment: ha a modul k\u00fcls\u0151 interf\u00e9sze nem v\u00e1ltozott, a mypy \u00fagy v\u00e9lte, hogy az ezt a modult import\u00e1l\u00f3 m\u00e1s modulokat nem sz\u00fcks\u00e9ges \u00fajb\u00f3l ellen\u0151rizni.<\/p>\n<p>Az inkrement\u00e1lis ellen\u0151rz\u00e9s jelent\u0151sen seg\u00edtett nek\u00fcnk a megl\u00e9v\u0151 k\u00f3d nagy mennyis\u00e9g\u0171 annot\u00e1l\u00e1s\u00e1ban. A helyzet az, hogy ez a folyamat \u00e1ltal\u00e1ban sz\u00e1mos iterat\u00edv mypy futtat\u00e1st ig\u00e9nyel, mivel az annot\u00e1ci\u00f3k fokozatosan ker\u00fclnek be a k\u00f3dba, \u00e9s fokozatosan jav\u00edtj\u00e1k azt. Az els\u0151 mypy futtat\u00e1s m\u00e9g mindig nagyon lass\u00fa volt, mivel rengeteg f\u00fcgg\u0151s\u00e9get kellett ellen\u0151rizni. Ez\u00e9rt, a helyzet jav\u00edt\u00e1sa \u00e9rdek\u00e9ben, megval\u00f3s\u00edtottuk a t\u00e1voli gyors\u00edt\u00f3t\u00e1raz\u00e1s mechanizmus\u00e1t. Ha a mypy \u00e9szleli, hogy a helyi gyors\u00edt\u00f3t\u00e1r val\u00f3sz\u00edn\u0171leg elavult, bet\u00f6lti a teljes k\u00f3dalap aktu\u00e1lis gyors\u00edt\u00f3t\u00e1r pillanatk\u00e9p\u00e9t egy k\u00f6zpontos\u00edtott t\u00e1rol\u00f3b\u00f3l. Ezut\u00e1n ezzel a pillanatk\u00e9ppel v\u00e9gzi az inkrement\u00e1lis ellen\u0151rz\u00e9st. Ez egy \u00fajabb jelent\u0151s l\u00e9p\u00e9st jelentett a mypy teljes\u00edtm\u00e9ny\u00e9nek n\u00f6vel\u00e9se fel\u00e9.<\/p>\n<p>Ez volt a t\u00edpusellen\u0151rz\u0151 rendszer gyors \u00e9s term\u00e9szetes bevezet\u00e9s\u00e9nek id\u0151szaka a Dropboxn\u00e1l. 2016 v\u00e9g\u00e9re k\u00f6r\u00fclbel\u00fcl 420 000 sor Python-k\u00f3dunk volt t\u00edpusannot\u00e1ci\u00f3kkal. Sok felhaszn\u00e1l\u00f3 lelkesen fogadta a t\u00edpuskontrollt. A Dropboxn\u00e1l a mypy-t egyre t\u00f6bb fejleszt\u0151csapat haszn\u00e1lta.<\/p>\n<p>Akkor minden j\u00f3l n\u00e9zett ki, de m\u00e9g sok tennival\u00f3 \u00e1llt el\u0151tt\u00fcnk. Szisztematikus bels\u0151 felm\u00e9r\u00e9seket kezdt\u00fcnk v\u00e9gezni a felhaszn\u00e1l\u00f3k k\u00f6r\u00e9ben, hogy felismerj\u00fck a projekt probl\u00e9m\u00e1it, \u00e9s meg\u00e9rts\u00fck, mely k\u00e9rd\u00e9seket kell els\u0151k\u00e9nt megoldani (ezt a gyakorlatot a c\u00e9g a mai napig alkalmazza). Kider\u00fclt, hogy a legfontosabb k\u00e9t feladat van. Az els\u0151 az, hogy t\u00f6bb k\u00f3dot kellene lefedni t\u00edpusokkal, a m\u00e1sodik pedig, hogy a mypy gyorsabban m\u0171k\u00f6dj\u00f6n. Teljesen vil\u00e1gos volt, hogy a mypy felgyors\u00edt\u00e1s\u00e1n \u00e9s a v\u00e1llalati projektekbe val\u00f3 bevezet\u00e9s\u00e9n v\u00e9gzett munk\u00e1nk messze nem volt befejez\u0151dve. Teljes m\u00e9rt\u00e9kben tudat\u00e1ban voltunk e k\u00e9t feladat fontoss\u00e1g\u00e1nak, \u00e9s nekil\u00e1ttunk a megold\u00e1suknak.<\/p>\n<h2>T\u00f6bb teljes\u00edtm\u00e9ny!<\/h2>\n<p>\nAz inkrement\u00e1lis ellen\u0151rz\u00e9sek felgyors\u00edtott\u00e1k a mypy-t, de ez az eszk\u00f6z m\u00e9g mindig nem volt el\u00e9g gyors. Sok inkrement\u00e1lis ellen\u0151rz\u00e9s k\u00f6r\u00fclbel\u00fcl egy percig tartott. Ennek oka a ciklikus importok voltak. Ez val\u00f3sz\u00edn\u0171leg nem meglep\u0151 annak, aki m\u00e1r dolgozott nagy Python k\u00f3dalapokkal. Sz\u00e1mos olyan modulpakett\u00fcnk volt, amelyek k\u00f6zvetve import\u00e1lt\u00e1k egym\u00e1st. Ha b\u00e1rmelyik f\u00e1jl a ciklusban megv\u00e1ltozott, a mypy-nak minden f\u00e1jlt \u00fajra kellett dolgoznia, ami ebbe a ciklusba tartozott, \u00e9s gyakran azokat a modulokat is, amelyek import\u00e1lt\u00e1k a modulokat ebb\u0151l a ciklusb\u00f3l. Az egyik ilyen ciklus a h\u00edrhedt \u201ef\u00fcgg\u0151s\u00e9gi csom\u00f3\u201d volt, amely sok kellemetlens\u00e9get okozott a Dropbox-n\u00e1l. Egyszer ez a strukt\u00fara t\u00f6bb sz\u00e1z modult tartalmazott, amelyet k\u00f6zvetlen\u00fcl vagy k\u00f6zvetve sok teszt haszn\u00e1lt, \u00e9s a termel\u00e9si k\u00f3dban is szerepelt.<\/p>\n<p>Megfontoltuk a ciklikus f\u00fcgg\u0151s\u00e9gek \u201ekibogoz\u00e1s\u00e1nak\u201d lehet\u0151s\u00e9g\u00e9t, de nem volt er\u0151forr\u00e1sunk arra, hogy ezt megtegy\u00fck. T\u00fal sok k\u00f3ddal \u00e1lltunk szemben, amelyet nem ismert\u00fcnk. V\u00e9g\u00fcl az alternat\u00edv megk\u00f6zel\u00edt\u00e9st v\u00e1lasztottuk. Azt d\u00f6nt\u00f6tt\u00fck el, hogy a mypy gyorsan m\u0171k\u00f6dj\u00f6n m\u00e9g akkor is, ha \u201ef\u00fcgg\u0151s\u00e9gi csom\u00f3k\u201d vannak. E c\u00e9l el\u00e9r\u00e9s\u00e9hez mypy d\u00e9mont haszn\u00e1ltunk. A d\u00e9mon egy h\u00e1tt\u00e9rfolyamat, amely k\u00e9t \u00e9rdekes lehet\u0151s\u00e9get val\u00f3s\u00edt meg. El\u0151sz\u00f6r is \u2013 az eg\u00e9sz k\u00f3dalapr\u00f3l az inform\u00e1ci\u00f3t a mem\u00f3ri\u00e1ban tartja. Ez azt jelenti, hogy a mypy minden ind\u00edt\u00e1sakor nem kell bet\u00f6lteni a t\u00f6bb ezer import\u00e1lt f\u00fcgg\u0151s\u00e9ghez tartoz\u00f3 cache-elt adatokat. M\u00e1sodszor \u2013 alaposan, a legkisebb struktur\u00e1lis egys\u00e9geken elemezve vizsg\u00e1lja a f\u00fcgg\u0151s\u00e9geket a funkci\u00f3k \u00e9s egy\u00e9b egys\u00e9gek k\u00f6z\u00f6tt. P\u00e9ld\u00e1ul ha egy funkci\u00f3 <code>foo<\/code> megkeresi a f\u00fcggv\u00e9nyt <code>bar<\/code>, akkor van egy f\u00fcgg\u0151s\u00e9g <code>foo<\/code> t\u00f3l <code>bar<\/code>. Amikor egy f\u00e1jl megv\u00e1ltozik \u2013 a d\u00e9mon el\u0151sz\u00f6r, izol\u00e1ltan, csak a megv\u00e1ltozott f\u00e1jlt dolgozza fel. Ezt k\u00f6vet\u0151en megvizsg\u00e1lja a f\u00e1jl e v\u00e1ltoz\u00e1sait, amely a k\u00fcls\u0151 f\u00e9lt\u0151l l\u00e1that\u00f3, p\u00e9ld\u00e1ul a megv\u00e1ltozott funkci\u00f3k al\u00e1\u00edr\u00e1sait. A d\u00e9mon a r\u00e9szletes importinform\u00e1ci\u00f3kat csak az olyan funkci\u00f3k \u00fajraellen\u0151rz\u00e9s\u00e9re haszn\u00e1lja, amelyek t\u00e9nylegesen haszn\u00e1lj\u00e1k a megv\u00e1ltozott funkci\u00f3t. \u00c1ltal\u00e1ban e megk\u00f6zel\u00edt\u00e9s mellett csup\u00e1n n\u00e9h\u00e1ny funkci\u00f3t kell ellen\u0151rizni.<\/p>\n<p>Mindez megval\u00f3s\u00edt\u00e1sa nem volt egyszer\u0171, mivel az eredeti mypy megval\u00f3s\u00edt\u00e1s nagyban a f\u00e1jlok egyik\u00e9nek feldolgoz\u00e1s\u00e1ra \u00f6sszpontos\u00edtott. Sz\u00e1mos hat\u00e1rhelyzettel kellett szemben\u00e9zn\u00fcnk, amelyek \u00fajabb ellen\u0151rz\u00e9seket ig\u00e9nyeltek, amikor a k\u00f3d b\u00e1rmilyen v\u00e1ltoz\u00e1st szenvedett. P\u00e9ld\u00e1ul, ha egy oszt\u00e1ly \u00faj alap\u00e9rtelmezett oszt\u00e1lyt kapott. Miut\u00e1n elv\u00e9gezt\u00fck, amit akartunk, a legt\u00f6bb inkrement\u00e1lis ellen\u0151rz\u00e9s v\u00e9grehajt\u00e1si idej\u00e9t m\u00e1sodpercekre cs\u00f6kkenthett\u00fck. Ezt nagy gy\u0151zelemnek \u00e9rezt\u00fck.<\/p>\n<h2>M\u00e9g nagyobb teljes\u00edtm\u00e9ny!<\/h2>\n<p>\nA fent eml\u00edtett t\u00e1voli gyors\u00edt\u00e1ssal egy\u00fcttesen a mypy d\u00e9mon gyakorlatilag teljesen megoldotta azokat a probl\u00e9m\u00e1kat, amelyek akkor mer\u00fcltek fel, amikor a programoz\u00f3 gyakran ind\u00edtotta el a t\u00edpusellen\u0151rz\u00e9st, kis mennyis\u00e9g\u0171 f\u00e1jl m\u00f3dos\u00edt\u00e1s\u00e1val. Azonban a rendszer teljes\u00edtm\u00e9nye a legkev\u00e9sb\u00e9 kedvez\u0151 haszn\u00e1lati esetben m\u00e9g mindig messze volt az optim\u00e1list\u00f3l. A mypy tiszta ind\u00edt\u00e1sa t\u00f6bb mint 15 percet is ig\u00e9nybe vehetett. Ez sokkal t\u00f6bb volt, mint amennyivel megel\u00e9gedt\u00fcnk volna. Minden h\u00e9ten a helyzet egyre rosszabb lett, mivel a programoz\u00f3k folyamatosan \u00faj k\u00f3dot \u00edrtak \u00e9s annot\u00e1ci\u00f3kat adtak a megl\u00e9v\u0151 k\u00f3dhoz. Felhaszn\u00e1l\u00f3ink tov\u00e1bbra is nagyobb teljes\u00edtm\u00e9nyre v\u00e1gytak, mi pedig sz\u00edvesen teljes\u00edtett\u00fck ezt a k\u00e9r\u00e9s\u00fcket.<\/p>\n<p>Visszat\u00e9rt\u00fcnk az egyik korai \u00f6tlethez a mypy-val kapcsolatban. Nevezetesen, a Python k\u00f3d C k\u00f3dd\u00e1 val\u00f3 \u00e1t\u00edr\u00e1s\u00e1hoz. A Cython-nal v\u00e9gzett k\u00eds\u00e9rletek (ez egy rendszer, amely lehet\u0151v\u00e9 teszi a Python-ban \u00edrt k\u00f3d C k\u00f3dra val\u00f3 ford\u00edt\u00e1s\u00e1t) nem hoztak l\u00e1that\u00f3 gyorsul\u00e1st, ez\u00e9rt \u00fagy d\u00f6nt\u00f6tt\u00fcnk, hogy \u00fajj\u00e1\u00e9lesztj\u00fck a saj\u00e1t ford\u00edt\u00f3 \u00edr\u00e1s\u00e1nak \u00f6tlet\u00e9t. Mivel a mypy k\u00f3d alapja (amely Python-ban \u00edr\u00f3dott) m\u00e1r tartalmazta az \u00f6sszes sz\u00fcks\u00e9ges t\u00edpusannot\u00e1ci\u00f3t, \u00fagy t\u0171nt, meg\u00e9ri megpr\u00f3b\u00e1lni ezeket az annot\u00e1ci\u00f3kat a rendszer teljes\u00edtm\u00e9ny\u00e9nek fokoz\u00e1s\u00e1ra. Gyorsan k\u00e9sz\u00edtettem egy protot\u00edpust ennek az \u00f6tletnek a tesztel\u00e9s\u00e9re. Ez t\u00f6bb mint 10-szeres teljes\u00edtm\u00e9nyn\u00f6veked\u00e9st mutatott k\u00fcl\u00f6nb\u00f6z\u0151 mikro-benchmarkok sor\u00e1n. Az \u00f6tlet\u00fcnk az volt, hogy a Python modulokat C modulokk\u00e1 ford\u00edtjuk Cython seg\u00edts\u00e9g\u00e9vel, \u00e9s hogy az annot\u00e1ci\u00f3kat t\u00edpusellen\u0151rz\u00e9sekk\u00e9 alak\u00edtjuk, amelyek a program futtat\u00e1sa sor\u00e1n t\u00f6rt\u00e9nnek (\u00e1ltal\u00e1ban a t\u00edpusannot\u00e1ci\u00f3k figyelmen k\u00edv\u00fcl maradnak a programok fut\u00e1sa k\u00f6zben, \u00e9s csak a t\u00edpusellen\u0151rz\u0151 rendszerek haszn\u00e1lj\u00e1k \u0151ket). Val\u00f3j\u00e1ban azt tervezt\u00fck, hogy a mypy megval\u00f3s\u00edt\u00e1s\u00e1t Pythonb\u00f3l egy statikusan t\u00edpusos nyelvre ford\u00edtjuk, amely \u00fagy n\u00e9z ki (\u00e9s nagyr\u00e9szt \u00fagy is m\u0171k\u00f6dik), mint a Python. (Ez az internyelvi migr\u00e1ci\u00f3s forma a mypy projekt hagyom\u00e1ny\u00e1v\u00e1 v\u00e1lt. A mypy eredeti megval\u00f3s\u00edt\u00e1sa Alore nyelven k\u00e9sz\u00fclt, majd a Java \u00e9s Python szintaktikai hibridj\u00e9re v\u00e1ltott.)<\/p>\n<p>A CPython b\u0151v\u00edtm\u00e9nyek API-j\u00e1ra val\u00f3 f\u00f3kusz\u00e1l\u00e1s kulcsfontoss\u00e1g\u00fa volt ahhoz, hogy megtartsuk a projekt menedzsment lehet\u0151s\u00e9geit. Nem kellett l\u00e9trehoznunk virtu\u00e1lis g\u00e9pet vagy b\u00e1rmilyen k\u00f6nyvt\u00e1rat, amire a mypy-nak sz\u00fcks\u00e9ge volt. R\u00e1ad\u00e1sul tov\u00e1bbra is hozz\u00e1f\u00e9rhett\u00fcnk volna az eg\u00e9sz Python \u00f6kosziszt\u00e9m\u00e1hoz, \u00e9s minden eszk\u00f6z (p\u00e9ld\u00e1ul pytest) el\u00e9rhet\u0151 lett volna. Ez azt jelentette, hogy a fejleszt\u00e9s sor\u00e1n tov\u00e1bbra is haszn\u00e1lhattuk a Python \u00e9rtelmezett k\u00f3dot, ami lehet\u0151v\u00e9 tette a k\u00f3d gyors m\u00f3dos\u00edt\u00e1s\u00e1t \u00e9s tesztel\u00e9s\u00e9t an\u00e9lk\u00fcl, hogy a k\u00f3d ford\u00edt\u00e1s\u00e1ra kellett volna v\u00e1rnunk. \u00dagy t\u0171nt, hogy remek\u00fcl siker\u00fcl az \u00fagynevezett \"k\u00e9t sz\u00e9ken \u00fclni\", \u00e9s ez nagyon tetszett nek\u00fcnk.<\/p>\n<p>A ford\u00edt\u00f3, amelyet mypyc-nek nevezt\u00fcnk el (mivel a mypy-t haszn\u00e1lja a t\u00edpusok elemz\u00e9s\u00e9re a frontendjek\u00e9nt), meglehet\u0151sen sikeres projektt\u00e9 v\u00e1lt. \u00d6sszess\u00e9g\u00e9ben k\u00f6r\u00fclbel\u00fcl n\u00e9gyszeres gyorsul\u00e1st \u00e9rt\u00fcnk el a mypy gyakori ind\u00edt\u00e1s\u00e1hoz, an\u00e9lk\u00fcl hogy a cache-el\u00e9st haszn\u00e1ln\u00e1nk. A mypyc projekt magj\u00e1nak fejleszt\u00e9se k\u00f6r\u00fclbel\u00fcl 4 napt\u00e1ri h\u00f3napot vett ig\u00e9nybe egy kis csapat, amelyben Michael Sullivan, Ivan Levkivsky, Hugh Han \u00e9s \u00e9n magam is r\u00e9szt vett\u00fcnk. Ez a munkamennyis\u00e9g sokkal kisebb volt, mint ami a mypy m\u00e1s nyelvekre, p\u00e9ld\u00e1ul C++-ra vagy Go-ra val\u00f3 \u00fajra\u00edr\u00e1s\u00e1hoz sz\u00fcks\u00e9ges lett volna. R\u00e1ad\u00e1sul sokkal kevesebb v\u00e1ltoztat\u00e1st kellett v\u00e9grehajtanunk a projekten, mint ami egy m\u00e1sik nyelvre val\u00f3 \u00fajra\u00edr\u00e1s sor\u00e1n sz\u00fcks\u00e9ges lenne. Emellett abban is b\u00edztunk, hogy a mypyc-ot olyan szintre tudjuk emelni, hogy a Dropbox m\u00e1s programoz\u00f3i is haszn\u00e1lhass\u00e1k a k\u00f3djuk ford\u00edt\u00e1s\u00e1ra \u00e9s gyors\u00edt\u00e1s\u00e1ra.<\/p>\n<p>A hasonl\u00f3 teljes\u00edtm\u00e9ny el\u00e9r\u00e9se \u00e9rdek\u00e9ben n\u00e9h\u00e1ny \u00e9rdekes m\u00e9rn\u00f6ki megold\u00e1st kellett alkalmaznunk. \u00cdgy a ford\u00edt\u00f3 sok m\u0171velet v\u00e9grehajt\u00e1s\u00e1t felgyors\u00edthatja a C alacsony szint\u0171 gyors konstrukci\u00f3inak haszn\u00e1lat\u00e1val. P\u00e9ld\u00e1ul, egy leford\u00edtott f\u00fcggv\u00e9ny h\u00edv\u00e1s C-f\u00fcggv\u00e9ny h\u00edv\u00e1ss\u00e1 alakul. Egy ilyen h\u00edv\u00e1s sokkal gyorsabb, mint egy \u00e9rtelmezett f\u00fcggv\u00e9ny h\u00edv\u00e1sa. N\u00e9h\u00e1ny m\u0171velet, mint p\u00e9ld\u00e1ul a sz\u00f3t\u00e1rakban val\u00f3 keres\u00e9s, m\u00e9g mindig a CPython szok\u00e1sos C-API h\u00edv\u00e1sait haszn\u00e1lt\u00e1k, amelyek a ford\u00edt\u00e1s ut\u00e1n csak kiss\u00e9 gyorsabbak voltak. El tudtuk t\u00fcntetni az \u00e9rtelmez\u00e9s \u00e1ltal okozott extra terheket a rendszerr\u0151l, de ez az esetben csak kis m\u00e9rt\u00e9k\u0171 teljes\u00edtm\u00e9nyn\u00f6veked\u00e9st hozott.<\/p>\n<p>A legelterjedtebb \"lass\u00fa\" m\u0171veletek azonos\u00edt\u00e1sa \u00e9rdek\u00e9ben k\u00f3dprofiloz\u00e1st v\u00e9gezt\u00fcnk. A megszerzett adatok birtok\u00e1ban megpr\u00f3b\u00e1ltuk vagy \u00fagy \"finomhangolni\" a mypyc-t, hogy gyorsabb C-k\u00f3dot gener\u00e1ljon az ilyen m\u0171veletekhez, vagy \u00e1tkonvert\u00e1lni a megfelel\u0151 Python-k\u00f3dot gyorsabb m\u0171veletek haszn\u00e1lat\u00e1val (n\u00e9ha egyszer\u0171en nem volt elegend\u0151 megold\u00e1s a probl\u00e9m\u00e1kra). A Python-k\u00f3d \u00e1tkonvert\u00e1l\u00e1sa gyakran k\u00f6nnyebb megold\u00e1snak bizonyult, mint a ford\u00edt\u00f3ban ugyanazon transzform\u00e1ci\u00f3 automatikus v\u00e9grehajt\u00e1s\u00e1nak megval\u00f3s\u00edt\u00e1sa. Hossz\u00fa t\u00e1von sok ilyen transzform\u00e1ci\u00f3 automatiz\u00e1l\u00e1s\u00e1ra v\u00e1gytunk, de abban az id\u0151pontban a mypy gyors\u00edt\u00e1s\u00e1ra t\u00f6rekedt\u00fcnk minim\u00e1lis er\u0151fesz\u00edt\u00e9ssel. E c\u00e9l fel\u00e9 haladva n\u00e9h\u00e1ny sarkot lekerek\u00edtett\u00fcnk.<\/p>\n<p>Folytat\u00e1s k\u00f6vetkezik\u2026<\/p>\n<p><b>Haszn\u00e1lj\u00e1tok a CI\/CD technol\u00f3gi\u00e1kat a projektjeitekben?<\/b> Milyen benyom\u00e1sokat keltett \u00f6nben a mypy projekt, amikor el\u0151sz\u00f6r tudom\u00e1st szerzett r\u00f3la?<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/ruvds.com\/vps_start\/\"><img decoding=\"async\" alt=\"\u00dat a 4 milli\u00f3 sor Python k\u00f3d t\u00edpusainak ellen\u0151rz\u00e9s\u00e9hez. 2. r\u00e9sz\" 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=\"\u00dat a 4 milli\u00f3 sor Python k\u00f3d t\u00edpusainak ellen\u0151rz\u00e9s\u00e9hez. 2. r\u00e9sz\" src=\"\/wp-content\/uploads\/2019\/09\/263173dd3ab487da330ff9063e3c180e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Forr\u00e1s: <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.3 - 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\/hu\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-2\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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\/hu\/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\udd47\u00dat a 4 milli\u00f3 soros Python-k\u00f3d t\u00edpuskig\u00e9ny\u00e9nek ellen\u0151rz\u00e9s\u00e9hez. 2. r\u00e9sz | ProHoster","description":"Ma k\u00f6zz\u00e9tessz\u00fck a Dropbox-ban a Python-k\u00f3d t\u00f6bb milli\u00f3 sor\u00e1nak t\u00edpuskontrollj\u00e1r\u00f3l sz\u00f3l\u00f3 anyag ford\u00edt\u00e1s\u00e1nak m\u00e1sodik r\u00e9sz\u00e9t.","canonical_url":"https:\/\/prohoster.info\/hu\/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":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/38479","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=38479"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/38479\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/28879"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=38479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=38479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=38479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}