{"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\/hu\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3","title":{"rendered":"\u00dat a 4 milli\u00f3 sor Python-k\u00f3d t\u00edpusellen\u0151rz\u00e9s\u00e9hez. 3. r\u00e9sz","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bemutatjuk \u00d6n\u00f6knek a Dropbox \u00fatj\u00e1r\u00f3l sz\u00f3l\u00f3 anyag harmadik r\u00e9sz\u00e9nek ford\u00edt\u00e1s\u00e1t, ahol a Python-k\u00f3d t\u00edpusellen\u0151rz\u00e9si rendszer\u00e9nek bevezet\u00e9s\u00e9r\u0151l van sz\u00f3.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468237\/\"><img decoding=\"async\" alt=\"\u00dat a 4 milli\u00f3 sor Python-k\u00f3d t\u00edpusellen\u0151rz\u00e9s\u00e9hez. 3. r\u00e9sz\" src=\"\/wp-content\/uploads\/2019\/10\/757669265e870de604388c66adef814d.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>\u2192 El\u0151z\u0151 r\u00e9szek: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468233\/\">az els\u0151<\/a><\/noindex> \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/468235\/\">m\u00e1sodik<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>4 milli\u00f3 sor t\u00edpusozott k\u00f3d el\u00e9r\u00e9se<\/h2>\n<p>\nEgy m\u00e1sik fontos feladat (ez volt a m\u00e1sodik legn\u00e9pszer\u0171bb probl\u00e9ma, ami foglalkoztatta a bels\u0151 felm\u00e9r\u00e9sek r\u00e9sztvev\u0151it) a Dropbox k\u00f3dj\u00e1nak t\u00edpusellen\u0151rz\u00e9s al\u00e1 vont terjedelm\u00e9nek n\u00f6vel\u00e9se volt. T\u00f6bb megk\u00f6zel\u00edt\u00e9st kipr\u00f3b\u00e1ltunk a feladat megold\u00e1s\u00e1ra - a t\u00edpusozott k\u00f3db\u00e1zis term\u00e9szetes n\u00f6veked\u00e9s\u00e9t\u0151l kezdve, a mypy csapat tagjainak statikus \u00e9s dinamikus automatikus t\u00edpuslevon\u00e1sra ir\u00e1nyul\u00f3 er\u0151fesz\u00edt\u00e9seiig. V\u00e9g\u00fcl az a benyom\u00e1s alakult ki, hogy itt nincs egyszer\u0171, nyer\u0151 strat\u00e9gia, de siker\u00fclt gyors n\u00f6veked\u00e9st el\u00e9rn\u00fcnk az annot\u00e1lt k\u00f3d mennyis\u00e9g\u00e9ben, kombin\u00e1lva sz\u00e1mos megk\u00f6zel\u00edt\u00e9st.<\/p>\n<p>Ennek eredm\u00e9nyek\u00e9nt a legnagyobb Python-repozit\u00f3riumunkban (h\u00e1tt\u00e9rk\u00f3d) az annot\u00e1lt k\u00f3d sorainak sz\u00e1ma k\u00f6zel 4 milli\u00f3ra emelkedett. A k\u00f3d statikus t\u00edpusoz\u00e1s\u00e1nak munk\u00e1ja k\u00f6r\u00fclbel\u00fcl h\u00e1rom \u00e9vet vett ig\u00e9nybe. A Mypy most k\u00fcl\u00f6nb\u00f6z\u0151 t\u00edpusok lefedetts\u00e9gi jelent\u00e9seit t\u00e1mogatja, amelyek megk\u00f6nny\u00edtik a t\u00edpusoz\u00e1s el\u0151rehalad\u00e1s\u00e1nak nyomon k\u00f6vet\u00e9s\u00e9t. K\u00fcl\u00f6n\u00f6sen k\u00e9pesek vagyunk jelent\u00e9seket k\u00e9sz\u00edteni a t\u00edpusokkal kapcsolatos bizonytalans\u00e1gokr\u00f3l, p\u00e9ld\u00e1ul a nyilv\u00e1nos t\u00edpusok haszn\u00e1lat\u00e1r\u00f3l. <code>B\u00e1rmely<\/code> annot\u00e1ci\u00f3, amelyet nem lehet ellen\u0151rizni, vagy olyan k\u00fcls\u0151 k\u00f6nyvt\u00e1rak import\u00e1l\u00e1s\u00e1r\u00f3l, amelyekben nincsenek t\u00edpusannot\u00e1ci\u00f3k. A Dropbox t\u00edpusellen\u0151rz\u00e9s\u00e9nek pontosabb\u00e1 t\u00e9tel\u00e9re ir\u00e1nyul\u00f3 projekt keret\u00e9ben hozz\u00e1j\u00e1rultunk n\u00e9h\u00e1ny n\u00e9pszer\u0171 ny\u00edlt forr\u00e1sk\u00f3d\u00fa k\u00f6nyvt\u00e1r t\u00edpusdefin\u00edci\u00f3inak (\u00fagynevezett stub f\u00e1jlok) jav\u00edt\u00e1s\u00e1hoz a k\u00f6zpontos\u00edtott Python-repozit\u00f3riumban. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/python\/typeshed\">typeshed<\/a><\/noindex>.<\/p>\n<p>\u00daj funkci\u00f3kat val\u00f3s\u00edtottunk meg (\u00e9s szabv\u00e1nyos\u00edtottunk a k\u00e9s\u0151bbi PEP-ekben) a t\u00edpusaitalrendszerhez, amelyek lehet\u0151v\u00e9 teszik pontosabb t\u00edpusok haszn\u00e1lat\u00e1t bizonyos specifikus Python mint\u00e1khoz. Ennek figyelemre m\u00e9lt\u00f3 p\u00e9ld\u00e1ja a <code>TypeDict<\/code>, amely t\u00edpusokat biztos\u00edt a JSON-szer\u0171 sz\u00f3t\u00e1rakhoz, amelyeknek r\u00f6gz\u00edtett sz\u00e1m\u00fa karakterl\u00e1nc-kulcsuk van, mindegyik saj\u00e1t t\u00edpus\u00fa \u00e9rt\u00e9kkel. Folytatni fogjuk a t\u00edpusok rendszer\u00e9nek b\u0151v\u00edt\u00e9s\u00e9t. Val\u00f3sz\u00edn\u0171leg k\u00f6vetkez\u0151 l\u00e9p\u00e9s\u00fcnk a Python sz\u00e1mokkal kapcsolatos funkci\u00f3inak t\u00e1mogat\u00e1s\u00e1nak jav\u00edt\u00e1sa lesz.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dat a 4 milli\u00f3 sor Python-k\u00f3d t\u00edpusellen\u0151rz\u00e9s\u00e9hez. 3. r\u00e9sz\" src=\"\/wp-content\/uploads\/2019\/10\/297b9e823141d6cb0d2f19f9a78a1153.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Annot\u00e1lt k\u00f3d sorainak sz\u00e1ma: szerver<\/i><\/p>\n<p><img decoding=\"async\" alt=\"\u00dat a 4 milli\u00f3 sor Python-k\u00f3d t\u00edpusellen\u0151rz\u00e9s\u00e9hez. 3. r\u00e9sz\" src=\"\/wp-content\/uploads\/2019\/10\/c183a9227e51d847bfdb2b8f6153684f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Az annot\u00e1lt k\u00f3d sorainak sz\u00e1ma: \u00fcgyf\u00e9l<\/i><\/p>\n<p><img decoding=\"async\" alt=\"\u00dat a 4 milli\u00f3 sor Python-k\u00f3d t\u00edpusellen\u0151rz\u00e9s\u00e9hez. 3. r\u00e9sz\" src=\"\/wp-content\/uploads\/2019\/10\/0a8b936fa454a34c09a9c6a2694485c9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Az annot\u00e1lt k\u00f3d teljes sorainak sz\u00e1ma<\/i><\/p>\n<p>\u00cdme egy \u00e1ttekint\u00e9s a Dropbox-ban v\u00e9grehajtott f\u0151bb l\u00e9p\u00e9sekr\u0151l az annot\u00e1lt k\u00f3d mennyis\u00e9g\u00e9nek n\u00f6vel\u00e9se \u00e9rdek\u00e9ben:<\/p>\n<p>Az annot\u00e1l\u00e1s szigor\u00fas\u00e1ga. Fokozatosan n\u00f6velt\u00fck az \u00faj k\u00f3d annot\u00e1l\u00e1s\u00e1ra vonatkoz\u00f3 k\u00f6vetelm\u00e9nyek szigor\u00e1t. Elkezdt\u00fck a lintel\u00e9si javaslatokkal, amelyek azt javasolt\u00e1k, hogy annot\u00e1ci\u00f3kat adjunk azokhoz a f\u00e1jlokhoz, amelyekben m\u00e1r vannak annot\u00e1ci\u00f3k. Most m\u00e1r t\u00edpusannot\u00e1ci\u00f3kat k\u00f6vetel\u00fcnk meg az \u00faj Python f\u00e1jlokban \u00e9s a megl\u00e9v\u0151 f\u00e1jlok t\u00f6bbs\u00e9g\u00e9ben.<\/p>\n<p>T\u00edpus jelent\u00e9sek. Minden h\u00e9ten jelent\u00e9seket k\u00fcld\u00fcnk a csapatoknak a k\u00f3djaik t\u00edpusoss\u00e1gi szintj\u00e9r\u0151l, \u00e9s tan\u00e1csokat adunk arr\u00f3l, hogy mit \u00e9rdemes els\u0151k\u00e9nt annot\u00e1lni.<\/p>\n<p>A mypy n\u00e9pszer\u0171s\u00edt\u00e9se. Besz\u00e9l\u00fcnk a mypy-r\u00f3l k\u00fcl\u00f6nf\u00e9le esem\u00e9nyeken, \u00e9s kapcsolatba l\u00e9p\u00fcnk a csapatokkal, seg\u00edtve \u0151ket az annot\u00e1ci\u00f3k haszn\u00e1lat\u00e1nak megkezd\u00e9s\u00e9ben.<\/p>\n<p>K\u00e9rd\u0151\u00edvek. Id\u0151szakos felm\u00e9r\u00e9seket v\u00e9gz\u00fcnk a felhaszn\u00e1l\u00f3k sz\u00e1m\u00e1ra a legf\u0151bb probl\u00e9m\u00e1k felt\u00e1r\u00e1s\u00e1ra. K\u00e9szen \u00e1llunk arra, hogy messzire elmenj\u00fcnk ezek megold\u00e1sa \u00e9rdek\u00e9ben (ak\u00e1r \u00faj nyelv l\u00e9trehoz\u00e1s\u00e1ig is a mypy felgyors\u00edt\u00e1sa \u00e9rdek\u00e9ben!).<\/p>\n<p>Teljes\u00edtm\u00e9ny. Jelent\u0151sen jav\u00edtottuk a mypy teljes\u00edtm\u00e9ny\u00e9t a d\u00e9mon \u00e9s mypyc haszn\u00e1lat\u00e1val. Ezt az\u00e9rt tett\u00fck, hogy sim\u00e1bb\u00e1 tegy\u00fck az annot\u00e1l\u00e1si folyamatot, \u00e9s lehet\u0151s\u00e9get biztos\u00edtsunk nagyobb k\u00f3dmennyis\u00e9ggel val\u00f3 munk\u00e1ra.<\/p>\n<p>Integr\u00e1ci\u00f3 a szerkeszt\u0151kbe. Olyan eszk\u00f6z\u00f6ket hoztunk l\u00e9tre, amelyek t\u00e1mogatj\u00e1k a mypy futtat\u00e1s\u00e1t a Dropboxban n\u00e9pszer\u0171 szerkeszt\u0151kben. Ezek k\u00f6z\u00e9 tartozik a PyCharm, Vim \u00e9s VS Code. Ez jelent\u0151sen megk\u00f6nny\u00edtette a k\u00f3d annot\u00e1l\u00e1s\u00e1nak \u00e9s m\u0171k\u00f6d\u00e9s\u00e9nek ellen\u0151rz\u00e9s\u00e9nek folyamat\u00e1t. Az ilyen l\u00e9p\u00e9sek \u00e1ltal\u00e1ban jellemz\u0151ek a megl\u00e9v\u0151 k\u00f3d annot\u00e1l\u00e1sakor.<\/p>\n<p>Statikus elemz\u00e9s. Olyan eszk\u00f6zt hoztunk l\u00e9tre, amely funkci\u00f3k al\u00e1\u00edr\u00e1sait \u00e1ll\u00edtja el\u0151 statikus elemz\u00e9si eszk\u00f6z\u00f6k seg\u00edts\u00e9g\u00e9vel. Ez az eszk\u00f6z csak viszonylag egyszer\u0171 helyzetekben m\u0171k\u00f6dik, de seg\u00edtett nek\u00fcnk an\u00e9lk\u00fcl, hogy komoly er\u0151fesz\u00edt\u00e9seket tenn\u00e9nk, n\u00f6velni a k\u00f3d t\u00edpusokkal val\u00f3 lefedetts\u00e9g\u00e9t.<\/p>\n<p>Harmadik f\u00e9lt\u0151l sz\u00e1rmaz\u00f3 k\u00f6nyvt\u00e1rak t\u00e1mogat\u00e1sa. Sok projekt\u00fcnkben haszn\u00e1lunk SQLAlchemy eszk\u00f6zk\u00e9szletet. Ez dinamikus Python lehet\u0151s\u00e9geket haszn\u00e1l, amelyeket a PEP 484 t\u00edpusai nem tudnak k\u00f6zvetlen\u00fcl modellezni. A PEP 561 szerint l\u00e9trehoztuk a megfelel\u0151 stub f\u00e1jlt \u00e9s \u00edrtunk egy plugint a mypy-hoz.<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dropbox\/sqlalchemy-stubs\">ny\u00edlt forr\u00e1sk\u00f3d\u00fa<\/a><\/noindex>), amely jav\u00edtja az SQLAlchemy t\u00e1mogat\u00e1s\u00e1t.<\/p>\n<h2>Nehezens\u00e9gek, amelyekkel szembes\u00fclt\u00fcnk<\/h2>\n<p>\nAz \u00fat 4 milli\u00f3 sor t\u00edpusos k\u00f3dhoz nem mindig volt k\u00f6nny\u0171 sz\u00e1munkra. Ezen az \u00faton rengeteg g\u00f6d\u00f6rbe \u00fctk\u00f6zt\u00fcnk \u00e9s t\u00f6bb hib\u00e1t k\u00f6vett\u00fcnk el. \u00cdme n\u00e9h\u00e1ny probl\u00e9ma, amellyel szembes\u00fclt\u00fcnk. Rem\u00e9lj\u00fck, hogy a r\u00f3luk sz\u00f3l\u00f3 besz\u00e1mol\u00f3 seg\u00edt m\u00e1soknak elker\u00fclni hasonl\u00f3akat.<\/p>\n<p>Hi\u00e1nyz\u00f3 f\u00e1jlok. A munk\u00e1t csak egy kis mennyis\u00e9g\u0171 f\u00e1jl ellen\u0151rz\u00e9s\u00e9vel kezdt\u00fck. Minden, ami nem tartozott e f\u00e1jlok k\u00f6r\u00e9be, nem lett ellen\u0151rizve. A f\u00e1jlok a vizsg\u00e1lati list\u00e1ra akkor ker\u00fcltek fel, amikor az els\u0151 megjegyz\u00e9sek megjelentek benn\u00fck. Ha valami egy olyan modulb\u00f3l import\u00e1l\u00f3dott, amely a vizsg\u00e1lat ter\u00fclet\u00e9n k\u00edv\u00fcl volt, akkor az a t\u00edpus\u00fa \u00e9rt\u00e9kek kezel\u00e9se volt <code>B\u00e1rmely<\/code>, amelyeket egy\u00e1ltal\u00e1n nem ellen\u0151riztek. Ez jelent\u0151s t\u00edpusoss\u00e1gi pontoss\u00e1g-vesztes\u00e9ghez vezetett, k\u00fcl\u00f6n\u00f6sen a migr\u00e1ci\u00f3 korai szakasz\u00e1ban. Ez a megk\u00f6zel\u00edt\u00e9s meglep\u0151en j\u00f3l m\u0171k\u00f6d\u00f6tt, b\u00e1r az tipikus helyzet az volt, amikor f\u00e1jlok hozz\u00e1ad\u00e1sa a vizsg\u00e1lati ter\u00fclethez probl\u00e9m\u00e1kat t\u00e1rt fel a k\u00f3dalap m\u00e1s r\u00e9szein. A legrosszabb esetben, amikor k\u00e9t elszigetelt k\u00f3dter\u00fclet egyes\u00fclt, amelyek \u00f6n\u00e1ll\u00f3an m\u00e1r ellen\u0151rz\u00e9s alatt \u00e1lltak, kider\u00fclt, hogy ezek a ter\u00fcletek nem voltak kompatibilisek egym\u00e1ssal. Ez sz\u00fcks\u00e9gess\u00e9 tette a megjegyz\u00e9sek sz\u00e1mos m\u00f3dos\u00edt\u00e1s\u00e1t. Most visszatekintve r\u00e1j\u00f6v\u00fcnk, hogy sokkal kor\u00e1bban kellett volna az alap k\u00f6nyvt\u00e1ri modulokat a mypy t\u00edpusellen\u0151rz\u00e9si k\u00f6r\u00e9be felvenn\u00fcnk. Ez sokkal kisz\u00e1m\u00edthat\u00f3bb\u00e1 tette volna a munk\u00e1nkat.<\/p>\n<p>R\u00e9gi k\u00f3d annot\u00e1l\u00e1sa. Amikor elkezdt\u00fck a munk\u00e1t, k\u00f6r\u00fclbel\u00fcl 4 milli\u00f3 sor m\u00e1r megl\u00e9v\u0151 Python k\u00f3dunk volt. Nyilv\u00e1nval\u00f3 volt, hogy ennek a k\u00f3dnak a teljes annot\u00e1l\u00e1sa nem k\u00f6nny\u0171 feladat. K\u00e9sz\u00edtett\u00fcnk egy eszk\u00f6zt, PyAnnotate n\u00e9ven, amely k\u00e9pes \u00f6sszegy\u0171jteni a t\u00edpusinform\u00e1ci\u00f3kat a tesztek fut\u00e1sa k\u00f6zben, \u00e9s k\u00e9pes hozz\u00e1adni a k\u00f3dhoz a t\u00edpusannot\u00e1ci\u00f3kat az \u00f6sszegy\u0171jt\u00f6tt adatok alapj\u00e1n. Azonban nem tapasztaltunk k\u00fcl\u00f6n\u00f6sebb elterjedts\u00e9get ezzel az eszk\u00f6zzel kapcsolatban. A t\u00edpusinform\u00e1ci\u00f3k \u00f6sszegy\u0171jt\u00e9se lass\u00fa volt, a automatikusan gener\u00e1lt annot\u00e1ci\u00f3k gyakran sok k\u00e9zi jav\u00edt\u00e1st ig\u00e9nyeltek. Gondolkodtunk azon, hogy automatikusan futtassuk ezt az eszk\u00f6zt minden k\u00f3dellen\u0151rz\u00e9s sor\u00e1n, vagy hogy a t\u00edpusinform\u00e1ci\u00f3kat valamilyen kis mennyis\u00e9g\u0171 val\u00f3di h\u00e1l\u00f3zati k\u00e9r\u00e9s elemz\u00e9s\u00e9b\u0151l gy\u0171jts\u00fck, de \u00fagy d\u00f6nt\u00f6tt\u00fcnk, hogy ezt nem tessz\u00fck, mivel b\u00e1rmelyik megk\u00f6zel\u00edt\u00e9s t\u00fal kock\u00e1zatos lenne.<\/p>\n<p>V\u00e9gezet\u00fcl megjegyezhetj\u00fck, hogy a k\u00f3d nagy r\u00e9sze manu\u00e1lisan lett annot\u00e1lva a tulajdonosai \u00e1ltal. Mi, hogy ezt a folyamatot a helyes ir\u00e1nyba terelj\u00fck, fontos modulok \u00e9s funkci\u00f3k jelent\u00e9s\u00e9t k\u00e9sz\u00edtj\u00fck, amelyeket annot\u00e1lni kell. P\u00e9ld\u00e1ul fontos, hogy a t\u00f6bbsz\u00f6r\u00f6sen haszn\u00e1lt k\u00f6nyvt\u00e1ri modult t\u00edpusannot\u00e1ci\u00f3kkal l\u00e1ssuk el. A r\u00e9gi szolg\u00e1ltat\u00e1st, amelyet egy \u00faj v\u00e1lt fel, m\u00e1r nem annyira fontos annot\u00e1lni. Ezenk\u00edv\u00fcl statikus elemz\u00e9st is alkalmazunk a t\u00edpusannot\u00e1ci\u00f3k gener\u00e1l\u00e1s\u00e1ra a r\u00e9gi k\u00f3dhoz.<\/p>\n<p>Ciklikus importok. A ciklikus importokr\u00f3l (a \u201ef\u00fcgg\u0151s\u00e9gek gubanc\u00e1r\u00f3l\u201d) m\u00e1r besz\u00e9ltem, amelyek l\u00e9tez\u00e9se megnehez\u00edtette a mypy felgyors\u00edt\u00e1s\u00e1t. Emellett komoly munk\u00e1t kellett v\u00e9gezn\u00fcnk, hogy a mypy t\u00e1mogatni tudja az \u00f6sszes olyan idiom\u00e1t, amelyek ezen ciklikus importok miatt mer\u00fclnek fel. Nemr\u00e9g fejezt\u00fck be egy nagyszab\u00e1s\u00fa rendszer\u00fajra\u00edr\u00e1si projektet, amely a mypy ciklikus importokkal kapcsolatos probl\u00e9m\u00e1inak t\u00f6bbs\u00e9g\u00e9t jav\u00edtotta. Ezek a probl\u00e9m\u00e1k, val\u00f3j\u00e1ban, a projekt korai napjaib\u00f3l sz\u00e1rmaztak, m\u00e9g Alore-b\u00f3l, a mypy eredetileg orient\u00e1lt tanulm\u00e1nyi nyelv\u00e9b\u0151l. Az Alore szintaxis lehet\u0151v\u00e9 teszi a ciklikus importparancsok probl\u00e9m\u00e1inak k\u00f6nny\u0171 kezel\u00e9s\u00e9t. A modern mypy \u00f6r\u00f6k\u00f6lt n\u00e9h\u00e1ny korai, egyszer\u0171s\u00edtett megval\u00f3s\u00edt\u00e1s\u00e1b\u00f3l sz\u00e1rmaz\u00f3 korl\u00e1tot (amely kiv\u00e1l\u00f3an alkalmas volt az Alore-hoz). A Python a ciklikus importok kezel\u00e9s\u00e9t f\u0151k\u00e9nt a kifejez\u00e9sek egy\u00e9rtelm\u0171tlens\u00e9ge miatt bonyol\u00edtja. P\u00e9ld\u00e1ul, egy \u00e9rt\u00e9k hozz\u00e1rendel\u00e9s\u00e9nek sor\u00e1n t\u00e9nylegesen t\u00edpusaliast lehet defini\u00e1lni. A mypy nem mindig k\u00e9pes ezeket a dolgokat felder\u00edteni, am\u00edg a ciklus nagy r\u00e9sze nem feldolgozott. Az Alore-ban nem voltak ilyen egy\u00e9rtelm\u0171tlens\u00e9gek. A rendszer korai fejleszt\u00e9si szakasz\u00e1ban hozott rossz d\u00f6nt\u00e9sek \u00e9vek m\u00falva kellemetlen meglepet\u00e9st okozhatnak a programoz\u00f3nak.<\/p>\n<h2>\u00d6sszegz\u00e9s: az 5 milli\u00f3 sor k\u00f3dhoz \u00e9s \u00faj horizontokhoz vezet\u0151 \u00fat<\/h2>\n<p>\nA mypy projekt hossz\u00fa utat tett meg \u2013 a korai protot\u00edpusokt\u00f3l a rendszerig, amelynek seg\u00edts\u00e9g\u00e9vel a 4 milli\u00f3 soros termel\u00e9si k\u00f3d t\u00edpusa ellen\u0151rizhet\u0151. A mypy fejl\u0151d\u00e9se sor\u00e1n standardiz\u00e1lt\u00e1k a t\u00edpusokkal kapcsolatos javaslatokat a Pythonban. Manaps\u00e1g egy er\u0151s \u00f6kosziszt\u00e9ma fejl\u0151d\u00f6tt ki a Python-k\u00f3dok t\u00edpusoss\u00e1ga k\u00f6r\u00fcl. Ezen bel\u00fcl helyet kaptak a k\u00f6nyvt\u00e1rak t\u00e1mogat\u00e1sa, IDE-k \u00e9s szerkeszt\u0151k seg\u00e9deszk\u00f6zei, tov\u00e1bb\u00e1 t\u00f6bb t\u00edpusellen\u0151rz\u0151 rendszer, mindegyiknek megvannak a maga el\u0151nyei \u00e9s h\u00e1tr\u00e1nyai.<\/p>\n<p>B\u00e1r a t\u00edpusellen\u0151rz\u00e9s m\u00e1r a Dropboxban mag\u00e1t\u00f3l \u00e9rtet\u0151d\u0151nek tekinthet\u0151, biztos vagyok benne, hogy m\u00e9g mindig a Python-k\u00f3dok t\u00edpusoss\u00e1g\u00e1nak hajnal\u00e1n \u00e9l\u00fcnk. Azt gondolom, hogy a t\u00edpusellen\u0151rz\u0151 technol\u00f3gi\u00e1k tov\u00e1bbra is fejl\u0151dnek \u00e9s javulnak majd.<\/p>\n<p>Ha m\u00e9g nem haszn\u00e1lt\u00e1l t\u00edpusellen\u0151rz\u00e9st a nagy l\u00e9pt\u00e9k\u0171 Python-projektedben, tudd, hogy most van itt az ideje a statikus t\u00edpusoz\u00e1sra val\u00f3 \u00e1t\u00e1ll\u00e1snak. Besz\u00e9ltem olyanokkal, akik m\u00e1r v\u00e9grehajtott\u00e1k ezt az \u00e1tmenetet. Senki sem b\u00e1nta meg. A t\u00edpusellen\u0151rz\u00e9s a Pythont olyan nyelvv\u00e9 alak\u00edtja, ami sokkal jobban megfelel a nagy projektek fejleszt\u00e9s\u00e9hez, mint a \"szok\u00e1sos Python\".<\/p>\n<p><b>Haszn\u00e1lj\u00e1tok a CI\/CD technol\u00f3gi\u00e1kat a projektjeitekben?<\/b> Haszn\u00e1lsz t\u00edpusellen\u0151rz\u00e9st a Python-projektjeidben?<\/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\u00edpusellen\u0151rz\u00e9s\u00e9hez. 3. r\u00e9sz\" 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=\"\u00dat a 4 milli\u00f3 sor Python-k\u00f3d t\u00edpusellen\u0151rz\u00e9s\u00e9hez. 3. r\u00e9sz\" src=\"\/wp-content\/uploads\/2019\/10\/098d481c25b3afaba9534c686e8f943a.png\" 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\/468237\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Dropbox, \u0432\u043d\u0435\u0434\u0440\u044f\u044f \u0443 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 Python-\u043a\u043e\u0434\u0430. \u2192 \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0447\u0430\u0441\u0442\u0438: \u043f\u0435\u0440\u0432\u0430\u044f \u0438 \u0432\u0442\u043e\u0440\u0430\u044f \u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 4 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u0440\u043e\u043a \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0415\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 (\u044d\u0442\u043e \u0431\u044b\u043b \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0432\u043e\u043b\u043d\u043e\u0432\u0430\u0432\u0448\u0430\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043e\u043f\u0440\u043e\u0441\u0430\u0445) \u0431\u044b\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u0430 \u043a\u043e\u0434\u0430 \u0432 Dropbox, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28992,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38649","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Dropbox, \u0432\u043d\u0435\u0434\u0440\u044f\u044f \u0443 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 Python-\u043a\u043e\u0434\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3\" \/>\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 3 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Dropbox, \u0432\u043d\u0435\u0434\u0440\u044f\u044f \u0443 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 Python-\u043a\u043e\u0434\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hu\/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\udd47\u00dat a 4 milli\u00f3 soros Python-k\u00f3d t\u00edpusellen\u0151rz\u00e9s\u00e9hez. 3. r\u00e9sz | ProHoster","description":"Bemutatjuk \u00d6n\u00f6knek a Dropbox \u00fatj\u00e1r\u00f3l sz\u00f3l\u00f3 anyag harmadik r\u00e9sz\u00e9nek ford\u00edt\u00e1s\u00e1t, ahol a Python-k\u00f3d t\u00edpusellen\u0151rz\u00e9si rendszer\u00e9nek bevezet\u00e9s\u00e9r\u0151l van sz\u00f3.","canonical_url":"https:\/\/prohoster.info\/hu\/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":"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 3 | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0448\u043b\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Dropbox, \u0432\u043d\u0435\u0434\u0440\u044f\u044f \u0443 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 Python-\u043a\u043e\u0434\u0430.","og:url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/put-k-proverke-tipov-4-millionov-strok-python-koda-chast-3","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:25:04+00:00","article:modified_time":"2019-10-31T19:25:04+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38649","title":null,"description":null,"keywords":null,"keyphrases":{"focus":[],"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 22:54:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:05:23","updated":"2026-08-11 12:50:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/38649","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=38649"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/38649\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/28992"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=38649"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=38649"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=38649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}