Opettele Python viikonlopun aikana: Nollasta valmiiseen projektiin
Kuinka voimme oppia uuden ohjelmointikielen nopeasti? Tässä artikkelissa jaamme viikonloppumme kokemuksen Pythonin oppimisesta rakentamalla valmis projekti.
Kuinka voimme oppia uuden ohjelmointikielen nopeasti? Tässä artikkelissa jaamme viikonloppumme kokemuksen Pythonin oppimisesta rakentamalla valmis projekti.
Logto, identiteettipalveluna, sujuvan kokemuksen tarjoaminen eri ohjelmointikielillä ja -kehyksillä on olennaista. Tämä sisältää usein Ohjelmistokehityspakettien (SDK) luomisen. Kuitenkin, kun ohjelmointikieli ei ole osa teknistä pinoamme ja tiimillämme ei ole siitä kokemusta, vankan SDK:n luomisesta tulee haaste.
Python oli tällainen haaste meille. Huolimatta monista Python-käyttäjistä, meiltä puuttui Python SDK, mikä oli jatkuva huolenaihe. Päättäen ratkaista tämän, aloitin kuilun kaventamisen.
Vaikka minulla on vuosien kokemus ohjelmoinnista, Python on minulle suhteellisen tutkimaton alue. Vaikka olin kokeillut Python 2:ta lyhyesti yksinkertaisiin skripteihin vuosia sitten, tietoni olivat vanhentuneita. Oli kuitenkin aika sukeltaa sisään!
Kokemukseni mukaan tehokkain tapa oppia uusi ohjelmointikieli on rakentaa kokonainen projekti. Onneksi tavoitteemme oli selkeä: rakentaa Logton Python SDK verkkosovelluksille.
Ennen kuin hyppäämme koodiin, hajottakaamme se. Tässä lista:
Näyttää siltä, että tehtävä 1 sisältää eniten työtä, joten meidän on vahvistettava laajuus ja jatkettava sen pilkkomista. Tämä askel on ratkaiseva projektin rajojen turvaamiseksi sekä laajenemisen ja ylisuunnittelun välttämiseksi.
Tiimimme aiempi työ säästi minulta valtavasti aikaa:
Näihin resursseihin viitaten voin nähdä selkeän kuvan tehtävistä. Vaikka yksityiskohdat ovat tämän artikkelin ulkopuolella, siirrytään eteenpäin.
Käytän Macia, joten Python on jo asennettu. Kuitenkin mietin, olisiko parempi tapa hallita Python-versioita (olen kuullut version yhteensopivuuden ongelmista), aivan kuten nvm Node.js:lle. Nopeasti löysin pyenv ja aloitin sen asentamisen heti.
Seuraavaksi ohjelmassa: paketti- ja riippuvuudenhallinta. Yleensä ne ovat yhdistetty. Joten miksi ei "pip" (Pythonin oletus)? Jos katsot requirements.txt, huomaat, että se on vain lista paketeista ja niiden versioista. Tämä ei riitä SDK:lle, jota muut projektit voivat käyttää. Esimerkiksi saatamme joutua lisäämään paketteja kehitystä varten, mutta emme halua sisällyttää niitä lopulliseen SDK:han. requirements.txt on liian yksinkertainen tämän käsittelemiseksi.
Yksi hyöty muista ohjelmointikielistä teknologiapinossasi on, että voit etsiä "Pythonin vastaavaa". Joten etsin "package.json Python vastine" ja löysin Poetryn, loistavan ehdokkaan:
pyproject.toml-tiedosto, joka on kuin package.json Node.js:ssä.Nykyaikaisissa CLI-työkaluissa on usein init-komento uusille projekteille. Niin myös Poetryssä. Annoin komennon ja se loi pyproject.toml-tiedoston minulle.
Viimeinkin, hetki kirjoittaa koodia oli saapunut. Aloitus klassisella "Hello, World!" -ohjelmalla on aina hyvä valinta. Kun opitaan ohjelmointikieltä, täysimittaista IDE:tä ei aina tarvita; editori, jolla on vahva yhteisö, kuten VS Code, on täysin riittävä.
Koska SDK:mme keskittyy verkkosovelluksiin, aloitin yksinkertaisella verkkopalvelimella käyttäen suosittua Flask-kehystä.
Hyödyntäen Poetryn kykyjä, Flaskin asentaminen voidaan helposti tehdä suorittamalla poetry add flask. Sitten, seuraten Flaskin virallista pikasoitto-opasta, koostin 'hello.py' -tiedoston seuraavalla katkelmalla:
Palvelimen käynnistäminen komennolla flask --app hello run ja navigointi osoitteeseen http://localhost:5000 selaimellani tuotti halutun lopputuloksen. Se toimi!
Aloittelijana en kiirehtinyt kirjoittamaan lisää koodia. Sen sijaan on paljon tietoa saatavilla koodikatkelmasta:
from x import y tuodaksesi moduuli tai luokka.new-avainsanaa.@app.route toimii koristeena, joka rekisteröi funktion reitin käsittelijäksi.
def-avainsanaa.Kuten näette, jos yritämme ymmärtää jokaista koodiriviä "sen toimimiseksi tekemisen sijaan", voimme oppia siitä paljon. Samaan aikaan Flaskin virallinen dokumentaatio selitti katkelman yksityiskohtaisesti.
Nyt on aika aloittaa projekti. Pian määrittelin LogtoClient-luokan ja yritin lisätä joitakin ominaisuuksia ja menetelmiä tunteakseni kielen:
Seuraavaksi yhdistä luokka Flaskin kanssa:
Se alkoi tuntua todelliselta projektilta. Mutta tuntui, että jotain puuttui: tyyppijärjestelmä.
Koska kyseessä on SDK, tyyppijärjestelmän lisääminen auttaa käyttäjiä ymmärtämään API:a ja vähentää virheiden mahdollisuutta kehityksen aikana.
Python esitteli tyyppivihjeet versiossa 3.5. Se ei ole yhtä tehokas kuin TypeScript, mutta parempi kuin ei mitään. Lisäsin joitakin tyyppivihjeitä LogtoClient-luokkaan:
Näyttää paljon paremmalta nyt. Mutta haaste syntyy, kun kyseessä on monimutkainen tyyppi, kuten objekti ennalta määritetyin avainparin. Esimerkiksi, meidän on määriteltävä LogtoConfig-luokka edustamaan config-objektia:
Se näyttää hyvältä, mutta pian kohtaamme ongelmia objektin koodaamisessa, dekoodaamisessa ja validoinnissa JSON:ista.
Jonkin tutkimuksen jälkeen valitsin pydantic ratkaisuksi. Se on datavalidointikirjasto, joka toimii tyyppivihjeiden kanssa. Se tukee monipuolisia JSON-toimintoja ilman hankalaa boilerplate-koodia.
Näin LogtoConfig-luokan voi kirjoittaa uudelleen:
Se opetti minulle myös luokan perinnöstä Pythonissa lisäämällä sulkuja luokan nimen jälkeen.
Logto SDK:ssa tarvitsemme HTTP-pyyntöjen tekemistä Logto-palvelimelle. Jos sinulla on kokemusta JavaScriptistä, termi "callback hell" voi soida kelloa. Se on yleinen ongelma asynkronisten toimintojen käsittelyssä. Nykyaikaiset ohjelmointikielet tarjoavat samanlaisia ratkaisuja kuten Promise tai coroutine.
Onneksi Pythonilla on sisäänrakennettu ratkaisu async ja await. Ennen niiden käyttämistä varmista yhteensopivuus suosittujen kehysten kanssa. Flaskissa tämä voidaan tehdä asentamalla async extra ja käyttämällä async def ha:`
Sitten voimme käyttää await odottamaan asynkronisen operaation tulosta.
HTTP-pyynnöt ovat mielenkiintoinen aihe. Melkein jokaisella ohjelmointikielellä on natiivi ratkaisu, mutta kehittäjät yleensä käyttävät kolmannen osapuolen kirjastoa helppokäyttöisyyden vuoksi. Joitakin esimerkkejä:
XMLHttpRequest vs. fetch vs. axiosURLSession vs. AlamofireHttpURLConnection vs. OkHttpTämä pätee myös Pythonille. Päätökseni oli käyttää aiohttp, koska se tukee async ja await, yhdessä sen suosion kanssa.
Ennen Copilotia, meidän olisi nyt tultava liiketoimintaloogisuuden kirjoittamisen yksityiskohtiin. SDK-konvention ja muiden SDK:iden avulla voin kirjoittaa kuvaavat kommentit kaikille menetelmille ennen koodin kirjoittamista.
Se lisää koodin selkeyttä ja auttaa kehittäjiä ymmärtämään API:a suoraan IDE:ssä tai editorissa koodiälyn avulla.
Esimerkiksi, ajattele generateCodeChallenge-menetelmää, kommentit voidaan kirjoittaa:
Tämä tarjosi loistavan kehotuksen Suurille Kielimalleille (LLM): muodostaa menetelmämääritykset selkeillä kommenteilla. Ja Copilot ei pettänyt:
Jotkut hienosäädöt saattavat olla tarpeen, mutta se ei haittaa. Se on jo muuttanut peliä.
Tämä on melkein kaikki ensimmäisen päivän saavutetut edistysaskeleet. Se oli pitkä päivä, mutta nykyaikaisilla työkaluilla ja teknologioilla se oli paljon parempaa kuin odotin.
Ensimmäisen päivän työn perusteella liiketoimintaloogisuus tehtiin nopeasti. Mutta SDK:lle se on edelleen riittämätöntä. Tässä toisen päivän tehtävät:
Yksikkötestit pelastivat meidät monta kertaa, joten en jätä sitä väliin. Tässä tavallisia huomioita yksikkötestejä kirjoitettaessa:
Näiden kysymysten kanssa huomasin, että sisäänrakennettu unittest-moduuli jäi puutteelliseksi joissain tapauksissa. Joten valitsin pytest testikehykseksi. Se tukee asynkronisia testejä ja vaikuttaa tarpeeksi kypsältä.
Matka paljasti joitain mielenkiintoisia uusia konsepteja kuten fixture minulle. Tämä voi myös hyödyttää ajattelutapaa koodia kirjoitettaessa muilla kielillä.
Jokaisella kielellä on oma koodin muotoilutyyli. Henkilökohtaisesti, johdonmukainen muotoilu voi tehdä minut onnelliseksi ja mukavaksi; se on myös hyödyllistä koodikatselmoinnissa ja yhteistyössä.
Sen sijaan, että selaisin "parhaan" tyylin argumenttia, päätin valita mielipidejohtaisen muotoilijan ja pysyä siinä.
Black vaikuttaa hyvältä valinnalta. Ainoa turhautuminen on muuttumattomien välilehtikoon kanssa. Mutta se ei ole iso juttu, päätin sopeutua siihen.
SDK:nä sen pitäisi olla yhteensopiva vallitsevien Python-versioiden kanssa. Etsimällä "python version käyttötilastot", päätin käyttää Python 3.8: ää vähimmäisversiona.
Ympäristöhallinnan hyvyys nyt näyttää. Voin helposti vaihtaa Python-versiota suorittamalla pyenv local 3.8 ja poetry env use 3.8. Voin sitten ajaa testit paljastaakseni yhteensopivuusongelmat.
Jatkuva integrointi takaa jokaisen koodimuutoksen laadun. Koska repositorioamme isännöitiin GitHubissa, GitHub Actions tarjosi luonnollisen valinnan.
Ydin työnkulkua seuraa yksinkertaisia periaatteet:
GitHub Actionsilla on hyvä yhteisö, joten kestää vain muutamia minuutteja rakentaa prosessin.
Käyttämällä matriisistrategioita, voimme ajaa työnkulun eri Python-versioilla, jopa eri käyttöjärjestelmissä.
Viimeinen vaihe on SDK:n julkaisu. Julkisille paketeille tämä voidaan tyypillisesti tehdä lähettämällä viralliseen kielikohtaiseen pakettirekisteriin. Esimerkiksi npm Node.js:lle, PyPI Pythonille, ja CocoaPods Swiftille.
Poetry on ohjaava tähteni. Suorita vain poetry publish julkaistaksesi paketti PyPI:lle. Se on niin yksinkertaista.
Se oli kiehtova matka. Ilman avoimen lähdekoodin yhteisön apua se olisi ollut paljon vaikeampaa. Suosio kaikille osallistujille!
Tässä on joitain yleisiä oppeja:
Löydät lopullisen tuloksen tästä repositoriosta. Saman strategian avulla rakensin nopeasti myös Logto PHP SDK:n. Älä epäröi kertoa meille, jos sinulla on ehdotuksia.
Toivottavasti tämä artikkeli auttaa uuden ohjelmointikielen oppimisessa. Iloista hakkerointia!