Txoj kev mus rau ntaus ntawv 4 lab kab ntawm Python code. Ntu 1

Niaj hnub no peb coj los rau koj saib thawj feem ntawm kev txhais cov ntaub ntawv hais txog yuav ua li cas Dropbox cuam tshuam nrog Python code hom tswj.

Txoj kev mus rau ntaus ntawv 4 lab kab ntawm Python code. Ntu 1

Dropbox sau ntau hauv Python. Qhov no yog ib hom lus uas peb siv dav heev - ob qho tib si rau cov kev pabcuam backend thiab cov neeg siv khoom siv desktop. Peb kuj siv Go, TypeScript thiab Rust ntau, tab sis Python yog peb hom lus tseem ceeb. Xav txog peb qhov ntsuas, thiab peb tab tom tham txog ntau lab kab ntawm Python code, nws tau muab tawm tias kev ntaus ntawv zoo li no tsis tas yuav nyuaj rau nws nkag siab thiab pib cuam tshuam rau kev ua haujlwm loj. Txhawm rau txo qhov teeb meem no, peb tau pib maj mam hloov peb cov lej mus rau hom kev tshuaj xyuas zoo li qub siv mypy. Qhov no yog tej zaum qhov nrov tshaj plaws stand-alone hom checking system rau Python. Mypy yog qhov qhib qhov project, nws cov neeg tsim khoom tseem ceeb ua haujlwm ntawm Dropbox.

Dropbox yog ib lub tuam txhab thawj zaug los siv hom kev kuaj xyuas zoo li qub hauv Python code ntawm qhov ntsuas no. Mypy tau siv ntau txhiab qhov haujlwm niaj hnub no. Cov cuab yeej no tau ua, raws li lawv hais tias, "tau sim hauv kev sib ntaus sib tua" suav tsis txheeb. Peb yuav tsum tau los ntev heev kom tau mus rau qhov chaw peb nyob tam sim no. Muaj ntau qhov kev ua tsis tiav thiab kev sim ua tsis tau raws li txoj kev. Daim ntawv no qhia txog keeb kwm ntawm kev txheeb xyuas hom zoo li qub hauv Python, los ntawm nws qhov pib pob zeb uas yog ib feem ntawm kuv txoj kev tshawb fawb txog kev kawm txog niaj hnub no, thaum hom kev txheeb xyuas thiab hom lus qhia tau dhau los ua ib qho ntawm cov neeg tsim khoom Python suav tsis txheeb. Cov txheej txheem tam sim no tau txais kev txhawb nqa los ntawm ntau yam cuab yeej, xws li IDEs thiab code analyzers.

β†’ Nyeem ntu ob

Vim li cas thiaj xav tau kev kuaj xyuas?

Yog tias koj twb tau siv dynamically typed Python, tej zaum koj yuav tsis meej pem me ntsis vim li cas thiaj li muaj kev ntxhov siab ntau txog kev ntaus ntawv zoo li qub thiab mypy tsis ntev los no. Los yog nws yuav yog tias koj nyiam Python meej vim nws qhov kev ntaus ntawv tsis zoo, thiab qhov tshwm sim tsuas yog ua rau koj chim siab. Tus yuam sij rau tus nqi ntawm kev ntaus ntawv zoo li qub yog qhov ntsuas ntawm qhov kev txiav txim siab: qhov loj dua koj qhov project, qhov ntau koj lean ntawm kev ntaus ntawv zoo li qub, thiab, thaum kawg, qhov ntau koj xav tau tiag tiag.

Cia peb hais tias ib qhov project tau mus txog kaum tawm txhiab kab hauv qhov loj, thiab nws hloov tawm tias ntau tus programmers ua haujlwm rau nws. Thaum xav txog ib txoj haujlwm zoo li no, raws li peb qhov kev paub dhau los, peb tuaj yeem hais tias kev nkag siab nws cov cai yuav yog qhov tseem ceeb rau kev tswj hwm tus tsim khoom tsim tawm. Yog tsis muaj hom annotations, nws tuaj yeem nyuaj rau kev txiav txim siab, piv txwv li, cov lus sib cav dab tsi yuav tsum tau dhau mus rau qhov ua haujlwm, lossis hom txiaj ntsig dab tsi tuaj yeem rov qab los. Nov yog cov lus nug uas feem ntau nyuaj los teb yam tsis siv hom annotations:

  • Cov haujlwm no puas tuaj yeem rov qab los None?
  • Qhov kev sib cav no yuav tsum yog dab tsi? items?
  • Dab tsi yog hom attribute id: int yog nws, str, lossis tej zaum qee hom kev cai?
  • Qhov kev sib cav no puas yuav yog ib daim ntawv teev npe? Puas muaj peev xwm kis tau ib tug tuple rau hauv nws?

Yog tias koj saib hauv qab no hom-annotated code snippet thiab sim teb cov lus nug zoo li no, nws hloov tawm tias qhov no yog ib txoj haujlwm yooj yim:

class Resource:
    id: bytes
    ...
    def read_metadata(self, 
                      items: Sequence[str]) -> Dict[str, MetadataItem]:
        ...

  • read_metadata tsis rov qab los Nonevim hom rov qab tsis yog Optional[…].
  • sib cav items yog ib kab ntawm kab. Nws tsis tuaj yeem rov hais dua nyob rau hauv ib qho kev txiav txim.
  • Cwj pwm id yog ib txoj hlua ntawm bytes.

Nyob rau hauv lub ntiaj teb zoo tagnrho, ib tug yuav cia siab tias tag nrho cov subtleties no yuav piav nyob rau hauv cov ntaub ntawv built-in (docstring). Tab sis kev paub dhau los muab ntau yam piv txwv uas cov ntaub ntawv no feem ntau tsis pom nyob rau hauv cov cai uas koj yuav tsum ua haujlwm. Txawm hais tias cov ntaub ntawv no muaj nyob rau hauv cov cai, koj tsis tuaj yeem suav rau nws qhov tseeb tiag. Cov ntaub ntawv no yuav tsis meej, tsis meej, thiab qhib rau kev nkag siab yuam kev. Hauv pab pawg loj lossis cov haujlwm loj, qhov teeb meem no tuaj yeem ua rau mob hnyav heev.

Thaum Python ua tau zoo nyob rau hauv cov haujlwm thaum ntxov lossis nruab nrab theem, qee lub sijhawm ua tiav cov haujlwm thiab cov tuam txhab uas siv Python tuaj yeem ntsib cov lus nug tseem ceeb: "Peb puas yuav tsum rov sau txhua yam hauv hom lus zoo li qub?"

Hom kev tshuaj xyuas zoo li mypy daws cov teeb meem saum toj no los ntawm kev muab tus tsim tawm nrog cov lus tsim los piav txog hom, thiab los ntawm kev txheeb xyuas cov lus tshaj tawm uas phim qhov kev siv (thiab, xaiv tau, kuaj xyuas lawv lub neej). Feem ntau, peb tuaj yeem hais tias cov tshuab no muab rau peb nrog qee yam xws li cov ntaub ntawv ua tib zoo txheeb xyuas.

Kev siv cov tshuab no muaj lwm yam zoo, thiab lawv tsis yog qhov tsis tseem ceeb:

  • Hom kev kuaj xyuas tuaj yeem txheeb xyuas qee qhov me me (thiab tsis yog me me) yuam kev. Ib qho piv txwv yog thaum lawv tsis nco qab ua tus nqi None los yog lwm yam mob tshwj xeeb.
  • Refactoring code yog qhov yooj yim heev vim tias hom checker feem ntau qhia koj raws nraim li cas code yuav tsum tau hloov. Nyob rau tib lub sij hawm, peb tsis tas yuav cia siab rau 100% kev ntsuam xyuas ntawm cov cai, uas feem ntau yog tsis yooj yim sua nyob rau hauv txhua rooj plaub. Peb tsis tas yuav khawb tob rau hauv pawg kab ntawv qhia kom paub seb qhov twg yog qhov tsis raug.
  • Txawm nyob rau hauv tej yaam num loj, mypy feem ntau tuaj yeem ua tiav hom kev kuaj xyuas hauv ib feem ntawm ob. Thiab kev xeem khiav feem ntau yuav siv sij hawm kaum vib nas this lossis txawm feeb. Hom kev tshuaj ntsuam xyuas muab cov programmer tawm tswv yim sai thiab tso cai rau nws ua nws txoj haujlwm sai dua. Nws tsis tas yuav sau ntawv tsis yooj yim thiab nyuaj los tswj cov kev xeem hauv chav tsev uas hloov cov chaw tiag tiag nrog kev thuam thiab thaj ua rau thaj kom tau txais cov txiaj ntsig tau nrawm dua.

IDEs thiab cov neeg kho xws li PyCharm lossis Visual Studio Code siv lub zog ntawm hom annotations los muab cov neeg tsim khoom nrog kev ua tiav cov lej tsis siv neeg, kev ua yuam kev tseem ceeb, thiab kev txhawb nqa rau cov lus siv feem ntau. Thiab cov no tsuas yog qee qhov zoo uas typification muab. Rau qee tus programmers, tag nrho cov no yog qhov kev sib cav tseem ceeb hauv kev nyiam ntaus ntawv. Qhov no yog ib yam uas coj tau cov txiaj ntsig tam sim ntawd tom qab siv. Cov ntaub ntawv siv rau hom no tsis tas yuav tsum muaj cais hom kev kuaj xyuas xws li mypy, txawm hais tias nws yuav tsum tau sau tseg tias mypy pab tswj kev sib xws ntawm hom annotations thiab code.

Mypy keeb kwm

Zaj dab neeg mypy pib hauv UK, hauv Cambridge, ob peb xyoos ua ntej kuv koom nrog Dropbox. Raws li ib feem ntawm kuv qhov kev tshawb fawb kws kho mob, kuv tau ua haujlwm ntawm qhov teeb meem ntawm kev sib koom ua ke statically typed and dynamic languages. Kuv tau txais kev tshoov siab los ntawm ib tsab xov xwm hais txog kev ntaus ntawv ntxiv los ntawm Jeremy Siek thiab Walid Tah, nrog rau Typed Racket project. Kuv sim nrhiav txoj hauv kev los siv tib yam lus programming rau cov haujlwm sib txawv - los ntawm cov ntawv me me mus rau codebases uas muaj ntau lab kab. Nyob rau tib lub sijhawm, kuv xav kom ntseeg tau tias nyob rau hauv ib qhov project ntawm txhua qhov teev kuv yuav tsis tau ua kom muaj kev cuam tshuam ntau dhau. Ib qho tseem ceeb ntawm tag nrho cov no yog lub tswv yim ntawm kev maj mam txav los ntawm ib qhov project untyped prototype mus rau ib qho kev ntsuam xyuas, statically typed tiav cov khoom. Cov tswv yim no tau txais txiaj ntsig ntau rau hnub no, tab sis xyoo 2010 nws yog ib qho teeb meem uas tseem tab tom tshawb fawb.

Kuv thawj zaug ua haujlwm hauv hom kev kuaj xyuas tsis yog tsom rau Python. Hloov chaw kuv siv hom lus me me "homemade". Alore. Nov yog ib qho piv txwv los muab koj lub tswv yim ntawm qhov peb tab tom tham txog (hom annotations yog xaiv tau):

def Fib(n as Int) as Int
  if n <= 1
    return n
  else
    return Fib(n - 1) + Fib(n - 2)
  end
end

Siv cov lus yooj yooj yim ntawm koj tus kheej tsim yog ib txoj hauv kev siv hauv kev tshawb fawb txog kev tshawb fawb. Qhov no yog li ntawd, tsis yog tsawg kawg yog vim qhov no ua rau nws muaj peev xwm ua tau sai sai, thiab vim li cas tsis cuam tshuam rau kev tshawb fawb tau yooj yim tsis quav ntsej. Cov lus hais hauv lub neej tiag tiag nyiam ua qhov tshwm sim loj nrog cov kev siv nyuaj, uas ua rau kev sim qeeb. Txawm li cas los xij, ib qho txiaj ntsig raws li cov lus yooj yim yog qhov tsis txaus ntseeg me ntsis, txij li thaum tau txais cov txiaj ntsig no, tus kws tshawb fawb yuav tau txi cov kev txiav txim siab tseem ceeb rau kev siv hom lus.

Kuv hom checker rau Alore saib zoo heev, tab sis kuv xav sim nws los ntawm kev sim nrog tiag code uas tsis tau sau nyob rau hauv Alore. Luckily rau kuv, cov lus Alore feem ntau yog raws li tib lub tswv yim zoo li Python. Nws yog ib qho yooj yim txaus los tsim kho hom checker kom nws tuaj yeem ua haujlwm nrog Python syntax thiab semantics. Qhov no tso cai rau peb sim ua hom kev kuaj xyuas hauv qhov qhib Python code. Kuv kuj tau sau ib tug transpiler los hloov Alore code rau hauv Python code thiab siv nws los txhais kuv hom checker code. Tam sim no kuv muaj hom kev tshuaj xyuas uas sau hauv Python uas txhawb nqa ib pawg ntawm Python, qee qhov kev hloov pauv ntawm cov lus ntawd! (Qee qhov kev txiav txim siab ntawm vaj tse uas ua rau muaj kev nkag siab zoo rau Alore tsis zoo rau Python; qhov no tseem pom tseeb hauv qee qhov ntawm mypy codebase.)

Qhov tseeb, cov lus txhawb nqa los ntawm kuv hom kab ke tsis tuaj yeem hu ua Python ntawm lub sijhawm no: nws yog qhov txawv ntawm Python vim qee qhov kev txwv ntawm Python 3's hom annotation syntax.

Nws zoo li kev sib xyaw ntawm Java thiab Python:

int fib(int n):
    if n <= 1:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

Ib qho ntawm kuv lub tswv yim thaum lub sijhawm yog siv cov lus piav qhia los txhim kho kev ua tau zoo los ntawm kev sau cov tsw ntawm Python rau hauv C, lossis kab tias rau hauv JVM bytecode. Kuv tau mus rau theem ntawm kev sau ntawv tus qauv sau, tab sis tso tseg lub tswv yim no vim tias hom tshuaj xyuas nws tus kheej zoo li muaj txiaj ntsig zoo.

Kuv tau mus nthuav qhia kuv qhov project ntawm PyCon 2013 hauv Santa Clara. Kuv kuj tau tham txog qhov no nrog Guido van Rossum, Python's benevolent dictator for life. Nws ntxias kuv kom ditch kuv cov kev cai syntax thiab lo nrog tus qauv Python 3 syntax. Python 3 txhawb kev ua haujlwm annotations, yog li kuv tus piv txwv tuaj yeem rov sau dua li hauv qab no, ua rau Python ib txwm ua haujlwm:

def fib(n: int) -> int:
    if n <= 1:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

Kuv yuav tsum tau ua qee qhov kev cuam tshuam (ua ntej ntawm tag nrho cov, kuv xav taw tes tias qhov no yog vim li cas kuv tsim kuv tus kheej syntax). Tshwj xeeb, Python 3.3, cov lus tshiab tshaj plaws ntawm lub sijhawm ntawd, tsis txhawb cov lus piav qhia sib txawv. Kuv tau tham txog ntau yam kev xaiv syntactic rau cov lus piav qhia no nrog Guido ntawm email. Peb txiav txim siab los siv hom lus rau kev hloov pauv. Qhov no ua tiav lub hom phiaj, tab sis saib me ntsis cumbersome (Python 3.6 muab peb cov syntax zoo dua):

products = []  # type: List[str]  # Eww

Hom lus kuj tseem muaj txiaj ntsig zoo rau kev txhawb nqa Python 2, uas tsis muaj kev txhawb nqa rau hom annotations:

f fib(n):
    # type: (int) -> int
    if n <= 1:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

Nws tau muab tawm tias cov kev cuam tshuam no (thiab lwm yam) tsis muaj teeb meem tiag tiag - cov txiaj ntsig ntawm kev ntaus ntawv zoo li qub txhais tau hais tias cov neeg siv tsis ntev los no tsis nco qab txog qhov tsis zoo tshaj plaws syntax. Txij li Python code uas tswj hom tsis siv cov syntax tshwj xeeb lawm, cov cuab yeej Python uas twb muaj lawm thiab cov txheej txheem code txuas ntxiv ua haujlwm ib txwm, ua rau nws yooj yim dua rau cov neeg tsim khoom los kawm cov cuab yeej tshiab.

Guido kuj txhawb kom kuv koom nrog Dropbox tom qab kuv ua tiav kuv qhov kev kawm qib siab. Qhov no yog qhov uas nthuav tshaj plaws hauv keeb kwm ntawm mypy pib.

Kom txuas ntxiv…

Nyob zoo nyeem! Yog tias koj siv Python, thov qhia peb txog qhov ntsuas ntawm cov haujlwm koj tsim hauv hom lus no.

Txoj kev mus rau ntaus ntawv 4 lab kab ntawm Python code. Ntu 1
Txoj kev mus rau ntaus ntawv 4 lab kab ntawm Python code. Ntu 1

Tau qhov twg los: www.hab.com

Ntxiv ib saib