An t-slighe gu bhith a’ sgrìobhadh 4 millean loidhne de chòd Python. Pàirt 1

An-diugh bheir sinn gu d’ aire a’ chiad phàirt den eadar-theangachadh den stuth air mar a bhios Dropbox a’ dèiligeadh ri smachd seòrsa air còd Python.

An t-slighe gu bhith a’ sgrìobhadh 4 millean loidhne de chòd Python. Pàirt 1

Bidh Dropbox a’ sgrìobhadh tòrr ann am Python. Is e cànan a th’ ann a bhios sinn a’ cleachdadh air leth farsaing, an dà chuid airson seirbheisean deireadh-cùil agus tagraidhean teachdaiche deasg. Bidh sinn cuideachd a’ cleachdadh Go, TypeScript agus Rust gu mòr, ach is e Python am prìomh chànan againn. A 'beachdachadh air an sgèile againn, agus tha sinn a' bruidhinn mu mhilleanan de loidhnichean de chòd Python, thionndaidh e a-mach gun robh a bhith a 'taipeadh a' chòd sin gu math nas duilghe a thuigsinn agus thòisich e a 'toirt buaidh mhòr air cinneasachd saothair. Gus an duilgheadas seo a lasachadh, tha sinn air tòiseachadh mean air mhean a’ gluasad ar còd gu sgrùdadh seòrsa statach a’ cleachdadh mypy. Is dòcha gur e seo an siostam sgrùdaidh seòrsa fa leth as mòr-chòrdte airson Python. Tha Mypy na phròiseact le còd fosgailte, bidh na prìomh luchd-leasachaidh aige ag obair ann an Dropbox.

B’ e Dropbox aon de na ciad chompanaidhean a chuir an gnìomh sgrùdadh seòrsa statach ann an còd Python aig an sgèile seo. Tha Mypy air a chleachdadh ann am mìltean de phròiseactan na làithean seo. Tha an inneal seo grunn thursan, mar a chanas iad, "air a dhearbhadh ann am blàr." Tha sinn air slighe fhada a ruighinn gus faighinn gu far a bheil sinn an-dràsta. Air an t-slighe, bha mòran iomairtean neo-shoirbheachail agus deuchainnean air fàiligeadh. Tha an dreuchd seo a’ còmhdach eachdraidh sgrùdadh seòrsa statach ann am Python, bhon toiseach creagach mar phàirt den phròiseact rannsachaidh agam, chun an latha an-diugh, nuair a tha sgrùdadh seòrsa agus sanas seòrsa air fàs cumanta dha luchd-leasachaidh gun àireamh a bhios a’ sgrìobhadh ann am Python. Tha na h-innealan sin a-nis a’ faighinn taic bho iomadh inneal leithid IDEs agus sgrùdairean còd.

Leugh an dàrna pàirt

Carson a tha feum air sgrùdadh seòrsa?

Ma tha thu a-riamh air Python a thaipeadh gu dinamach a chleachdadh, is dòcha gu bheil beagan troimh-chèile agad a thaobh carson a tha an leithid de dh’ obair air a bhith ann mu thaidhpeadh statach agus mypy o chionn ghoirid. No is dòcha gu bheil Python a’ còrdadh riut dìreach air sgàth a thaidhpeadh fiùghantach, agus tha na tha a’ tachairt dìreach gad bhuaireadh. Is e an rud as cudromaiche airson luach clò-sgrìobhaidh statach meud nam fuasglaidhean: mar as motha a tha do phròiseact, is ann as motha a bhios tu a’ leantainn gu clò-sgrìobhadh statach, agus aig a’ cheann thall, is ann as motha a dh’ fheumas tu e.

Seach gu bheil pròiseact sònraichte air ruighinn meud deichean de mhìltean de loidhnichean, agus thionndaidh e a-mach gu bheil grunn phrògraman ag obair air. A’ coimhead air pròiseact coltach ris, stèidhichte air ar n-eòlas, faodaidh sinn a ràdh gum bi a bhith a’ tuigsinn a chòd mar phrìomh dhòigh air luchd-leasachaidh a chumail cinneasach. Às aonais notaichean seòrsa, faodaidh e a bhith duilich obrachadh a-mach, mar eisimpleir, dè na h-argamaidean a thèid a thoirt gu gnìomh, no dè an seòrsa gnìomh a thilleas. Seo ceistean àbhaisteach a tha gu tric duilich am freagairt gun a bhith a’ cleachdadh notaichean seòrsa:

  • An urrainn don ghnìomh seo tilleadh None?
  • Dè bu chòir don argamaid seo a bhith? items?
  • Dè an seòrsa feart id: int A bheil e, str, no 's dòcha seòrsa àbhaisteach?
  • Am bu chòir an argamaid seo a bhith na liosta? A bheil e comasach tuple a thoirt dha?

Ma choimheadas tu air a’ chriomag còd le notaichean seòrsa a leanas agus ma dh’ fheuchas tu ri ceistean coltach ris a fhreagairt, tha e coltach gur e seo an gnìomh as sìmplidh:

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

  • read_metadata nach till None, leis nach eil an seòrsa tilleadh Optional[…].
  • argamaid items 's e sreath de loidhnichean. Chan urrainnear a ràdh air thuaiream.
  • Feart id 's e sreath de bytes a th' ann.

Ann an saoghal a tha air leth freagarrach, bhiodh dùil gum biodh a h-uile subhachas sin air a mhìneachadh anns na sgrìobhainnean togte (docstring). Ach tha eòlas a 'toirt mòran eisimpleirean den fhìrinn gu bheil na sgrìobhainnean sin gu tric nach fhaicear anns a' chòd leis am feum thu a bhith ag obair. Fiù ma tha na sgrìobhainnean sin an làthair anns a 'chòd, chan urrainn dhut cunntadh air cho ceart' sa tha e. Faodaidh na sgrìobhainnean seo a bhith neo-shoilleir, mearachdach, agus fosgailte do mhì-thuigse. Ann an sgiobaidhean mòra no pròiseactan mòra, faodaidh an duilgheadas seo fàs gu math gann.

Fhad ‘s a tha Python air leth math anns na h-ìrean tràtha no eadar-mheadhanach de phròiseactan, aig àm air choreigin is dòcha gum bi a’ cheist dheatamach aig pròiseactan soirbheachail agus companaidhean a bhios a ’cleachdadh Python:“ Am bu chòir dhuinn a h-uile càil ath-sgrìobhadh ann an cànan a tha air a chlò-bhualadh gu statach?

Bidh siostaman sgrùdaidh seòrsa mar mypy a’ fuasgladh na duilgheadas gu h-àrd le bhith a’ toirt cànan foirmeil don leasaiche airson a bhith a’ toirt cunntas air seòrsachan, agus le bhith a’ dèanamh cinnteach gu bheil dearbhaidhean seòrsa a’ freagairt ri buileachadh a’ phrògraim (agus, gu roghnach, le bhith a’ dèanamh cinnteach gu bheil iad ann). San fharsaingeachd, is urrainn dhuinn a ràdh gun do chuir na siostaman sin cothrom dhuinn rudeigin mar sgrìobhainnean air an sgrùdadh gu faiceallach.

Tha buannachdan eile aig cleachdadh nan siostaman sin, agus tha iad mar-thà gu tur neo-bheag:

  • Lorgaidh an siostam sgrùdaidh seòrsa cuid de mhearachdan beaga (agus nach eil cho beag). Is e eisimpleir àbhaisteach nuair a dhìochuimhnicheas iad luach a phròiseasadh None no suidheachadh sònraichte eile.
  • Tha ath-leasachadh còd air a dhèanamh nas sìmplidhe gu mòr leis gu bheil an siostam sgrùdaidh seòrsa gu tric gu math ceart mu dè an còd a dh’ fheumar atharrachadh. Aig an aon àm, chan fheum sinn a bhith an dòchas còmhdach còd 100% le deuchainnean, a tha, ann an suidheachadh sam bith, mar as trice chan eil e ion-dhèanta. Chan fheum sinn a dhol a-steach do dhoimhneachd lorg na stac gus faighinn a-mach adhbhar na trioblaid.
  • Eadhon air pròiseactan mòra, faodaidh mypy gu tric làn sgrùdadh seòrsa a dhèanamh ann am bloigh de dhiog. Agus mar as trice bheir coileanadh deuchainnean deichean de dhiog no eadhon mionaidean. Bheir an siostam sgrùdaidh seòrsa fios air ais don phrògramadair sa bhad agus leigidh e leis an obair aige a dhèanamh nas luaithe. Chan fheum e tuilleadh a bhith a’ sgrìobhadh deuchainnean aonaid cugallach agus duilich a chumail a chuireas magadh is badan an àite fìor bhuidhnean dìreach airson toraidhean deuchainn còd fhaighinn nas luaithe.

Bidh IDEan agus luchd-deasachaidh leithid PyCharm no Visual Studio Code a’ cleachdadh cumhachd notaichean seòrsa gus crìochnachadh còd a thoirt do luchd-leasachaidh, comharrachadh mhearachdan, agus taic airson togail cànain a thathas a’ cleachdadh gu cumanta. Agus is iad seo dìreach cuid de na buannachdan bho bhith a’ taipeadh. Airson cuid de luchd-prògramaidh, is e seo am prìomh argamaid airson taidhpeadh. Is e seo rudeigin a gheibh buannachd dìreach às deidh a bhuileachadh. Chan fheum a’ chùis cleachdaidh seo airson seòrsaichean siostam sgrùdaidh seòrsa air leth mar mypy, ged a bu chòir a thoirt fa-near gu bheil mypy a’ cuideachadh le bhith a’ cumail notaichean seòrsa a rèir còd.

Cùl-fhiosrachadh mypy

Thòisich eachdraidh mypy anns an RA, ann an Cambridge, beagan bhliadhnaichean mus deach mi a-steach do Dropbox. Tha mi air a bhith an sàs, mar phàirt den rannsachadh dotaireil agam, ann a bhith ag aonachadh chànanan a tha sgrìobhte gu staitigeach agus fiùghantach. Bha mi air mo bhrosnachadh le artaigil air clò-sgrìobhadh mean air mhean le Jeremy Siek agus Walid Taha, agus leis a’ phròiseact Typed Racket. Dh’ fheuch mi ri dòighean a lorg gus an aon chànan prògramaidh a chleachdadh airson diofar phròiseactan - bho sgriobtaichean beaga gu bunaitean còd anns an robh mòran mhilleanan de loidhnichean. Aig an aon àm, bha mi airson dèanamh cinnteach ann am pròiseact de sgèile sam bith, nach fheumadh duine co-rèiteachadh ro mhòr a dhèanamh. B’ e pàirt chudromach de seo uile am beachd a bhith a’ gluasad mean air mhean bho phròiseact prototype nach deach a chlò-bhualadh gu toradh crìochnaichte làn-dhearbhte le clò-sgrìobhadh staitigeach. An-diugh, thathas a’ gabhail ris na beachdan sin gu ìre mhòr mar thabhartas, ach ann an 2010 bha e na dhuilgheadas a bha fhathast ga sgrùdadh gu gnìomhach.

Cha robh an obair thùsail agam ann an sgrùdadh seòrsa ag amas air Python. An àite sin, chleachd mi cànan beag “homemade”. Alore. Seo eisimpleir a leigeas leat tuigse fhaighinn air na tha sinn a’ bruidhinn (tha notaichean seòrsa roghainneil an seo):

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

Tha cleachdadh cànan dùthchasach nas sìmplidhe na dhòigh-obrach cumanta a thathar a’ cleachdadh ann an rannsachadh saidheansail. Tha seo fìor, gu h-àraidh air sgàth gu bheil e a 'toirt cothrom dhut deuchainnean a dhèanamh gu luath, agus cuideachd air sgàth' s gu bheil e furasta dearmad a dhèanamh air dè nach eil ri dhèanamh leis an sgrùdadh. Tha cànanan prògramadh an t-saoghail buailteach a bhith nan iongantasan mòra le buileachadh iom-fhillte, agus tha seo a’ slaodadh sìos deuchainneachd. Ach, tha toraidhean sam bith stèidhichte air cànan nas sìmplidhe a’ coimhead rud beag amharasach, oir ann a bhith a’ faighinn nan toraidhean sin is dòcha gu bheil an neach-rannsachaidh air ìobairtean a dhèanamh a tha cudromach airson cleachdadh practaigeach chànanan.

Bha an seòrsa inneal-dearbhaidh agam airson Alore a’ coimhead gu math gealltanach, ach bha mi airson a dhearbhadh le bhith a’ feuchainn a-mach le fìor chòd, nach robh, is dòcha a chanas tu, sgrìobhte ann an Alore. Gu fortanach dhòmhsa, bha cànan Alore gu ìre mhòr stèidhichte air na h-aon bheachdan ri Python. Bha e furasta gu leòr an typechecker ath-dhèanamh gus an obraicheadh ​​e le co-chòrdadh Python agus semantics. Leig seo leinn feuchainn ri sgrùdadh a dhèanamh ann an còd Python le còd fosgailte. A bharrachd air an sin, sgrìobh mi transpiler gus còd sgrìobhte ann an Alore a thionndadh gu còd Python agus chleachd mi e gus mo chòd typechecker eadar-theangachadh. A-nis bha siostam sgrùdaidh seòrsa agam sgrìobhte ann am Python a thug taic do fho-sheata de Python, seòrsa air choreigin den chànan sin! (Bha cuid de cho-dhùnaidhean ailtireil a bha ciallach dha Alore gu math freagarrach airson Python, agus tha seo fhathast ri fhaicinn ann am pàirtean den mypy codebase.)

Gu dearbh, cha b’ urrainn don chànan a tha a’ faighinn taic bhon t-seòrsa siostam agam a bhith air ainmeachadh mar Python aig an ìre seo: b’ e tionndadh de Python a bh’ ann air sgàth cuid de chuingealachaidhean ann an co-chòrdadh notaichean seòrsa Python 3.

Bha e coltach ri measgachadh de Java agus Python:

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

B’ e aon de na beachdan a bh’ agam aig an àm notaichean seòrsa a chleachdadh gus coileanadh a leasachadh le bhith a’ cur ri chèile an seòrsa Python gu C, no is dòcha JVM bytecode. Ràinig mi an ìre de bhith a’ sgrìobhadh prototype cruinneachaidh, ach thrèig mi am beachd seo, leis gu robh sgrùdadh seòrsa fhèin a’ coimhead gu math feumail.

Chrìochnaich mi a’ taisbeanadh mo phròiseact aig PyCon 2013 ann an Santa Clara. Bhruidhinn mi mu dheidhinn seo cuideachd le Guido van Rossum, an deachdaire math Python airson beatha. Thug e cinnteach dhomh mo cho-chòrdadh fhìn a leigeil sìos agus cumail ris a’ cho-chòrdadh àbhaisteach Python 3. Tha Python 3 a’ toirt taic do notaichean gnìomh, agus mar sin dh’ fhaodadh an eisimpleir agam a bhith air ath-sgrìobhadh mar a chithear gu h-ìosal, a’ leantainn gu prògram Python àbhaisteach:

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

B’ fheudar dhomh co-rèiteachadh a dhèanamh (an toiseach, tha mi airson a thoirt fa-near gun do chruthaich mi mo cho-chòrdadh fhìn airson an dearbh adhbhar seo). Gu sònraichte, cha do chuir Python 3.3, an tionndadh as ùire den chànan aig an àm, taic ri notaichean caochlaideach. Bhruidhinn mi ri Guido air post-d diofar chothroman airson dealbhadh syntactic de na notaichean sin. Cho-dhùin sinn seòrsa de bheachdan a chleachdadh airson caochladairean. Bha seo a’ frithealadh an adhbhair a bha san amharc, ach bha e caran trom (thug Python 3.6 dhuinn co-chòrdadh nas fheàrr):

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

Thàinig beachdan seòrsa a-steach cuideachd gus taic a thoirt do Python 2, aig nach eil taic stèidhichte airson notaichean seòrsa:

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

Thionndaidh e a-mach nach robh na malairtidhean sin (agus eile) gu diofar - bha buannachdan clò-sgrìobhaidh statach a ’ciallachadh gun do dhìochuimhnich luchd-cleachdaidh a dh’ aithghearr mu cho-chòrdadh nach robh cho math. Leis nach deach structaran syntactic sònraichte a chleachdadh anns a’ chòd Python a chaidh a sgrùdadh le seòrsa, lean na h-innealan Python agus pròiseasan giullachd còd ag obair gu h-àbhaisteach, ga dhèanamh fada nas fhasa do luchd-leasachaidh an inneal ùr ionnsachadh.

Thug Guido cuideachd cinnteach dhomh a dhol còmhla ri Dropbox às deidh dhomh mo thràchdas ceumnaiche a chrìochnachadh. Seo far a bheil am pàirt as inntinniche den sgeulachd mypy a’ tòiseachadh.

Ri leantainn ...

Luchd leughaidh! Ma chleachdas tu Python, feuch an innis thu dhuinn dè an ìre de phròiseactan a leasaicheas tu sa chànan seo.

An t-slighe gu bhith a’ sgrìobhadh 4 millean loidhne de chòd Python. Pàirt 1
An t-slighe gu bhith a’ sgrìobhadh 4 millean loidhne de chòd Python. Pàirt 1

Source: www.habr.com

Cuir beachd ann