Ang dalan sa pag-typecheck sa 4 ka milyon nga linya sa Python code. Bahin 1

Karon among gidala sa imong atensyon ang una nga bahin sa paghubad sa materyal kung giunsa ang pagdumala sa Dropbox sa pagkontrol sa tipo sa code sa Python.

Ang dalan sa pag-typecheck sa 4 ka milyon nga linya sa Python code. Bahin 1

Daghang nagsulat ang Dropbox sa Python. Kini usa ka lengguwahe nga among gigamit nga labi ka kaylap - para sa mga serbisyo sa backend ug mga aplikasyon sa kliyente sa desktop. Gigamit usab namo ang Go, TypeScript ug Rust, apan ang Python mao ang among nag-unang pinulongan. Gikonsiderar ang among sukod, ug naghisgot kami bahin sa milyon-milyon nga mga linya sa code sa Python, nahimo nga ang dinamikong pag-type sa ingon nga code dili kinahanglan nga komplikado ang pagsabut niini ug nagsugod nga seryoso nga nakaapekto sa produktibidad sa pamuo. Aron maminusan kini nga isyu, nagsugod kami sa hinayhinay nga pagbalhin sa among code sa static type checking gamit ang mypy. Kini tingali ang labing inila nga stand-alone type checking system alang sa Python. Ang Mypy usa ka open source nga proyekto, ang mga nag-unang developer niini nagtrabaho sa Dropbox.

Ang Dropbox usa sa mga una nga kompanya nga nagpatuman sa static type checking sa Python code sa kini nga sukod. Ang Mypy gigamit sa liboan ka mga proyekto karong mga adlawa. Kini nga himan, ingon sa ilang giingon, "nasulayan sa gubat" sa dili maihap nga mga higayon. Layo pa ang among agian aron makaabot sa among nahimutangan karon. Adunay daghang dili malampuson nga mga paningkamot ug napakyas nga mga eksperimento sa dalan. Kini nga piraso nagsaysay sa kasaysayan sa static type checking sa Python, gikan sa batoon nga sinugdanan niini isip kabahin sa akong academic research project hangtod karon, kung ang mga type check ug type nga mga pahiwatig nahimong kasagaran sa dili maihap nga mga developer sa Python. Kini nga mga mekanismo gisuportahan na karon sa lain-laing mga himan, sama sa mga IDE ug code analyzers.

β†’ Basaha ang ikaduhang bahin

Ngano nga gikinahanglan ang pagsusi sa tipo?

Kung nakagamit ka na sa dinamikong gi-type nga Python, mahimo ka nga maglibog kung ngano nga adunay daghang kasamok bahin sa static nga pag-type ug mypy karong bag-o. O tingali gusto nimo ang Python tungod sa dinamikong pag-type niini, ug kung unsa ang nahitabo nakapasuko kanimo. Ang yawe sa bili sa static nga pag-type mao ang sukdanan sa mga desisyon: mas dako ang imong proyekto, mas mosandig ka sa static nga pag-type, ug, sa katapusan, mas kinahanglan nimo kini.

Ingnon ta nga ang usa ka proyekto nakaabot sa napulo ka libo nga linya sa gidak-on, ug kini nahimo nga daghang mga programmer ang nagtrabaho niini. Kung gikonsiderar ang usa ka proyekto nga sama niini, base sa among kasinatian, makaingon kami nga ang pagsabut sa code niini mahimong yawe sa pagpadayon sa produktibidad sa developer. Kung wala ang mga anotasyon sa tipo, mahimong lisud mahibal-an, pananglitan, kung unsang mga argumento ang kinahanglan ipasa sa usa ka function, o kung unsang mga klase sa mga kantidad ang mahimo’g ibalik sa usa ka function. Ania ang kasagarang mga pangutana nga kasagaran lisud tubagon nga dili gamiton ang mga anotasyon sa tipo:

  • Makabalik ba kini nga function None?
  • Unsa man kini nga argumento? items?
  • Unsa ang tipo sa attribute id: int mao ba, str, o tingali pipila ka naandan nga tipo?
  • Kinahanglan ba nga kini nga argumento usa ka lista? Posible ba nga ipasa ang usa ka tuple niini?

Kung imong tan-awon ang mosunud nga tipo-annotated code snippet ug pagsulay sa pagtubag sa mga pangutana nga sama niini, kini usa ka yano nga buluhaton:

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

  • read_metadata dili mubalik Nonetungod kay ang tipo sa pagbalik dili Optional[…].
  • argumento items usa ka han-ay sa mga linya. Dili kini masubli sa bisan unsang han-ay.
  • Kinaiya id usa ka hugpong sa mga byte.

Sa usa ka sulundon nga kalibutan, ang usa magdahum nga ang tanan nga ingon nga mga subtleties gihulagway sa built-in nga dokumentasyon (docstring). Apan ang kasinatian naghatag daghang mga pananglitan nga ang ingon nga dokumentasyon kanunay nga wala maobserbahan sa code nga kinahanglan nimong buhaton. Bisan kung ang ingon nga dokumentasyon naa sa code, dili ka makasalig sa hingpit nga pagkahusto niini. Kini nga dokumentasyon mahimong dili klaro, dili tukma, ug bukas sa dili pagsinabtanay. Sa dagkong mga team o dagkong mga proyekto, kini nga problema mahimong grabe kaayo.

Samtang ang Python milabaw sa sayo o tunga-tunga nga mga proyekto, sa pipila ka mga punto ang malampuson nga mga proyekto ug mga kompanya nga naggamit sa Python mahimong mag-atubang sa usa ka importante nga pangutana: "Angay ba natong isulat pag-usab ang tanan sa usa ka statically typed nga pinulongan?"

Ang mga sistema sa pagsusi sa tipo sama sa mypy nagsulbad sa problema sa ibabaw pinaagi sa paghatag sa developer sa usa ka pormal nga lengguwahe alang sa paghulagway sa mga tipo, ug pinaagi sa pagsusi nga ang mga deklarasyon sa tipo nga nahiuyon sa pagpatuman sa programa (ug, kung mahimo, pagsusi sa ilang paglungtad). Sa kinatibuk-an, makaingon kita nga kini nga mga sistema naghatag kanato og usa ka butang sama sa maampingong gipamatud-an nga dokumentasyon.

Ang paggamit sa ingon nga mga sistema adunay uban pang mga bentaha, ug sila hingpit nga dili hinungdanon:

  • Ang sistema sa pagsusi sa tipo makamatikod sa pipila ka mga menor de edad (ug dili usab gamay) nga mga sayup. Usa ka tipikal nga pananglitan mao kung sila makalimot sa pagproseso sa usa ka bili None o uban pang espesyal nga kondisyon.
  • Ang refactoring code kay gipasimple kaayo tungod kay ang type checker kanunay nga nagsulti kanimo kung unsa nga code ang kinahanglan usbon. Sa parehas nga oras, dili kinahanglan nga magsalig sa 100% nga pagsakup sa pagsulay sa code, nga kasagaran imposible sa bisan unsang kaso. Dili na nato kinahanglan nga magkalot og lawom sa mga stack trace report aron mahibal-an kung unsa ang sayup.
  • Bisan sa dagkong mga proyekto, ang mypy kanunay makahimo sa usa ka kompleto nga tipo sa pagsusi sa usa ka bahin sa usa ka segundo. Ug ang pagpadagan sa mga pagsulay kasagarang mokabat ug napulo ka segundo o bisan mga minuto. Ang sistema sa pagsusi sa tipo naghatag dayon nga feedback sa programmer ug gitugotan siya nga buhaton ang iyang trabaho nga mas paspas. Dili na niya kinahanglan nga magsulat nga mahuyang ug lisud nga mamentinar ang mga pagsulay sa yunit nga mopuli sa tinuod nga mga entidad sa mga pagbiaybiay ug mga patch aron lang makakuha og mas paspas nga mga resulta sa pagsulay sa code.

Ang mga IDE ug mga editor sama sa PyCharm o Visual Studio Code naggamit sa gahum sa tipo nga mga anotasyon aron mahatagan ang mga developer sa awtomatikong pagkompleto sa code, pag-highlight sa sayup, ug suporta alang sa kasagarang gigamit nga mga paghimo sa pinulongan. Ug kini ang pipila lamang sa mga bentaha nga gihatag sa typification. Alang sa pipila nga mga programmer, kining tanan mao ang panguna nga argumento pabor sa pag-type. Kini usa ka butang nga nagdala mga benepisyo pagkahuman sa pagpatuman. Kini nga kaso sa paggamit alang sa mga tipo wala magkinahanglan usa ka lahi nga sistema sa pagsusi sa tipo sama sa mypy, bisan kung kinahanglan hinumdoman nga ang mypy makatabang sa pagpadayon sa pagkamakanunayon tali sa mga anotasyon sa tipo ug code.

Mypy background

Ang mypy nga istorya nagsugod sa UK, sa Cambridge, pipila ka tuig sa wala pa ako miapil sa Dropbox. Isip kabahin sa akong panukiduki sa doktora, nagtrabaho ko sa isyu sa paghiusa sa statically type ug dinamikong mga pinulongan. Nadasig ko sa usa ka artikulo bahin sa incremental typing ni Jeremy Siek ug Walid Tah, ingon man ang Typed Racket nga proyekto. Nangita kog mga paagi nga magamit ang parehas nga programming language para sa lainlaing mga proyekto - gikan sa gagmay nga mga script hangtod sa mga codebase nga gilangkuban sa daghang milyon nga linya. Sa samang higayon, gusto nako nga masiguro nga sa usa ka proyekto sa bisan unsang sukod dili ko kinahanglan nga mohimo ug daghang mga pagkompromiso. Usa ka importante nga bahin sa tanan niini mao ang ideya sa hinay-hinay nga pagbalhin gikan sa usa ka untyped prototype nga proyekto ngadto sa usa ka komprehensibo nga gisulayan, statically typed nahuman nga produkto. Kini nga mga ideya kasagarang gikuha alang sa gihatag nga mga adlaw, apan sa 2010 kini usa ka isyu nga aktibo gihapon nga gisiksik.

Ang akong una nga trabaho sa pagsusi sa tipo wala gitumong sa Python. Hinuon migamit ko og gamay nga "homemade" nga pinulongan Alore. Ania ang usa ka pananglitan aron mahatagan ka usa ka ideya kung unsa ang among gihisgutan (opsyonal ang tipo nga mga anotasyon):

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

Ang paggamit sa usa ka gipayano nga pinulongan sa imong kaugalingon nga disenyo usa ka komon nga pamaagi nga gigamit sa siyentipikong panukiduki. Mao kini, dili labing gamay tungod kay kini nagpaposible sa dali nga pagpahigayon sa mga eksperimento, ug tungod usab kay kung unsa ang wala’y kalabotan sa panukiduki dali nga mabalewala. Ang mga sinultian nga programming sa tinuud nga kinabuhi lagmit nga daghang katingad-an nga mga panghitabo nga adunay komplikado nga pagpatuman, nga nagpahinay sa pag-eksperimento. Bisan pa, ang bisan unsang mga resulta nga gibase sa usa ka gipayano nga sinultian usa ka gamay nga pagduda, tungod kay sa pagkuha niini nga mga resulta ang tigdukiduki mahimo nga nagsakripisyo sa mga konsiderasyon nga hinungdanon alang sa praktikal nga paggamit sa mga pinulongan.

Ang akong type checker alang sa Alore nindot kaayo tan-awon, apan gusto nako nga sulayan kini pinaagi sa pag-eksperimento sa tinuod nga code nga dili tinuod nga gisulat sa Alore. Sa swerte alang kanako, ang pinulongang Alore kadaghanan gibase sa parehas nga mga ideya sama sa Python. Sayon ra ang pagdesinyo pag-usab sa type checker aron kini magamit sa Python syntax ug semantics. Kini nagtugot kanamo sa pagsulay sa paghimo sa tipo nga pagsusi sa open source Python code. Nagsulat usab ako og transpiler aron ma-convert ang Alore code ngadto sa Python code ug gigamit kini sa paghubad sa akong type checker code. Karon ako adunay usa ka sistema sa pagsusi sa tipo nga gisulat sa Python nga nagsuporta sa usa ka subset sa Python, pipila nga kalainan sa kana nga lengguwahe! (Ang pipila ka mga desisyon sa arkitektura nga makatarunganon alang sa Alore dili kaayo angay alang sa Python; kini makita gihapon sa pipila ka bahin sa mypy codebase.)

Sa tinuud, ang sinultian nga gisuportahan sa akong tipo nga sistema dili na matawag nga Python sa kini nga punto: kini usa ka variant sa Python tungod sa pipila nga mga limitasyon sa Python 3's type annotation syntax.

Morag sagol nga Java ug Python:

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

Usa sa akong mga ideya niadtong panahona mao ang paggamit sa type annotation aron mapalambo ang performance pinaagi sa pag-compile niini nga lami sa Python ngadto sa C, o tingali ngadto sa JVM bytecode. Nakaabot ako sa yugto sa pagsulat sa usa ka prototype compiler, apan gibiyaan kini nga ideya tungod kay ang pagsusi sa tipo mismo morag mapuslanon.

Gitapos nako ang pagpresentar sa akong proyekto sa PyCon 2013 sa Santa Clara. Gihisgotan usab nako kini kang Guido van Rossum, ang mabuot nga diktador sa Python sa tibuok kinabuhi. Gikombinsir ko niya nga tangtangon ang akong custom syntax ug ipabilin ang standard Python 3 syntax.

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

Kinahanglan kong mohimo og pipila ka mga pagkompromiso (una sa tanan, gusto nakong ipunting nga mao kini ang hinungdan nga akong giimbento ang akong kaugalingon nga syntax). Sa partikular, ang Python 3.3, ang pinakabag-o nga bersyon sa pinulongan niadtong panahona, wala nagsuporta sa mga variable annotation. Gihisgutan nako ang lainlaing mga kapilian sa syntactic alang sa ingon nga mga anotasyon sa Guido pinaagi sa email. Nakahukom kami nga gamiton ang mga komentaryo sa tipo alang sa mga variable. Nakab-ot niini ang katuyoan, apan medyo lisud tan-awon (Python 3.6 naghatag kanamo usa ka labi ka maayo nga syntax):

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

Ang mga komentaryo sa tipo mapuslanon usab alang sa pagsuporta sa Python 2, nga wala’y gitukod nga suporta alang sa mga anotasyon sa tipo:

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

Kini nahimo nga kini (ug uban pa) nga mga pagkompromiso dili gyud hinungdanon - ang mga benepisyo sa static nga pag-type nagpasabut nga ang mga tiggamit sa wala madugay nakalimot bahin sa dili kaayo perpekto nga syntax. Tungod kay ang Python code nga nagkontrol sa mga tipo wala na naggamit ug espesyal nga syntax, ang kasamtangan nga Python nga mga himan ug mga proseso sa code nagpadayon sa pagtrabaho nga normal, nga naghimo nga mas sayon ​​alang sa mga developers sa pagkat-on sa bag-ong himan.

Gikombinsir usab ako ni Guido nga moapil sa Dropbox pagkahuman nako sa akong senior thesis. Dinhi nagsugod ang labing makapaikag nga butang sa kasaysayan sa mypy.

Ipadayon…

Minahal nga magbabasa! Kung mogamit ka ug Python, palihug sultihi kami bahin sa gidak-on sa mga proyekto nga imong gihimo sa kini nga lengguwahe.

Ang dalan sa pag-typecheck sa 4 ka milyon nga linya sa Python code. Bahin 1
Ang dalan sa pag-typecheck sa 4 ka milyon nga linya sa Python code. Bahin 1

Source: www.habr.com

Idugang sa usa ka comment