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.
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.
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ʻiNone
, no ka mea, ʻaʻole ka ʻano hoʻihoʻiOptional[…]
.- 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
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.
Source: www.habr.com