Via ad typechecking 4 decies centena lineae Pythonis codicis. Pars I

Hodie in mentem venimus tuam primam partem translationis materiae de qua Dropbox agit cum Pythone codici generis potestate.

Via ad typechecking 4 decies centena lineae Pythonis codicis. Pars I

Multum in Pythone scribit Dropbox. Lingua haec est qua maxime late utimur - tum ad officia backenda et ad applicationes desktop clientium. Etiam Go, TypeScript et Rust multum utimur, sed Python lingua nostra principalis est. Considerans scalam nostram, et de decies versuum codice Pythonis loquimur, evenit ut dynamica ratio talis notae supernecessario perplexa sit eius intellegentia ac laboris fructibus serio afficere coepit. Ad hanc quaestionem mitigandam, codicem nostrum ad typum statice mypy annotandam gradatim transire coepimus. Hoc verisimile est maxime popularis-solum genus reprimendi systematis Pythonis. Mypy fons aperta est project, principale eius tincidunt operatur in Dropbox.

Dropbox una fuit e primis societatibus ad genus static deducendum in codice Pythonis in hac scala reprimendo. Mypy in mille inceptis his diebus adhibetur. Hoc instrumentum in multis, ut aiunt, temporibus probatum est. Longum iter habuimus ut perveniamus ubi nunc sumus. Fuerunt multi frustra conati, et experimenta in via defecerunt. Hoc fragmentum annalium historiae typum statice in Pythone deprimendo, ab eius initiis petrosis ut partem investigationis academicae mearum hodie proieci, cum genus sistendi et generis indicia communia sunt inter innumeras pythones tincidunt. Hae machinae nunc variis instrumentorum fulciuntur, ut IDEs et codicem analysticorum.

Read in secunda parte,

Cur genus reprehendo opus est?

Si Python typum dynamice semper usus es, parum confuse potes esse cur tantopere de typing statice et mypy nuper versatus sit. Vel fieri potest, ut Pythone velis praecise propter typum suum dynamicum, et quod fit simpliciter te offendit. Clavis ad valorem typingis statice scala decisionum est: quo maius propositum tuum, eo magis ad typum statice inclinas, et tandem eo magis quo vere opus est.

Dicamus consilium in magnitudine decem milia linearum pervenisse, et evenit ut plures programmatores in eo laborant. Cum hoc consilium tale considerando, in nostro usu fundatum, dicere possumus intelligere suum codicem clavem esse ad productivitatem elit conservandam. Sine annotationibus speciebus, difficile videri potest, exempli gratia, quae ad functionem argumenta transmittantur, vel quae genera valorum munus quoddam referre possint. Hic interrogationes typicae sunt, quae saepe difficiles sunt ad respondendum sine annotationibus utendo;

  • Potest hoc munus reditus None?
  • Quid si hoc argumentum sit? items?
  • Quod est proprium genus id: int Estne, str, vel forte genus consuetudinis ?
  • Num hoc argumentum erit album? Potestne tuplum in eam transire?

Si sequentem codicem praenotatum inspicias et interrogationes his similia respondere coneris, evenit hoc negotium simplex esse:

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

  • read_metadata non revertetur Nonequia reditus genus est Optional[…].
  • ratio items ordo versuum est. nullo ordine iterari potest.
  • attributum, id chorda bytes.

In mundo ideali, crederetur omnes tales subtilitates in documentis constructis (doctrina). Sed experientia permulta praebet exempla huiusmodi documentorum saepe non observari in codice quo laborandum est. Etiamsi huiusmodi documenta in codice adsunt, non potes eius absolutam rectitudinem numerare. Haec documenta obscura, dubia et aperta errori esse potest. In magnis iugis vel magnis inceptis, problema hoc perquam acutum fieri potest.

Cum Python in inceptis primis vel mediis gradibus excellit, in aliquo puncto felicis inceptis et societatibus quibus Python utuntur, quaestio vitalis occurrere potest: "Numquid omnia in stabilitate typo typo rescribamus?"

Typus systemata iniecta sicut mypy problema superius solvendum praebens elit cum lingua formali ad genera describenda et annotando declarationes generis illius progressioni exsequendi (et, optionaliter, eorum exsistentiam reprimendo) congruit. In universum affirmare possumus hasce systemata nobis aliquid simile veri- ficationis documentorum praebere.

Usus talium systematum alias commoditates habet, omnino non leves;

  • Genus reprehendo systematis aliquos minores (et etiam non ita minores) errores deprehendere potest. A typicam exemplum est cum oblivisci aliquid pretii None vel aliqua alia conditione speciali.
  • Codice Refactoring valde simplicior est quia ratio tessellati saepe tibi narrat quidnam codicem mutari oporteat. Eodem tempore non opus est C% testi coverage in codice niti, quod nullo casu fieri solet. Non opus est ut in ACERVUS vestigium altum fodere tradit ut quid mali figurat.
  • Etiam in magnis inceptis, mypy saepe in fractione secundae speciei completam reprimendam praestare potest. Et cursus volutpat suscipit plerumque decem secunda vel etiam minuta. Typus ratio iniecta dat programmator instantis feedback et sinit eum ut suum officium citius faceret. Desinit iam scribere fragilis et difficilis ad unitatem probationes servandas quae res reales substituunt cum ludibriis et inaequalitatibus tantum ut citius codicem testium consequitur.

IDEs et editores ut PyCharm vel Visual Studio Codicis utuntur potentia annotationum typus ad tincidunt latis codici peractam, errorum dilucidandi, et sustentationem pro constructis linguae vulgaribus adhibitis. Et hae sunt iustae commoditates aliquas quae typificationem praebet. Aliquot programmatores, haec omnia principale argumentum in favorem typing est. Hoc est aliquid quod statim post exsecutionem prodest. Hic usus casus pro speciebus non requirit singularem rationem ut mypy reprehendo, quamquam notandum est mypy adiuvat conservare annotationes generis cum codice congruentes.

Mypy background

Mypy fabula in the UK incepit, Cantabrigiae paucis annis antequam Dropbox coniunxi. In parte investigationis doctoralis meae, in eventum elaboravi de linguarum dynamicis et dynamicis componendis stabiliendis. I was inspired by an article about incremental typing by Jeremy Siek and Walid Tah, as well as the Typed Racket project. Conatus sum invenire vias ut eadem lingua programmandi pro diversis inceptis utendi - e parvis scriptis ad codebases plurium milium versuum consistens. Eodem tempore volui efficere ut in cuiusvis rei magnitudine nolim nimium multos in discrimen adducere. Magna pars omnium horum fuit notio paulatim movendi ab incepto prototypo projecto ad comprehensive probatum, statically speciem operis effecti. Ideae hae sunt late suppositae his diebus, sed anno 2010 exitus adhuc actu investigati sunt.

My initial work in type checking was not aimed at Python. Instead I parva usus "conubia" lingua Alore. Hic exemplum est ut ideae tuae de nobis loquaris (type annotationes ad libitum sunt);

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

Communis accessus simpliciori tuo consilio usus in investigationibus scientificis usus est. Quae res ita se habet, non minimum quia hoc efficit ut experimenta cito peragant, tum etiam quia id quod ad investigationem non pertinet facile negligi potest. Linguae programmandi realis-vitae tendunt ad phaenomena permagna cum multiplicibus exsecutionibus, quae experimentum retardat. Sed quilibet eventus in lingua simplici innixus parum suspectus est, cum in his consequendis indagator considerationes magni momenti pro usu linguarum practico immolaverit.

My type checker for Alore looked very promise, but I want to test it by experimenting with real code that wasn't actually written in Alore. Feliciter mihi Alore lingua late fundata est iisdem ideis cum Pythone. Facile satis erat tessellatum typum resignare ut cum Pythone syntaxi et semanticis laborare posset. Hoc nobis permissum est experiri genus faciendos in aperto fonte Pythonis codicem reprimendo. Scripsitque etiam transpilator ut Alore codicem in Python codicem convertisset atque eo usus sum ad genus meum codicem tessellatum transferendum. Nunc habui rationem reprimendi rationem scriptam in Pythone, quae subset Pythonis sustentabat, variatio quaedam illius linguae! (Quaedam decisiones architecturae quae pro Alore sensu factae Pythone male aptae erant; hoc adhuc in quibusdam partibus mypy codebasi patet.)

Re quidem vera, lingua mea systematis typo fulta hoc loco Python dici non potuit: variata erat Pythonis ob aliquas circumscriptiones Pythonis 3 speciei annotationis syntaxis.

Visum est mixturam Javae et Pythonis;

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

Una idearum mearum tunc temporis erat ut annotationes typus ad emendandum opus conficerent hunc saporem Pythonis in C, vel fortasse in JVM bytecode. Prototypum scribendi habui in compilator, sed hanc opinionem deserui, quia genus ipsum inhibitionis satis utilem vidi.

Finivi propositum meum apud PyCon 2013 in Santa Clara. De hoc etiam locutus sum cum Guidone van Rossum, benevolo Pythonis dictatore ad vitam. Persuasit me syntaxin fossam meam consuetudinem et baculum cum signo Pythonis 3 syntaxis. Python 3 munus annotationes sustinet, ut exemplum meum ut infra rescribi posset, consequens est in programmate Pythonis normali;

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

Comprosiones aliquos facere debebam (primum enim hoc volo notare cur syntaxin meam invenerim). Praesertim Python 3.3, recentissima linguae eo tempore versio, varias adnotationes non sustinuit. Contuli varias optiones syntacticas pro talibus annotationibus cum Guido via email. Genus commentationes variabiles variabiles uti decrevimus. Hoc propositum assecutus est, sed paulo gravius ​​aspexit (Python 3.6 nobis syntaxin meliorem dedit);

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

Genus commentationes utiles etiam sunt ad Pythonem 2 alendum, quae annotationes typus non aedificavit;

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

Evenit has (et alias) rationes non vere referre - utilitates typing statice significavit users mox oblitus de syntaxi minus-quam perfecto. Cum Python codicem, quae typos moderabatur, syntaxi speciali non amplius usus esset, Python instrumenta et processus codicem exsistens ut normaliter laboraret, multo facilius tincidunt novum instrumentum ad discendum effecit.

Guido etiam mihi persuasit ut Dropbox iungerem postquam thesim seniorem explevi. Hoc est ubi maxime interesting res in historia mypy incipit.

Ut continued ...

Carissimi legentibus! Si Pythone uteris, indica nobis quaeso circa scalam consiliorum quam in hac lingua evolvere.

Via ad typechecking 4 decies centena lineae Pythonis codicis. Pars I
Via ad typechecking 4 decies centena lineae Pythonis codicis. Pars I

Source: www.habr.com

Add a comment