An cosán chun clóscríobh a dhéanamh ar 4 mhilliún líne de chód Python. Cuid 1

Inniu díreoimid d’aird ar an gcéad chuid den aistriúchán ar ábhar faoin gcaoi a ndéileálann Dropbox le rialú cineáil cóid Python.

An cosán chun clóscríobh a dhéanamh ar 4 mhilliún líne de chód Python. Cuid 1

Scríobhann Dropbox go leor i Python. Is teanga í seo a úsáidimid thar a bheith forleathan - le haghaidh seirbhísí inneall agus feidhmchláir cliant deisce araon. Úsáidimid Go, TypeScript agus Rust go leor freisin, ach is é Python ár bpríomhtheanga. Ag cur san áireamh ár scála, agus muid ag caint faoi na milliúin línte de chód Python, d'éirigh sé amach go raibh clóscríobh dinimiciúil de chód den sórt sin casta gan ghá a thuiscint agus thosaigh sé ag cur isteach go mór ar tháirgiúlacht saothair. Chun an tsaincheist seo a mhaolú, tá tús curtha againn ag aistriú ár gcód de réir a chéile chuig seiceáil cineál statach ag baint úsáide as mypy. Is dócha gurb é seo an córas seiceála cineál aonair is coitianta do Python. Is tionscadal foinse oscailte é Mypy, a oibríonn a phríomhfhorbróirí ag Dropbox.

Bhí Dropbox ar cheann de na chéad chuideachtaí a chuir seiceáil cineál statach i bhfeidhm i gcód Python ag an scála seo. Úsáidtear Mypy i mílte tionscadal na laethanta seo. De réir mar a deir siad, rinneadh “tástáil catha” ar an uirlis seo arís agus arís eile. Bhí orainn teacht i bhfad chun an áit a bhfuilimid anois a bhaint amach. Is iomaí iarracht nár éirigh leo agus teipthe turgnaimh feadh na slí. Déanann an píosa seo cur síos ar stair na seiceála cineál statach i Python, óna thús creagach mar chuid de mo thionscadal taighde acadúil go dtí an lá atá inniu ann, nuair a bhíonn seiceálacha cineáil agus leideanna cineáil coitianta i measc fhorbróirí iomadúla Python. Tacaíonn éagsúlacht uirlisí leis na meicníochtaí seo anois, mar IDEanna agus anailíseoirí cód.

Léigh cuid a dó

Cén fáth a bhfuil seiceáil cineáil de dhíth?

Má bhain tú úsáid riamh as Python clóscríofa go dinimiciúil, b'fhéidir go bhfuil beagán mearbhall ort maidir le cén fáth go raibh an oiread sin fuss faoi chlóscríobh statach agus mypy le déanaí. Nó b'fhéidir go dtaitníonn Python leat go beacht mar gheall ar a chlóscríobh dinimiciúil, agus go gcuireann an méid atá ag tarlú isteach ort. Is í an eochair do luach clóscríobh statach ná scála na gcinntí: dá mhéad do thionscadal, is mó a leanann tú i dtreo clóscríobh statach, agus, ar deireadh thiar, is mó a theastaíonn uait i ndáiríre.

Ligean le rá go bhfuil tionscadal bainte amach na mílte línte i méid, agus tharla sé go raibh roinnt ríomhchláraitheoirí ag obair air. Agus tionscadal mar seo á bhreithniú againn, bunaithe ar ár dtaithí, is féidir linn a rá go mbeidh tuiscint a chód ríthábhachtach chun táirgiúlacht fhorbróra a chothabháil. Gan nótaí cineáil, is féidir go mbeadh sé deacair a dhéanamh amach, mar shampla, cad iad na hargóintí ba cheart a chur ar aghaidh chuig feidhm, nó cad iad na cineálacha luachanna is féidir le feidhm áirithe a thabhairt ar ais. Seo ceisteanna tipiciúla atá deacair a fhreagairt go minic gan nótaí cineáil a úsáid:

  • An féidir leis an bhfeidhm seo filleadh None?
  • Cad ba cheart a bheith san argóint seo? items?
  • Cad é an cineál tréithe id: int an bhfuil, str, nó b'fhéidir de chineál éigin saincheaptha?
  • Ar cheart gur liosta é an argóint seo? An féidir tuple a chur isteach ann?

Má fhéachann tú ar an mblúire cód cineál-anótáilte seo a leanas agus má dhéanann tú iarracht ceisteanna mar seo a fhreagairt, is cosúil gur tasc simplí é seo:

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

  • read_metadata ní fhilleann Nonetoisc nach bhfuil an cineál tuairisceáin Optional[…].
  • Argóint items is seicheamh línte é. Ní féidir é a athrá in aon ord.
  • Tréith id is teaghrán beart é.

I saol idéalach, bheifí ag súil go ndéanfaí cur síos ar gach subtleties den sórt sin sa doiciméadú ionsuite (docstring). Ach cuireann taithí a lán samplaí ar fáil nach minic a bhreathnaítear ar dhoiciméadú den sórt sin sa chód a gcaithfidh tú oibriú leis. Fiú má tá a leithéid de dhoiciméadú sa chód, ní féidir brath ar a chruinneas iomlán. D’fhéadfadh an doiciméadú seo a bheith doiléir, míchruinn, agus d’fhéadfadh míthuiscint a bheith ann. I bhfoirne móra nó tionscadail mhóra, féadann an fhadhb seo éirí an-ghéar.

Cé go bhfuil sármhaitheas ag Python i dtionscadail luatha nó lárchéime, ag am éigin d’fhéadfadh ceist ríthábhachtach a bheith ag tionscadail rathúla agus cuideachtaí a bhaineann úsáid as Python: “Ar cheart dúinn gach rud a athscríobh i dteanga chlóscríofa go seasta?”

Réitíonn córais seiceála cineáil mar mypy an fhadhb thuas trí theanga fhoirmiúil a sholáthar don fhorbróir chun cur síos a dhéanamh ar chineálacha, agus trína sheiceáil go bhfuil dearbhuithe cineáil ag teacht le cur i bhfeidhm an chláir (agus, de rogha, seiceáil an bhfuil siad ann). Go ginearálta, is féidir linn a rá go soláthraíonn na córais seo rud éigin cosúil le doiciméadú fíoraithe go cúramach dúinn.

Tá buntáistí eile ag baint le córais den sórt sin a úsáid, agus tá siad go hiomlán neamhfhánach:

  • Is féidir leis an gcóras seiceála cineáil roinnt mionearráidí (agus nach bhfuil chomh beag) earráidí a bhrath. Is sampla tipiciúil é nuair a dhéanann siad dearmad ar luach a phróiseáil None nó riocht speisialta éigin eile.
  • Tá cód athmhéadaithe simplithe go mór mar is minic a insíonn an seiceálaí cineál duit go díreach cad é an cód is gá a athrú. Ag an am céanna, ní gá dúinn a bheith ag brath ar chlúdach tástála 100% ar an gcód, rud atá dodhéanta de ghnáth in aon chás. Ní gá dúinn tochailt domhain a dhéanamh i dtuarascálacha rian-stack le fáil amach cad atá mícheart.
  • Fiú amháin ar thionscadail mhóra, is minic gur féidir le mypy seiceáil cineál iomlán a dhéanamh i gcodán soicind. Agus de ghnáth tógann sé na deich soicind nó fiú nóiméad a rith tástálacha. Tugann an córas seiceála cineáil aiseolas don ríomhchláraitheoir ar an toirt agus ligeann sé dó a chuid oibre a dhéanamh níos tapúla. Ní gá dó tástálacha aonaid a scríobh atá leochaileach agus deacair a choimeád a chuireann mocks agus paistí in ionad aonáin réadacha ach chun torthaí tástála cód níos tapúla a fháil.

Úsáideann IDEanna agus eagarthóirí ar nós PyCharm nó Visual Studio Code cumhacht na nótaí cineáil chun comhlánú uathoibríoch cód a sholáthar d’fhorbróirí, aibhsiú earráidí, agus tacaíocht do thógálacha teanga a úsáidtear go coitianta. Agus is iad seo ach cuid de na buntáistí a sholáthraíonn clóscríobh. I gcás roinnt ríomhchláraitheoirí, is é seo go léir an phríomh-argóint i bhfabhar clóscríobh. Is rud é seo a thugann buntáistí díreach tar éis é a chur i bhfeidhm. Ní éilíonn an cás úsáide seo do chineálacha córas seiceála cineáil ar leith ar nós mypy, cé gur chóir a thabhairt faoi deara go gcabhraíonn mypy le comhsheasmhacht a choinneáil idir nótaí cineáil agus cód.

Cúlra Mypy

Thosaigh an scéal mypy sa RA, i Cambridge, cúpla bliain sula ndeachaigh mé isteach i Dropbox. Mar chuid de mo thaighde dochtúireachta, d'oibrigh mé ar cheist na dteangacha dinimiciúla agus clóscríofa a aontú. Bhí mé spreagtha ag alt faoi chlóscríobh incriminteach le Jeremy Siek agus Walid Tah, chomh maith leis an tionscadal Typed Racket. Rinne mé iarracht bealaí a aimsiú chun an teanga ríomhchlárúcháin chéanna a úsáid le haghaidh tionscadail éagsúla - ó scripteanna beaga go bunachair cód comhdhéanta de na milliúin línte. Ag an am céanna, theastaigh uaim a chinntiú i dtionscadal ar scála ar bith nach mbeadh orm an iomarca comhréitigh a dhéanamh. Cuid thábhachtach de seo ar fad ab ea an smaoineamh ar aistriú de réir a chéile ó thionscadal fréamhshamhail neamhchlóite go dtí táirge críochnaithe a bhí clóscríofa go statach agus a thástáiltear go cuimsitheach. Glactar leis na smaointe seo den chuid is mó na laethanta seo, ach i 2010 bhí sé ina cheist a bhí fós á taighde go gníomhach.

Ní raibh mo chuid oibre tosaigh i seiceáil cineáil dírithe ar Python. Ina áit sin d'úsáid mé teanga bheag "homemade". Alore. Seo sampla chun smaoineamh a thabhairt duit ar a bhfuilimid ag caint (tá nótaí cineáil roghnach):

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

Is cur chuige coitianta a úsáidtear i dtaighde eolaíoch é teanga shimplithe de do dhearadh féin a úsáid. Tá sé seo amhlaidh, go háirithe toisc go bhfágann sé seo gur féidir turgnaimh a dhéanamh go tapa, agus freisin toisc gur féidir neamhaird a dhéanamh go héasca ar cad nach mbaineann leis an taighde. De ghnáth is feiniméin ar scála mór iad teangacha ríomhchlárúcháin fíorshaol le feidhmiúcháin chasta, rud a mhoillíonn turgnamh. Mar sin féin, is beag amhras a bhíonn ar thorthaí bunaithe ar theanga shimplithe, mar agus na torthaí seo á bhfáil go bhféadfadh an taighdeoir nithe a bhí tábhachtach d’úsáid phraiticiúil teangacha a íobairt.

Bhí cuma an-gheallta ar mo sheiceálaí cineál do Alore, ach bhí mé ag iarraidh é a thástáil trí fhíorchód a thástáil nach raibh scríofa in Alore i ndáiríre. Ar ámharaí an tsaoil, bhí an teanga Alore bunaithe den chuid is mó ar na smaointe céanna le Python. Bhí sé éasca go leor an seiceálaí cineáil a athdhearadh ionas go n-oibreodh sé le comhréir Python agus le semantics. Thug sé seo deis dúinn iarracht a dhéanamh seiceáil cineáil a dhéanamh i gcód foinse oscailte Python. Scríobh mé trasraitheoir freisin chun cód Alore a thiontú go cód Python agus d'úsáid mé é chun mo chód seiceála cineál a aistriú. Anois bhí córas seiceála cineál agam scríofa i Python a thacaigh le fo-thacar de Python, roinnt éagsúlachta sa teanga sin! (Ní raibh cinntí ailtireachta áirithe a bhain ciall le Alore oiriúnach do Python; tá sé seo le feiceáil fós i gcodanna áirithe den mypy codebase.)

Go deimhin, níorbh fhéidir Python a thabhairt ar an teanga a fhaigheann tacaíocht ó mo chóras cineáil ag an bpointe seo: bhí sé ina mhalairt de Python mar gheall ar theorainneacha áirithe ar chomhréir nótaí cineáil Python 3.

Bhí cuma meascán de Java agus Python air:

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

Ba é ceann de na smaointe a bhí agam ag an am ná nótaí cineáil a úsáid chun feidhmíocht a fheabhsú tríd an blas seo de Python a thiomsú go C, nó b'fhéidir i bytecode JVM. Bhain mé an chéim le tiomsaitheoir fréamhshamhail a scríobh, ach thréig mé an smaoineamh seo mar bhí seiceáil cineál féin sách úsáideach.

Chríochnaigh mé mo thionscadal a chur i láthair ag PyCon 2013 i Santa Clara. Labhair mé faoi seo freisin le Guido van Rossum, deachtóir maith Python don saol. Chuir sé ina luí orm mo chomhréir saincheaptha a dhísle agus cloí leis an gcomhréir chaighdeánach Python 3. Tacaíonn Python 3 le nótaí feidhme, agus mar sin d’fhéadfaí mo shampla a athscríobh mar atá thíos, agus gnáthchlár Python mar thoradh air:

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

Bhí orm roinnt comhréitigh a dhéanamh (ar an gcéad dul síos, ba mhaith liom a chur in iúl gurb é sin an fáth ar chum mé mo chomhréir féin). Go háirithe, níor thacaigh Python 3.3, an leagan is déanaí den teanga ag an am sin, le nótaí athraitheacha. Phléigh mé roghanna comhréire éagsúla le haghaidh nótaí dá leithéid le Guido tríd an ríomhphost. Shocraigh muid tuairimí cineáil a úsáid le haghaidh athróg. Bhain sé seo an sprioc amach, ach d'fhéach sé rud beag achrannach (thug Python 3.6 comhréir níos deise dúinn):

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

Tá tuairimí cineáil úsáideach freisin chun tacú le Python 2, nach bhfuil tacaíocht ionsuite acu le haghaidh nótaí cineáil:

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

D'éirigh sé amach nach raibh na comhréitigh seo (agus comhréiteach eile) fíor-thábhachtach - chiallaigh na buntáistí a bhaineann le clóscríobh statach go ndearna úsáideoirí dearmad go luath ar an gcomhréir nach raibh chomh foirfe. Ós rud é nár bhain cód Python a rialaigh cineálacha úsáid as comhréir speisialta a thuilleadh, lean na huirlisí Python agus na próisis chóid a bhí ann cheana ag obair de ghnáth, rud a fhágann go raibh sé i bhfad níos éasca d'fhorbróirí an uirlis nua a fhoghlaim.

Chuir Guido ina luí orm freisin dul isteach i Dropbox tar éis dom mo thráchtas sinsearach a chríochnú. Seo nuair a thosaíonn an rud is suimiúla i stair mypy.

Le leanúint ...

Léitheoirí a chara! Má úsáideann tú Python, inis dúinn faoi scála na dtionscadal a fhorbraíonn tú sa teanga seo.

An cosán chun clóscríobh a dhéanamh ar 4 mhilliún líne de chód Python. Cuid 1
An cosán chun clóscríobh a dhéanamh ar 4 mhilliún líne de chód Python. Cuid 1

Foinse: will.com

Add a comment