Ko te ara ki te tirotiro i te 4 miriona rarangi o te waehere Python. Wāhanga 1

I tenei ra ka tukuna atu e matou ki a koe te waahanga tuatahi o te whakamaoritanga o nga korero mo te mahi a Dropbox ki te whakahaere momo waehere Python.

Ko te ara ki te tirotiro i te 4 miriona rarangi o te waehere Python. Wāhanga 1

He maha nga tuhi a Dropbox ki Python. He reo tenei e whakamahia whanuitia ana e matou - mo nga ratonga tuara me nga tono a te kiritaki papamahi. He nui hoki ta matou whakamahi i te Haere, TypeScript me Rust, engari ko te Python to matou reo matua. Ma te whakaaro ki ta maatau tauine, a e korero ana matou mo nga miriona rarangi o te waehere Python, i puta mai ko te patopato hihiri o taua waehere kaore i tino uaua tona maarama, ka tiimata te pa ki te hua o nga mahi. Hei whakaiti i tenei take, kua timata taatau ki te whakawhiti i to maatau waehere ki te tirotiro momo pateko ma te whakamahi i te mypy. Koinei pea te punaha arowhai momo tino rongonui mo Python. Ko Mypy he kaupapa puna tuwhera, ko nga kaihanga matua e mahi ana i Dropbox.

Ko Dropbox tetahi o nga kamupene tuatahi ki te whakatinana i nga momo tirotiro i roto i te waehere Python i tenei tauine. Ka whakamahia a Mypy i roto i nga mano o nga kaupapa i enei ra. Ko tenei taputapu, e kii ana ratou, "kua whakamatauria i te pakanga" i nga wa maha. He tawhiti rawa te huarahi kia tae atu ki te waahi e noho nei matou. He maha nga mahi kaore i angitu me nga whakamatautau i rahua i te huarahi. Ko tenei waahanga e whakaatu ana i te hitori o te arowhai momo pateko i roto i te Python, mai i te timatanga o te toka hei waahanga o taku kaupapa rangahau matauranga tae noa mai ki tenei ra, i te wa kua kitea nga arowhai momo me nga tohu tohu i waenga i nga kaihanga Python maha. Kei te tautokohia enei tikanga e te maha o nga taputapu, penei i nga IDE me nga kaitirotiro waehere.

Panuihia te waahanga tuarua

He aha te take me arowhai momo?

Mēnā kua whakamahi koe i te Python patopato hihiri, kei te rangirua pea koe he aha te take i nui ai te ngangau mo te patopato pateko me te mypy i enei ra. Ko te mea pea he pai ki a koe a Python na te kaha o tana patopato, a ko nga mea e pa ana ka raru koe. Ko te mea nui ki te uara o te patopato pateko ko te tauine o nga whakatau: ko te nui ake o to kaupapa, ko te kaha ake o to whakaaro ki te patopato pateko, a, i te mutunga, ka tino hiahia koe.

Me kii kua eke te kaupapa ki te tekau mano tini o nga rarangi te rahi, a, kua kitea he maha nga kaiwhakaputa hötaka e mahi ana. I te wa e whakaarohia ana he kaupapa penei, i runga i o maatau wheako, ka taea e taatau te kii ko te maarama ki tana waehere te mea matua ki te pupuri i te hua o te kaiwhakawhanake. Ki te kore he momo tuhipoka, he uaua ki te mohio, hei tauira, he aha nga tohenga me tuku ki tetahi mahi, he aha nga momo uara ka taea e tetahi mahi te hoki mai. Anei nga paatai ​​angamaheni he uaua ki te whakautu me te kore e whakamahi momo tuhipoka:

  • Ka taea te hoki mai tenei mahi None?
  • Me aha tenei tautohetohe? items?
  • He aha te momo huanga id: int ko ia, str, etahi momo ritenga ranei?
  • Me noho tenei tautohe hei rarangi? Ka taea te tuku tuple ki roto?

Mena ka titiro koe ki te momo-whakaahua waehere e whai ake nei ka ngana ki te whakautu i nga paatai ​​penei, ka kitea he mahi ngawari tenei:

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

  • read_metadata e kore e hoki mai Noneno te mea ko te momo hokinga kaore Optional[…].
  • tautohe items he raupapa rarangi. E kore e taea te tukurua i roto i tetahi raupapa.
  • Huanga id he aho paita.

I roto i te ao tino pai, ka whakaaro tetahi ka whakaahuahia enei momo hianga katoa i roto i nga tuhinga whakauru (docstring). Engari ko te wheako he maha nga tauira e kore e kitea i roto i te waehere e mahi ana koe. Ahakoa kei roto enei tuhinga i te waehere, kaore e taea e koe te whakawhirinaki ki tona tika. Ko tenei tuhinga kaore pea i te marama, kaore i te tika, ka tuwhera ki te pohehe. I roto i nga roopu nui, i nga kaupapa nui ranei, ka tino kaha ake tenei raru.

Ahakoa he pai a Python i roto i nga kaupapa o mua, waenga-waahi ranei, i etahi wa ko nga kaupapa angitu me nga kamupene e whakamahi ana i te Python ka pa ki tetahi patai nui: "Me tuhi ano tatou i nga mea katoa ki te reo patopato?"

Ko nga punaha arowhai momo penei i te mypy ka whakatau i te raru i runga ake nei ma te tuku reo okawa ki te kaiwhakawhanake mo te whakaahua momo, me te tirotiro kei te rite nga whakapuakanga momo ki te whakatinanatanga o te papatono (me te kore, te tirotiro mo te noho tonu). I te nuinga o te waa, ka taea e matou te kii ko enei punaha e whakarato ana ki a matou tetahi mea penei i nga tuhinga kua whakamanahia.

Ko te whakamahinga o enei punaha he maha atu nga painga, a he tino kore noa iho:

  • Ka taea e te punaha arowhai momo te kite i etahi hapa iti (kaore ano i te iti). He tauira angamaheni ka wareware ratou ki te tukatuka i tetahi uara None etahi atu ahuatanga motuhake ranei.
  • He tino whakangwarihia te waehere refactoring na te mea he maha nga wa ka korerohia e te kaitaki momo he aha te waehere hei whakarereke. I te wa ano, kaore e tika kia whakawhirinaki ki te 100% te whakamaarama whakamatautau o te waehere, kaore e taea i roto i tetahi keehi. Karekau e tika kia keri hohonu ki roto i nga purongo whakapapa kia mohio ai he aha te he.
  • Ahakoa i runga i nga kaupapa nui, he maha nga wa ka taea e mypy te tirotiro momo katoa i roto i te hautanga o te rua. A ko te whakahaere i nga whakamatautau he tekau hēkona, he meneti ranei. Ko te punaha arowhai momo ka tuku urupare inamata ki te kaihōtaka me te tuku kia tere ake tana mahi. Kare e hiahia ana ia ki te tuhi he ngoikore me te uaua ki te pupuri i nga whakamatautau wae hei whakakapi i nga hinonga tuuturu ki nga tawai me nga papanga kia tere ake ai nga hua whakamatautau waehere.

Ka whakamahia e nga IDE me nga kaiwhakatikatika penei i te PyCharm, Visual Studio Code ranei te mana o nga momo tuhipoka hei whakarato ki nga kaiwhakawhanake te whakaoti waehere aunoa, te tohu hapa, me te tautoko mo nga hanga reo e whakamahia nuitia ana. A koinei etahi o nga painga e whakaratohia ana e te tohu. Mo etahi kaihōtaka, koinei te tohenga matua mo te patopato. He mea tenei ka whai hua i muri tonu i te whakatinanatanga. Ko tenei keehi mo nga momo kaore e hiahiatia he punaha tirotiro momo motuhake penei i te mypy, ahakoa me tohu ka awhina a mypy ki te pupuri i te rite i waenga i nga momo tuhipoka me te waehere.

Mypy papamuri

I timata te korero mypy i te UK, i Cambridge, i etahi tau i mua i taku urunga atu ki Dropbox. Hei wahanga o taku rangahau kairangi, i mahi ahau i te take o te whakakotahi i nga reo patopato me nga reo hihiri. Na Jeremy Siek raua ko Walid Tah i whakahihiko ahau mo te tuhi mo te patopato, tae atu ki te kaupapa Typed Racket. I ngana ahau ki te rapu huarahi ki te whakamahi i te reo hootaka kotahi mo nga kaupapa rereke - mai i nga tuhinga iti ki nga turanga waehere he maha nga miriona rarangi. I taua wa ano, i pirangi ahau ki te whakarite kia kore ahau e nui rawa te whakararu i roto i tetahi kaupapa. Ko tetahi waahanga nui o enei mea katoa ko te whakaaro ki te neke haere mai i tetahi kaupapa tauira kaore i patohia ki tetahi hua kua oti te whakamatauria, kua oti te patopato. Ko te nuinga o enei whakaaro ka pohehe i enei ra, engari i te tau 2010 he take kei te kaha rangahauhia.

Ko taku mahi tuatahi mo te arowhai momo kaore i aro ki te Python. Engari i whakamahia e ahau he reo "whare kainga" iti Alore. Anei tetahi tauira hei whakaatu ki a koe he aha ta matou e korero nei (he mea kowhiria nga momo tuhipoka):

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

Ko te whakamahi i te reo ngawari o taau ake hoahoa he huarahi e whakamahia ana i roto i te rangahau pūtaiao. He penei, na te mea ka taea te whakahaere tere i nga whakamatautau, na te mea ko nga mea karekau e pa ana ki te rangahau ka ngawari te warewarehia. Ko nga reo hootaka ora-a-tinana he ahuatanga nui-nui me nga whakatinanatanga uaua, e whakaroa ana i te whakamatautau. Heoi ano, ko nga hua i ahu mai i te reo ngawari he iti noa te whakaaro, na te mea i te whiwhinga o enei hua ka paopao pea te kairangahau i nga whakaaro nui mo te whakamahinga o nga reo.

He tino pai taku kaitaki momo mo Alore, engari i pirangi au ki te whakamatau ma te whakamatau i nga waehere pono kaore i tuhia ki Alore. Waimarie ki ahau, i ahu mai te reo Alore i runga i nga whakaaro rite ki te Python. He ngawari noa ki te hoahoa ano i te kaitaki momo kia taea ai te mahi me te wetereo a Python me nga kupu kupu. Na tenei ka taea e matou te ngana ki te tirotiro momo i te waehere Python puna tuwhera. I tuhia ano e ahau he transpiler hei huri i te Waehere Alore ki te waehere Python ka whakamahia hei whakamaori i taku tohu taki momo. Inaianei kua tuhia e au tetahi punaha taki momo ki te reo Python e tautoko ana i tetahi waahanga o te Python, he rerekeetanga o tera reo! (Ko etahi o nga whakataunga hoahoanga e tika ana mo Alore he mea tino pai mo Python; kei te kitea tonu tenei i etahi wahanga o te mypy codebase.)

Ko te tikanga, ko te reo e tautokohia ana e taku momo punaha kaore e taea te kiia ko Python i tenei wa: he rerekee no Python na etahi herenga o te wetereo tuhituhi momo a Python 3.

He rite ki te ranunga o Java me Python:

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

Ko tetahi o aku whakaaro i tera wa ko te whakamahi momo tuhipoka hei whakapai ake i nga mahi ma te whakahiato i tenei reka o Python ki roto i te C, ki te JVM bytecode ranei. I tae ahau ki te waahi ki te tuhi i tetahi kaitoi tauira, engari i whakarerea tenei whakaaro na te mea he ahua pai te tirotiro momo.

I mutu taku whakaatu i taku kaupapa i PyCon 2013 i Santa Clara. I korero ano ahau mo tenei ki a Guido van Rossum, te kaitakawaenga a Python mo te oranga. I whakatenatena ia i ahau ki te whakakore i taku wetereo ritenga me te piri ki te wetereo Python 3. Ka tautoko a Python 3 i nga tuhinga mahi, na reira ka taea te tuhi ano i taku tauira penei i raro nei, ka puta he kaupapa Python noa:

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

Me mahi au i etahi whakararu (tuatahi, me tohu ahau koinei te take i tito ai ahau i taku ake wetereo). Ina koa, ko te Python 3.3, te putanga hou o te reo i tera wa, kaore i te tautoko i nga korero rereke. I korerohia e au nga momo whiringa syntactic mo enei korero ki a Guido ma te imeera. I whakatau matou ki te whakamahi momo korero mo nga taurangi. I tutuki tenei i te whainga, engari he ahua uaua (Python 3.6 i homai he wetereo pai ake):

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

He pai hoki nga korero momo mo te tautoko i te Python 2, karekau he tautoko mo nga momo tuhipoka:

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

Ko te ahua ko enei (me etahi atu) kare he mea nui - ko nga painga o te patopato pateko te tikanga ka wareware tonu nga kaiwhakamahi ki te wetereo iti ake i te tino pai. I te mea kua kore te waehere Python e whakahaere ana i nga momo i whakamahi i te wetereo motuhake, ka haere tonu nga taputapu Python me nga tukanga waehere, he maamaa ake mo nga kaiwhakawhanake te ako i te taputapu hou.

Na Guido ano ahau i whakaae kia uru atu ahau ki Dropbox i muri i taku whakaotinga i taku tuhinga whakapae matua. Koinei te waahi ka timata te mea tino pai o te hitori o mypy.

Kia haere tonu ...

E nga kaipānui aroha! Mena kei te whakamahi koe i te Python, tena koa korero mai mo te nui o nga kaupapa ka whakawhanakehia e koe i roto i tenei reo.

Ko te ara ki te tirotiro i te 4 miriona rarangi o te waehere Python. Wāhanga 1
Ko te ara ki te tirotiro i te 4 miriona rarangi o te waehere Python. Wāhanga 1

Source: will.com

Tāpiri i te kōrero