Ny lalana mankany amin'ny fanoratana sora-baventy 4 tapitrisa andalana Python. Fizarana 1

Androany izahay dia mitondra ny sainao ny ampahany voalohany amin'ny fandikana ny fitaovana momba ny fomba ifandraisan'ny Dropbox amin'ny fifehezana karazana kaody Python.

Ny lalana mankany amin'ny fanoratana sora-baventy 4 tapitrisa andalana Python. Fizarana 1

Dropbox dia manoratra betsaka amin'ny Python. Fiteny ampiasaintsika be dia be izy io, na ho an'ny serivisy aoriana na ho an'ny fampiharana mpanjifa desktop. Mampiasa Go, TypeScript ary Rust koa izahay, fa Python no fiteninay. Raha jerena ny mari-pamantaranay, ary miresaka momba ny andalana an-tapitrisany amin'ny kaody Python isika, dia hita fa nanasarotra ny fahatakarany ny fanoratana mavitrika ny fehezan-dalΓ na toy izany ary nanomboka nisy fiantraikany lehibe tamin'ny famokarana asa. Mba hanalefahana an'io olana io dia nanomboka namindra tsikelikely ny kaodinay izahay amin'ny fanamarinana karazana static mampiasa mypy. Ity angamba no rafitra fanaraha-maso karazana tokana malaza indrindra ho an'ny Python. Mypy dia tetikasa open source, miasa ao amin'ny Dropbox ny mpamorona azy.

Dropbox dia iray amin'ireo orinasa voalohany nampihatra fanamarinana karazana static amin'ny kaody Python amin'ity ambaratonga ity. Mypy dia ampiasaina amin'ny tetikasa an'arivony amin'izao fotoana izao. Imbetsaka io fitaovana io, araka ny filazan'izy ireo, "voazaha toetra tamin'ny ady." Lavitra ny lalana mankany amin'ny misy antsika ankehitriny. Teny an-dalana, dia nisy asa tsy nahomby sy fanandramana tsy nahomby. Ity lahatsoratra ity dia mirakitra ny tantaran'ny fisavana karazana static amin'ny Python, nanomboka tamin'ny fiandohan'ny vatolampy ho ampahany amin'ny tetik'asa fikarohana nataoko, ka hatramin'izao, rehefa lasa mahazatra ho an'ireo mpamorona tsy tambo isaina manoratra amin'ny Python ity lahatsoratra ity. Ireo mekanika ireo izao dia tohanan'ny fitaovana maro toy ny IDE sy mpanadihady kaody.

β†’ Vakio ny tapany faharoa

Nahoana no ilaina ny fanamarinana karazana?

Raha efa nampiasa Python dynamique ianao dia mety ho sahiran-tsaina ny amin'ny antony nahatonga ny korontana manodidina ny fanoratana static sy mypy tato ho ato. Na mety tianao ny Python noho ny fanoratana mavitrika azy, ary manelingelina anao fotsiny ny zava-mitranga. Ny fanalahidin'ny sandan'ny fanoratana static dia ny haavon'ny vahaolana: ny lehibe kokoa ny tetikasanao, ny hirona kokoa amin'ny fanoratana static, ary amin'ny farany, ny tena ilainao azy.

Eritrereto hoe nahatratra an'aliny ny haben'ny tetikasa iray, ary hita fa misy programmer maromaro miasa amin'izany. Raha mijery tetikasa mitovitovy amin'izany, mifototra amin'ny traikefantsika, dia afaka milaza isika fa ny fahatakarana ny kaody ao aminy no ho fanalahidin'ny fitazonana ny mpamorona hamokatra. Raha tsy misy fanamarihana karazana dia mety ho sarotra ny hamantatra, ohatra, hoe inona ny tohan-kevitra ampitaina amin'ny asa iray, na ny karazana asa mety hiverina. Ireto misy fanontaniana mahazatra izay sarotra valiana matetika raha tsy mampiasa fanamarihana karazana:

  • Afaka miverina ve ity asa ity None?
  • Inona no tokony ho hevitra io? items?
  • Inona no karazana toetra id: int izany ve, str, sa mety karazana mahazatra?
  • Tokony ho lisitra ve ity hevitra ity? Azo atao ve ny mampita tuple amin'izany?

Raha mijery ity sombin-kaody misy annotation manaraka ity ianao ary manandrana mamaly fanontaniana mitovitovy amin'izany, dia hita fa ity no asa tsotra indrindra:

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

  • read_metadata tsy miverina None, satria ny karazana fiverenana dia tsy Optional[…].
  • fandresen-dahatra items dia filaharan'ny andalana. Tsy azo averina kisendrasendra.
  • toetra id dia tady bytes.

Ao amin'ny tontolo iray tena tsara, ny olona iray dia manantena fa holazaina ao amin'ny antontan-taratasy naorina (docstring). Saingy ny traikefa dia manome ohatra be dia be amin'ny hoe ny antontan-taratasy toy izany dia matetika tsy voamarika ao amin'ny code izay tsy maintsy iasanao. Na dia eo aza ny antontan-taratasy toy izany ao amin'ny kaody, dia tsy afaka miantehitra amin'ny fahamarinany tanteraka. Ity antontan-taratasy ity dia mety ho manjavozavo, tsy marina ary misokatra ho an'ny tsy fifankahazoana. Amin'ny ekipa lehibe na tetikasa lehibe, ity olana ity dia mety ho lasa tena mafy.

Na dia misongadina aza i Python amin'ny dingana voalohany na antenantenany amin'ny tetikasa, amin'ny fotoana iray dia mety hiatrika ny fanontaniana tena ilaina ny tetikasa sy orinasa mahomby mampiasa Python: "Tokony hanoratra ny zava-drehetra amin'ny fiteny static ve isika?".

Ny rafitra fanaraha-maso karazana toy ny mypy dia mamaha ity olana etsy ambony ity amin'ny fanomezana ny mpamorona amin'ny fiteny ofisialy hamaritana karazana, ary amin'ny fanamarinana fa mifanaraka amin'ny fampiharana ny programa ny fanambarana karazana (ary, raha tsy izany, manamarina ny fisiany). Amin'ny ankapobeny, afaka milaza isika fa ireo rafitra ireo dia mametraka zavatra toy ny antontan-taratasy voamarina tsara.

Ny fampiasana rafitra toy izany dia manana tombony hafa, ary efa tsy misy dikany izy ireo:

  • Ny rafitra fanaraha-maso karazana dia afaka mahita lesoka kely (fa tsy kely loatra). Ny ohatra mahazatra dia rehefa adinony ny manodina sanda iray None na fepetra manokana hafa.
  • Ny refactoring kaody dia notsorina be satria matetika ny rafitra fanamarinana karazana dia tena marina momba ny kaody tokony hovaina. Mandritra izany fotoana izany, tsy mila manantena ny fandrakofana kaody 100% miaraka amin'ny fitsapana, izay, na ahoana na ahoana, dia matetika tsy azo atao. Tsy mila miditra amin'ny halalin'ny trace isika mba hahitana ny anton'ny olana.
  • Na dia amin'ny tetikasa lehibe aza, matetika ny mypy dia afaka manao fanamarinana karazana feno ao anatin'ny ampahany segondra. Ary mazΓ na ny fanatanterahana ny fitsapana dia maharitra folo segondra na minitra mihitsy aza. Ny rafitra fanaraha-maso karazana dia manome tamberina avy hatrany ho an'ny mpandrindra ary mamela azy hanao ny asany haingana kokoa. Tsy mila manoratra saro-pady sy sarotra amin'ny fikojakojana ny fitsapana an'ny vondrona izay manolo ny tena zava-misy amin'ny fanesoana sy patch izy mba hahazoana haingana kokoa ny valin'ny fitsapana code.

Ny IDE sy ny tonian-dahatsoratra toa ny PyCharm na Visual Studio Code dia mampiasa ny tanjaky ny fanoratana karazana mba hanomezana ny mpamorona ny famitana ny kaody, ny fanasongadinana ny fahadisoana ary ny fanohanana ny fananganana fiteny mahazatra. Ary ireo dia sasantsasany amin'ireo tombony azo amin'ny fanoratana. Ho an'ny programa sasany, izany rehetra izany no tohan-kevitra lehibe indrindra amin'ny fanoratana. Izany dia zavatra mahasoa avy hatrany aorian'ny fampiharana. Ity tranga fampiasana ho an'ny karazana ity dia tsy mitaky rafitra fanaraha-maso karazana misaraka toy ny mypy, na dia tokony ho marihina aza fa ny mypy dia manampy amin'ny fitazonana annotation karazana mifanaraka amin'ny code.

Background de mypy

Ny tantaran'ny mypy dia nanomboka tany UK, tany Cambridge, taona vitsivitsy talohan'ny nidirany Dropbox. Nandray anjara tamin'ny fikarohana momba ny doctorat aho, tamin'ny fampiraisana ireo fiteny static sy mavitrika. Nahazo aingam-panahy aho tamin'ny lahatsoratra momba ny fanoratana incremental nataon'i Jeremy Siek sy Walid Taha, ary ny tetikasa Typed Racket. Niezaka nitady fomba hampiasana fiteny fandaharana mitovy amin'ny tetikasa isan-karazany aho - manomboka amin'ny sora-baventy kely ka hatramin'ny fototry ny code misy andalana an-tapitrisany maro. Nandritra izany fotoana izany, te-hiantoka aho fa amin'ny tetikasa amin'ny ambaratonga rehetra dia tsy voatery hanao marimaritra iraisana loatra ny olona iray. Ny ampahany manan-danja amin'izany rehetra izany dia ny hevitra hifindra tsikelikely avy amin'ny tetikasa prototype tsy voatanisa mankany amin'ny vokatra vita vita vita amin'ny statika. Amin'izao fotoana izao, ireo hevitra ireo dia raisina ho an'ny besinimaro, saingy tamin'ny taona 2010 dia olana izay mbola nokarohina fatratra.

Ny asako tany am-boalohany amin'ny fanamarinana karazana dia tsy natao ho an'ny Python. Nampiasa fiteny kely "natao an-trano" kosa aho Alore. Ity misy ohatra iray izay ahafahanao mahazo izay resahinay (tsy azo atao eto ny fanamarihana karazana):

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

Fomba fanao mahazatra amin'ny fikarohana siantifika ny fampiasana ny tenin-drazana notsorina. Izany no izy, tsy ny kely indrindra satria mamela anao hanao fanandramana haingana, ary koa noho ny zava-misy fa izay tsy misy ifandraisany amin'ny fikarohana dia azo tsinontsinoavina mora foana. Ny fiteny fandaharana amin'ny tontolo tena izy dia mirona ho fisehoan-javatra midadasika miaraka amin'ny fampiharana sarotra, ary mampiadana ny fanandramana izany. Na izany aza, ny vokatra rehetra mifototra amin'ny fiteny notsorina dia toa mampiahiahy kely, satria amin'ny fahazoana ireo valiny ireo dia mety ho nanao sorona ny fiheverana manan-danja ho an'ny fampiasana ny fiteny ny mpikaroka.

Ny karazana checker-ko ho an'i Alore dia toa tena nampanantena, saingy te-hitsapa izany aho amin'ny alΓ lan'ny fanandramana amin'ny code tena izy, izay mety ho lazainao fa tsy nosoratana tamin'ny Alore. Soa ihany ho ahy, ny fiteny Alore dia mifototra amin'ny hevitra mitovy amin'ny Python. Mora ihany ny manova ny typechecker mba hahafahany miasa amin'ny syntax sy semantika an'i Python. Izany dia namela anay hanandrana karazana fanamarinana amin'ny kaody Python open source. Ankoatra izany, nanoratra transpiler aho hanova ny kaody nosoratana tamin'ny Alore ho kaody Python ary nampiasa azy io handikana ny kaody typechecker-ko. Ankehitriny dia nanana rafitra fanamarinana karazana nosoratana tamin'ny Python aho izay nanohana ampahany amin'ny Python, karazana io fiteny io! (Ny fanapahan-kevitra momba ny maritrano sasany izay nisy dikany ho an'i Alore dia tsy nety tamin'ny Python, ary mbola hita any amin'ny ampahany amin'ny codebase mypy izany.)

Raha ny marina, ny fiteny tohanan'ny rafitra karazana ahy dia tsy azo antsoina hoe Python amin'izao fotoana izao: variana amin'ny Python izy io noho ny fetra sasany amin'ny syntax annotation karazana Python 3.

Toa fifangaroan'ny Java sy Python izany:

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

Ny iray amin'ireo heveriko tamin'izany fotoana izany dia ny fampiasana karazana annotation hanatsarana ny fampisehoana amin'ny alΓ lan'ny fanangonana an'ity karazana Python ity ho C, na angamba JVM bytecode. Tonga teo amin'ny sehatry ny fanoratana prototype compiler aho, saingy nilaozako io hevitra io, satria ny fanamarinana karazana dia tena ilaina tokoa.

Niafara tamin'ny fanolorana ny tetikasako tao amin'ny PyCon 2013 tao Santa Clara aho. Niresaka momba izany koa aho tamin'i Guido van Rossum, ilay mpanao didy jadona Python tsara fanahy ho an'ny fiainana. Nandresy lahatra ahy izy handao ny teniko manokana ary hifikitra amin'ny syntax mahazatra Python 3. Ny Python 3 dia manohana ny fanamarihan'ny asa, ka ny ohatra nasehoko dia azo averina soratana araka ny aseho eto ambany, ka miteraka programa Python mahazatra:

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

Tsy maintsy nanao marimaritra iraisana aho (voalohany indrindra, tiako ny manamarika fa namorona ny syntax manokana aho noho izany antony izany). Indrindra indrindra, ny Python 3.3, ny dikan-teny farany indrindra tamin'izany fotoana izany, dia tsy nanohana fanamarihana miovaova. Niresaka tamin'i Guido tamin'ny alΓ lan'ny mailaka aho momba ny mety ho endrika syntactic ny fanamarihana toy izany. Nanapa-kevitra izahay fa hampiasa karazana fanehoan-kevitra ho an'ny fari-piainana. Nanatanteraka ny tanjona nokasaina izany, saingy somary manahirana (Python 3.6 dia nanome antsika syntax tsara kokoa):

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

Ny fanehoan-kevitra momba ny karazana dia azo ampiasaina ihany koa hanohanana ny Python 2, izay tsy manana fanohanana naorina ho an'ny karazana fanamarihana:

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

Hita fa tsy dia misy dikany loatra ireo fifampiraharahana ireo (sy ny hafa) - ny tombony amin'ny fanoratana static dia midika fa tsy ela dia nanadino ny syntax tsy lavorary ny mpampiasa. Koa satria tsy nisy fanamboarana syntactic manokana nampiasaina tamin'ny kaody Python voasokajy karazana, dia nitohy niasa ara-dalΓ na ny fitaovana Python efa misy sy ny fizotran'ny fanodinana kaody, ka nanamora kokoa ny fianaran'ny mpamorona ilay fitaovana vaovao.

Nandresy lahatra ahy ihany koa i Guido mba hiditra ao amin'ny Dropbox rehefa vita ny tesisy nahazo diplaoma. Eto no manomboka ny ampahany mahaliana indrindra amin'ny tantara mypy.

Hanohy ...

Ry mpamaky malala! Raha mampiasa Python ianao dia lazao anay ny haben'ny tetikasa amboarinao amin'ity fiteny ity.

Ny lalana mankany amin'ny fanoratana sora-baventy 4 tapitrisa andalana Python. Fizarana 1
Ny lalana mankany amin'ny fanoratana sora-baventy 4 tapitrisa andalana Python. Fizarana 1

Source: www.habr.com

Add a comment