ʻO ke ala e nānā ai i nā laina 4 miliona o ka code Python. Mahele 1

I kēia lā, lawe mākou i kou manaʻo i ka hapa mua o ka unuhi ʻana o ka mea e pili ana i ka pili ʻana o Dropbox me ka mana ʻano o ka code Python.

ʻO ke ala e nānā ai i nā laina 4 miliona o ka code Python. Mahele 1

Ua kākau nui ʻo Dropbox ma Python. He ʻōlelo ia a mākou e hoʻohana nui ai, no nā lawelawe hope a me nā noi mea kūʻai aku papapihi. Hoʻohana nui mākou iā Go, TypeScript a me Rust, akā ʻo Python kā mākou ʻōlelo nui. Ke noʻonoʻo nei i kā mākou pālākiō, a ke kamaʻilio nei mākou e pili ana i nā miliona o nā laina o ke code Python, ua ʻike ʻia ʻo ka paʻi ʻana o ia code i mea paʻakikī i kona ʻike a hoʻomaka e hoʻopilikia nui i ka huahana hana. No ka hoʻēmi ʻana i kēia pilikia, ua hoʻomaka mākou e hoʻololi i kā mākou code i ka nānā ʻana i ke ʻano static me ka hoʻohana ʻana i ka mypy. ʻO kēia paha ka ʻōnaehana nānā ʻano kūʻokoʻa kaulana loa no Python. ʻO Mypy kahi papahana open source, hana nā mea hoʻomohala nui ma Dropbox.

ʻO Dropbox kekahi o nā hui mua i hoʻokō i ka nānā ʻana i ke ʻano static ma ka code Python ma kēia pālākiō. Hoʻohana ʻia ʻo Mypy i nā tausani o nā papahana i kēia mau lā. ʻO kēia mea hana i nā manawa he nui, e like me kā lākou e ʻōlelo nei, "hoʻāʻo ʻia i ke kaua." Ua hele mākou i kahi lōʻihi e hiki ai i ko mākou wahi i kēia manawa. Ma ke ala, nui nā hana i kūleʻa ʻole a hāʻule nā ​​hoʻokolohua. Hoʻopili kēia pou i ka mōʻaukala o ka nānā ʻana i ke ʻano static ma Python, mai kona hoʻomaka ʻana ma ke ʻano he ʻāpana o kaʻu papahana noiʻi, a hiki i kēia lā, ke ʻano o ka nānā ʻana a me ke ʻano hinting i lilo i mea maʻamau no nā mea hoʻomohala helu ʻole e kākau ma Python. Kākoʻo ʻia kēia mau ʻano hana e nā mea hana e like me nā IDE a me nā mea helu helu.

Heluhelu i ka ʻāpana ʻelua

No ke aha e pono ai ka nānā ʻana i ke ʻano?

Inā ua hoʻohana ʻoe i ka Python i kākau ʻia me ka ikaika, hiki paha iā ʻoe ke huikau i ke kumu i ulu nui ai ka paʻi ʻana a me ka mypy i kēia mau lā. A i ʻole makemake paha ʻoe iā Python ma muli o kāna paʻi ʻana, a ʻo ka mea e hana nei e hoʻonāukiuki wale iā ʻoe. ʻO ke kī i ka waiwai o ka paʻi paʻa ʻana, ʻo ia ka pālākiō o nā hoʻonā: ʻoi aku ka nui o kāu papahana, ʻoi aku ka nui o kou hilinaʻi ʻana i ka paʻi paʻa, a i ka hopena, ʻoi aku ka nui o kou pono.

Inā paha ua hiki aku kekahi papahana i ka nui o nā ʻumi kaukani laina, a ua ʻike ʻia aia kekahi mau polokalamu polokalamu e hana nei. Ke nānā nei i kahi papahana like, e pili ana i kā mākou ʻike, hiki iā mākou ke ʻōlelo ʻo ka hoʻomaopopo ʻana i kāna code ke kī i ka mālama ʻana i nā mea hoʻomohala. Me ka ʻole o nā ʻano hōʻike, hiki ke paʻakikī ke noʻonoʻo, no ka laʻana, he aha nā hoʻopaʻapaʻa e hele ai i kahi hana, a i ʻole nā ​​ʻano hana e hiki ke hoʻi. Eia nā nīnau maʻamau i paʻakikī ke pane ʻole me ka hoʻohana ʻole ʻana i nā annotation ʻano:

  • Hiki ke hoʻi kēia hana None?
  • He aha kēia hoʻopaʻapaʻa? items?
  • He aha ke ʻano hiʻohiʻona id: int o ia, str, a i ʻole kekahi ʻano maʻamau?
  • He papa inoa anei kēia hoʻopaʻapaʻa? Hiki paha ke hāʻawi i kahi tuple iā ia?

Inā ʻoe e nānā i kēia snippet code-annotated code a hoʻāʻo e pane i nā nīnau like, ʻike ʻia ʻo kēia ka hana maʻalahi:

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

  • read_metadata ʻaʻole hoʻi None, no ka mea, ʻaʻole ka ʻano hoʻihoʻi Optional[…].
  • Hoopaapaa items he laina laina. ʻAʻole hiki ke hoʻololi wale ʻia.
  • ʻAno id he kaula paita.

Ma kahi honua maikaʻi, manaʻo kekahi e wehewehe ʻia kēlā mau subtleties i loko o ka palapala i kūkulu ʻia (docstring). Akā ʻo ka ʻike e hāʻawi i nā hiʻohiʻona he nui o ka ʻoiaʻiʻo ʻaʻole ʻike pinepine ʻia kēlā mau palapala i ke code āu e hana ai. ʻOiai inā aia kēlā mau palapala i loko o ke code, ʻaʻole hiki i kekahi ke hilinaʻi i kona pololei loa. Hiki i kēia palapala ke pohihihi, pololei ʻole, a wehe ʻia i nā kuhi hewa. I nā hui nui a i ʻole nā ​​papahana nui, hiki i kēia pilikia ke lilo i koʻikoʻi loa.

ʻOiai ʻoi aku ka maikaʻi o Python i ka wā mua a i ʻole ka waena waena o nā papahana, i kekahi manawa hiki i nā papahana kūleʻa a me nā hui e hoʻohana ana iā Python ke alo i kahi nīnau koʻikoʻi: "Pono mākou e kākau hou i nā mea āpau ma kahi ʻōlelo statically type?".

Hoʻoponopono ʻia nā ʻōnaehana nānā e like me mypy i ka pilikia ma luna ma o ka hāʻawi ʻana i ka mea hoʻomohala i kahi ʻōlelo maʻamau no ka wehewehe ʻana i nā ʻano, a ma ka nānā ʻana i kēlā ʻano hoʻolaha e kūlike me ka hoʻokō ʻana o ka papahana (a, ke koho ʻia, ma ka nānā ʻana i ko lākou ola ʻana). Ma keʻano laulā, hiki iā mākou ke ʻōlelo ua kau kēia mau ʻōnaehana i kahi mea e like me nā palapala i nānā pono ʻia.

He mau pono ʻē aʻe ka hoʻohana ʻana i ia mau ʻōnaehana, a ʻaʻole ia he mea ʻole:

  • Hiki i ka ʻōnaehana nānā ʻano ke ʻike i kekahi mau hewa liʻiliʻi (a ʻaʻole liʻiliʻi). ʻO kahi laʻana maʻamau ke poina iā lākou e hana i kahi waiwai None a i ʻole kekahi kūlana kūikawā ʻē aʻe.
  • Hoʻomaʻamaʻa nui ʻia ke code refactoring no ka mea he pololei loa ka ʻōnaehana nānā ʻano e pili ana i ke code e pono e hoʻololi. I ka manawa like, ʻaʻole pono mākou e manaʻolana no ka uhi ʻana o ka code 100% me nā hoʻāʻo, ʻaʻole hiki ke hiki. ʻAʻole pono mākou e komo i loko o ka hohonu o ka ʻōpala hoʻopaʻa ʻana e ʻike i ke kumu o ka pilikia.
  • ʻOiai ma nā papahana nui, hiki i ka mypy ke hana pinepine i ka nānā ʻana i ke ʻano piha i loko o kahi hapa o kekona. A ʻo ka hoʻokō ʻana i nā hoʻokolohua maʻamau he ʻumi kekona a i ʻole mau minuke. Hāʻawi ka ʻōnaehana nānā ʻano i ka mea papahana i ka manaʻo koke a hiki iā ia ke hana wikiwiki i kāna hana. ʻAʻole pono ʻo ia e kākau maʻalahi a paʻakikī hoʻi i ka mālama ʻana i nā hoʻokolohua ʻāpana e hoʻololi i nā mea maoli me nā hoʻohenehene a me nā pākuʻi no ka loaʻa ʻana o nā hopena hōʻike code.

Hoʻohana nā IDE a me nā mea hoʻoponopono e like me PyCharm a i ʻole Visual Studio Code i ka mana o nā ʻano annotation e hāʻawi i nā mea hoʻomohala me ka hoʻopau code, hōʻike hewa, a me ke kākoʻo no nā kūkulu ʻōlelo maʻamau. A ʻo kēia kekahi mau pono o ka paʻi ʻana. No kekahi poʻe polokalamu polokalamu, ʻo kēia ka manaʻo nui o ke kākau ʻana. He mea kēia e pōmaikaʻi koke ma hope o ka hoʻokō. ʻAʻole pono kēia hihia hoʻohana no nā ʻano i kahi ʻōnaehana nānā ʻano ʻokoʻa e like me mypy, ʻoiai pono e hoʻomaopopo ʻia e kōkua ʻo mypy i ka mālama ʻana i nā annotation ʻano me ke code.

Ka hope o mypy

Ua hoʻomaka ka mōʻaukala o mypy ma UK, ma Cambridge, i kekahi mau makahiki ma mua o koʻu komo ʻana i Dropbox. Ua komo au, ma ke ʻano he ʻāpana o kaʻu noiʻi kauka, i ka hoʻohui ʻana i nā ʻōlelo statically typed a me ka ikaika. Ua hoʻoikaika ʻia au e kekahi ʻatikala e pili ana i ka paʻi paʻi ʻana e Jeremy Siek lāua ʻo Walid Taha, a me ka papahana Typed Racket. Ua hoʻāʻo au e ʻimi i nā ala e hoʻohana ai i ka ʻōlelo hoʻolālā like no nā papahana like ʻole - mai nā palapala liʻiliʻi a hiki i nā kumu helu helu he mau miliona mau laina. I ka manawa like, makemake wau e hōʻoia i loko o kahi papahana o kēlā me kēia pālākiō, ʻaʻole pono kekahi e hana i nā kuʻikahi nui loa. ʻO kahi ʻāpana koʻikoʻi o kēia mau mea a pau ʻo ia ka manaʻo o ka neʻe ʻana mai kahi papahana prototype untyped i kahi huahana statically typed hoʻopau piha ʻia. I kēia mau lā, ʻaʻole ʻae ʻia kēia mau manaʻo, akā i ka makahiki 2010 he pilikia ia e noʻonoʻo ʻia nei.

ʻAʻole i kuhikuhi ʻia kaʻu hana mua i ka nānā ʻana iā Python. Akā, ua hoʻohana au i kahi ʻōlelo "homemade" liʻiliʻi Alore. Eia kekahi laʻana e hoʻomaopopo iā ʻoe i ka mea a mākou e kamaʻilio nei (ʻo ke ʻano annotations ke koho ma aneʻi):

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

ʻO ka hoʻohana ʻana i ka ʻōlelo ʻōiwi maʻalahi kahi ala maʻamau i hoʻohana ʻia i ka noiʻi ʻepekema. ʻO kēia ka mea, ʻaʻole ka liʻiliʻi loa no ka mea hiki iā ʻoe ke hana wikiwiki i nā hoʻokolohua, a ma muli o ka mea ʻaʻohe mea e pili ana i ke aʻo ʻana hiki ke maʻalahi ke nānā ʻole ʻia. ʻO nā ʻōlelo hoʻolālā honua maoli ke ʻano nui me nā hoʻokō paʻakikī, e hoʻolōʻihi i ka hoʻokolohua. Eia nō naʻe, he mea kānalua iki nā hopena e pili ana i ka ʻōlelo maʻalahi, no ka mea, i ka loaʻa ʻana o kēia mau hopena, ua kaumaha paha ka mea noiʻi i nā manaʻo koʻikoʻi no ka hoʻohana pono ʻana i nā ʻōlelo.

ʻIke maikaʻi loa kaʻu mea nānā ʻano ʻano no Alore, akā makemake wau e hoʻāʻo iā ia ma ka hoʻāʻo ʻana me ke code maoli, ʻaʻole paha ʻoe i kākau ʻia ma Alore. ʻO ka pōmaikaʻi noʻu, ua hoʻokumu nui ʻia ka ʻōlelo Alore i nā manaʻo like me Python. Ua maʻalahi ka hoʻololi ʻana i ka typechecker i hiki iā ia ke hana me ka syntax a me nā semantics a Python. Ua ʻae kēia iā mākou e hoʻāʻo i ka nānā ʻana i ka code Python open source. Eia hou, ua kākau au i kahi transpiler e hoʻololi i ke code i kākau ʻia ma Alore i ka code Python a hoʻohana ia mea e unuhi i kaʻu codechecker code. I kēia manawa ua loaʻa iaʻu kahi ʻōnaehana nānā ʻano i kākau ʻia ma Python e kākoʻo ana i kahi ʻāpana o Python, kekahi ʻano o kēlā ʻōlelo! (ʻAʻole kūpono i ka Python kekahi mau hoʻoholo hoʻolālā i kūpono no Alore, a ʻike mau ʻia kēia ma nā ʻāpana o ka mypy codebase.)

ʻO ka ʻoiaʻiʻo, ʻaʻole hiki ke kapa ʻia ka ʻōlelo i kākoʻo ʻia e kaʻu ʻano ʻano ʻano Python i kēia manawa: he ʻano ʻokoʻa ia o Python ma muli o kekahi mau palena o ka Python 3 type annotation syntax.

Ua like ia me kahi hui o Java a me Python:

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

ʻO kekahi o kaʻu mau manaʻo i kēlā manawa, ʻo ia ka hoʻohana ʻana i nā annotation type e hoʻomaikaʻi ai i ka hana ma ka hoʻohui ʻana i kēia ʻano Python i C, a i ʻole JVM bytecode. Ua hiki au i ke kahua o ke kākau ʻana i kahi prototype compiler, akā ua haʻalele wau i kēia manaʻo, no ka mea, he mea pono ke nānā ʻana iā ia iho.

Ua hoʻopau wau i ka hōʻike ʻana i kaʻu papahana ma PyCon 2013 ma Santa Clara. Ua kamaʻilio pū wau e pili ana i kēia me Guido van Rossum, ka dictator Python lokomaikaʻi no ke ola. Ua hōʻoiaʻiʻo ʻo ia iaʻu e haʻalele i kaʻu syntax ponoʻī a paʻa me ka syntax Python maʻamau 3. Kākoʻo ʻo Python 3 i nā annotations hana, no laila hiki ke kākau hou ʻia kaʻu hiʻohiʻona e like me ka mea i hōʻike ʻia ma lalo nei, e loaʻa ai kahi papahana Python maʻamau:

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

Pono wau e hana i kekahi mau hoʻohālikelike (ʻo ka mea mua, makemake wau e hoʻomaopopo ua hana wau i kaʻu syntax no kēia kumu). ʻO ka Python 3.3, ka mana hou loa o ka ʻōlelo i kēlā manawa, ʻaʻole i kākoʻo i nā annotation variable. Ua kūkākūkā au me Guido ma ka leka uila i nā mea like ʻole no ka hoʻolālā syntactic o ia mau annotation. Ua hoʻoholo mākou e hoʻohana i nā ʻano manaʻo no nā mea hoʻololi. Hāʻawi kēia i ke kumu i manaʻo ʻia, akā ua paʻakikī loa (Python 3.6 i hāʻawi iā mākou i kahi syntax maikaʻi loa):

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

Hoʻokomo ʻia nā ʻōlelo ʻano e kākoʻo iā Python 2, ʻaʻohe ona kākoʻo i kūkulu ʻia no nā ʻano annotations:

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

Ua ʻike ʻia ʻaʻole koʻikoʻi kēia mau kālepa (a me nā mea ʻē aʻe) - ʻo nā pōmaikaʻi o ka paʻi paʻa ʻana, ua poina koke nā mea hoʻohana i ka syntax liʻiliʻi loa. No ka mea ʻaʻohe syntax kūikawā i hoʻohana ʻia i ka Python code i nānā ʻia, ua hoʻomau nā mea hana Python a me nā kaʻina hana code i ka hana maʻamau, e maʻalahi i nā mea hoʻomohala ke aʻo i ka mea hana hou.

Ua hōʻoiaʻiʻo ʻo Guido iaʻu e hui pū me Dropbox ma hope o koʻu hoʻopau ʻana i kaʻu tesis puka. ʻO kēia kahi e hoʻomaka ai ka mea hoihoi loa o ka moʻolelo mypy.

E hoʻomau 'ia…

E nā mea heluhelu aloha! Inā hoʻohana ʻoe iā Python, e ʻoluʻolu e haʻi mai iā mākou e pili ana i ka nui o nā papahana āu e hoʻomohala ai ma kēia ʻōlelo.

ʻO ke ala e nānā ai i nā laina 4 miliona o ka code Python. Mahele 1
ʻO ke ala e nānā ai i nā laina 4 miliona o ka code Python. Mahele 1

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka