Transkript: Typescript und Typisierung

· Zurück zur Episode

Vollständiges Transkript der Episode. Zeitstempel beziehen sich auf die Audiowiedergabe.

Ja, hallo liebe Hörerinnen und Hörer.

Dominik

Willkommen beim Python Podcast, heute Episode 54.

Dominik

Wir reden heute über Types, Type ins und TypeScript.

Hallo Johan.

Jochen

Hallo, hallo, willkommen Dominik und Hallo Johannes.

Jochen

Hallo Johannes.

Hallo zusammen.

Und hallo Stefan.

Genau.

Stefan

Ja, hallo Thomas.

Jochen

Auch ein Gast heute, genau.

Dominik

Genau.

Dominik

Ja, wir freuen uns sehr, dass ihr alle da seid und fangen einfach mit News an, wie sonst auch immer.

Ja.

Jochen

Würde ich schon sagen.

Dominik

Das war's ja Schönes.

Jochen

Wer möchte anfangen soll ich?

Ja, fangen wir mal an.

Jochen

Na gut.

Jochen

Ja, also ehrlich gesagt, das letzte Mal war er nicht so lange her, daher habe ich ja nicht so viel gesammelt.

Dominik

Heißen 3.12.1.

Jochen

Genau.

Jochen

Das ist natürlich irgendwie, stand irgendwie dabei, so 400 Bugfixes und so, also ja, sollte man wahrscheinlich mal installieren.

Jochen

Und meine Frage dazu wäre halt, bist du jetzt schon umgestiegen auf 3.12, weil du wolltest ja immer nur die erste meiner Version abwarten, aber da unten auch.

Dominik

Ja, also noch nicht mit allen Sachen, aber mit vier Sachen.

Dominik

Okay.

Dominik

Also 3.12 bei 1 ist drauf gekommen und jetzt in meinem Systeminterpreter zum Beispiel ist es jetzt auf 3.12.

Jochen

Hervorragend.

Jochen

Tja, aber ich glaube, da war nichts, also außer Bugs ist da nichts irgendwie passiert, was ist.

Dominik

Mein Hauptproblem im Moment ist halt so PyTorch oder sowas, wo es auch im Dezember einen Release gab, das letztendlich mit 3.L funktioniert.

Ah, ja, ja.

Jochen

Ja, aber ansonsten genau, neue Releases gab eine neue Ruby und Rails Release.

Jochen

Ich gucke da ab und zu mal so rüber, weil ich halt interessant finde, wie viel tolles Zeug da passiert.

Jochen

Und das ist jetzt deutlich schneller geworden, hat irgendwie einen eingebauten Dustin-Time-Compiler und verwendet jetzt einen ähnlichen Ansatz für den Parser, wie Python halt auch.

Jochen

Python ist ja jetzt mit irgendwie ein paar neuen auf dem Pack-Parser umgestiegen.

Jochen

Und das ist, äh, Ruby verwendet ja jetzt was ganz ähnliches.

Jochen

Ist auch so ein rekursives Dings da, Parsen, ich weiß, ich habe wieder vergessen, wie das genau heißt.

Jochen

So ähnlich und sie sind auch umgestiegen von Bison, also dem Parser-Generator auf den anderen.

Dominik

Ich habe den schon ganz oft Loop Ruby gehört, muss ich ehrlich sagen.

Jochen

Ja, und auch bei dieser ganzen Just-in-Time-Compile-Geschichte, da ist, glaube ich, einer der Hauptsponsoren auch Shopify, äh, Shopify, ja, genau.

Jochen

Also die basieren, also es gibt ja viele, viele große Unternehmen, die halt hauptsächlich auf Ruby und Rails-Moduliten basieren und da kommt halt auch eine Menge Geld rein.

Jochen

Und ja, Python ist ja jetzt auch dran mit diesem Just-in-Time-Compiler-Thema.

Johannes

Das ist ja meine News gewesen, Jochen.

Achso, sorry.

Dann schieb's mal durch.

Johannes

Ja, im Ende Dezember ist wohl ein Patch in den 3.13-Branch reingekommen, wo ein JIT-Compiler drin ist für Python.

Johannes

Also es ist jetzt richtig im Plan drin, dass Python in 3.13 einen JIT-Compiler hat.

Johannes

Ein Copy-and-Patch-JIT-Compiler, was auch immer das bedeuten mag.

Dominik

Da gab es auch angeblich eine tolle Diskussion auf Reddit zu.

Jochen

Ja, also es gibt einmal die, ich kann nur empfehlen, es gibt Core PY, das ist ein Podcast, wo zwei der Core-Entwickler irgendwie drüber reden.

Jochen

Da gibt es eine Episode zum Just-in-Time-Compiler und dann.

Dominik

Wer sind dabei?

Dominik

Shannon und Sean oder wie ist das?

Jochen

Nee, das sind Pablo Galindo Salgado, der Release Manager auch für die, äh, für 313 und Lukas Schlanger.

Ah ja.

Jochen

Genau.

Jochen

Und genau, die haben da einmal drüber geredet und daher weiß ich auch, dass das basiert hauptsächlich, also warum man das jetzt nochmal in Angriff nimmt, auf Geschichten, die in Lua passiert sind.

Jochen

Da gab es jetzt auch irgendwelche, ich habe jetzt wieder die Details vergessen, aber so Papers, die sehr, sehr interessant aussahen und die halt vermuten lassen, dass man es relativ leicht irgendwie auch für Python verwenden kann.

Jochen

Und ja, das ist halt ein InPyte, ein Ruby, da werden überall diese Dinger jetzt gerade eingebaut.

Jochen

Und hier der, ähm, der wegen dem PyPy auch hier war schon, der meinte auch so, oh, er muss jetzt mal sein Commit-Bit wieder quasi ausgehen.

Dominik

Ja, dass es halt die neuen Versionen deutlich einfacher zu implementieren sind bei PyPy, wenn das drin ist, was da in CX Engines irgendwie dazukommen sollte, wollte, wenn ich das richtig verstanden hatte damals.

Jochen

Ja, also jedenfalls der macht er jetzt auch mit und das wird auf jeden Fall spannend.

Dominik

Schnelles Python.

Jochen

Ja, genau.

Jochen

Ja, ansonsten hätte ich jetzt noch das, äh, ich habe mich ja jetzt auch hier an dieser Stelle schon irgendwie ein paar Mal beschwert über irgendwie sehr holprige Updates um Python.

Jochen

Entschuldigung, ja, gut.

Jochen

Über Pythonic 2, über den Umstieg von Pythonic 1 auf 2.

Jochen

Und jetzt haben das andere Leute auch gemacht.

Jochen

Irgendwie Simon Willison hat da in letzter Zeit relativ viel zu gepostet, dass er das irgendwie ungünstig fand.

Jochen

Und da habe ich dann auch so Sachen gesehen wie, es gab da eine Issue zu, wo dann einer von Netflix oder so in relativ freundlichem Ton zunächst schrieb, irgendwie so, ja, also das macht bei uns sehr viel Arbeit und irgendwie, hm, das war jetzt alles irgendwie nicht so günstig.

Jochen

Und ich habe dann geguckt, der hat dann auch irgendwann beschrieben, welche Issues hier reingelaufen sind.

Jochen

Und das war halt zum Beispiel auch einer von den Dingern, in die ich, in die ich da reingerannt bin.

Jochen

Und ja, genau, der meinte dann so, tja, also sauberer wäre es gewesen, wenn man das Paket irgendwie umbenannt hätte oder so.

Jochen

Und das wollten sie aber nicht machen.

Jochen

Und dann haben sie gesagt, nee, das geht auch so oder geht so und das ging alles nicht.

Jochen

Und es war relativ furchtbar.

Jochen

Also gerade wenn man ein Library ist, hat man damit halt ein großes Problem, weil man nicht kontrollieren kann, was in einer Applikation, die einen benutzt, halt irgendwie für eine Piedentic-Version ist.

Jochen

Und zum Beispiel Fast API hatte man auch ein Riesenproblem gehabt.

Jochen

Und wie die das dann letztendlich gemacht haben, ist, sie haben halt so einen Flag eingeführt, Pydentic V2, und machen dann jetzt gerade sowas wie if Pydentic V2 500 Zeilen eingerückt, irgendwie kompatibilitätslayer und dann else und dann sonst.

Jochen

Und das machen sie an mehreren Stellen.

Jochen

Das ist wirklich nicht so schrecklich.

Jochen

Naja, aber so sieht es halt aus.

Jochen

Also das war, dieses Update war nicht wirklich reibungslos, sondern da haben viele Leute irgendwie eine Menge Schweiß gelassen.

Jochen

Also nicht durch.

Okay.

Dominik

Also gut, wenn man es nicht zu sehr drin hat.

Dominik

Ich habe tatsächlich auch zwischendurch noch auf 1 dependen müssen, weil da so bei zwei Sachen nicht so ging, was jetzt irgendwie geht, aber ja.

Dominik

Ein bisschen nervig.

Dominik

Johannes, hast du noch was?

Johannes

Nee, also in der TypeScript-Welt gibt es sowas nicht.

Achso, das kann man so über TypeScript-Version unterhalten.

Dominik

Apropos, ich habe gerade das neues Buch erschienen in der TypeScript-Welt.

Johannes

Echt, was?

Das ist mir ganz neu.

Dominik

Ja, ich glaube, das muss der Stefan mal so ein bisschen erzählen.

Stefan

Ist das jetzt mein Intro oder was?

Ja, aber die Software-Überlaufleife.

Ja, genau.

Stefan

Ich habe das jetzt total spannend gefunden, weil es würde ja immer so gemunkert, dass im Webbereich gibt es ja quasi alle drei Minuten irgendeinen neuen Fachbegriff oder irgendein neuen Bibliothek-Namen oder irgendein neues JavaScript-Framework, das irgendeinen abstrusen Namen hat, mit dem sie alle noch irgendwie auseinandersetzen müssen.

Stefan

Und das ist jetzt das zweite Mal, dass ich so in diese Python-Ecke reinschaue and, hey, come on, this is it again, all this gleich.

Stefan

The ersten Namen, denial, was FastAPI.

Stefan

While tatsächlich, this is spanned, I've been just with five or five months by us in the firm with a group of Python developers on the world, Data Scientists, ganz classic, those two data scientists and this tool that was Python, the bibliotheken, with Langchain, Piper Pro for these LLM sages.

Stefan

And this was my earless intro in this Python Welt, and I've been massives that I have a package manager.

Stefan

There gives you an Anaconda or Pep oder sind das ganz andere?

Stefan

Keine Ahnung.

Stefan

Also wie gesagt, this is ja schon wieder vorbei.

Stefan

But I wish that I have Fast API in language Gesprächen mit unseren Python-Devs in unser Architekturdiagramm eingetragen habe for irgendeinen Server, den we, den wir gemacht haben.

Stefan

Genau.

Stefan

Also das war eben das erste, wo man gedacht habe, so, da kenne ich mich jetzt aus, bei FastAPI, da kann ich mitreden.

Stefan

Funktioniert Multi-Threaded, aber nicht Async.

Stefan

Ist das richtig?

Jochen

Nee, also kann man wahrscheinlich so betreiben, wenn man wirklich will, aber nee, es ist tatsächlich Async.

Jochen

Also unter FastAPI liegt normalerweise, so würde ich jetzt mal sagen, wenn man das so betreibt, wie man das, wie es gedacht ist, halt Stalette bzw.

Jochen

UV-Corn und das ist halt sozusagen die LibUV-Implement, also das ist halt eine Adaption von LibUV, was halt auch unter der Eventual bei Node.js liegt, halt für Python.

Jochen

Ja, und also ist halt quasi genauso schnell dann auch und ist Async, ja.

Stefan

Cool.

Stefan

Naja, das war die zweite, war dann, dass ich versucht habe, über Pio 3 eine Brücke zwischen Async Rust und Async Python einmal zu schreiben.

Stefan

Das war spannend.

Das war richtig cool.

Stefan

Also was mich da beeindruckt hat und mit dem habe ich nicht gerechnet, ist, dass das Foreign-Function-Interface von Python ja fantastisch ist.

Stefan

Also du hast dort dein kompiliertes SO-Modul dazu und du kannst auf die Objektliste zugreifen und kannst die Identifier auslesen.

Stefan

Also das war, also das Kompilieren vom RAS-Code war auf jeden Fall anspruchsvoller, als wir nachher die Symbole in Python zu loaden und zu verwenden.

Stefan

Das war richtig, richtig beeindruckend.

Stefan

Also coole Sache möchte ich mir auf jeden Fall mehr anschauen.

Stefan

Aber das ist es.

Stefan

Also das sind meine Python-Kenntnisse.

Dominik

Ja, weil also immer das Benutzen von Python ist halt das, was so Spaß macht, ne?

Dominik

Also High-Level-Interface, ich glaube, ist sehr gut geeignet.

Dominik

PyS3 auch ein cooles Beispiel irgendwas.

Dominik

Da gibt es die meisten Sachen, die ich es irgendwie kann.

Dominik

Ich glaube, was nicht kann, ist irgendwie Iteratoren ausspucken, richtig oder so.

Dominik

Oder Generatorergebnisse.

Stefan

Ja, das wird wahrscheinlich schwierig sein.

Stefan

Das kann man mir kurz vorstellen.

Jochen

Keine Ahnung.

Stefan

Da ist dieses Typsystem von Rusty doch sehr, sehr eigen und sehr schwierig, in andere Spruchen zu integrieren.

Stefan

Nehme ich mir an.

Dominik

Ja, aber ich hatte ja als News ja auch quasi noch ein bisschen Werbung gemacht für dein Buch.

Dominik

Vielleicht würdest du dazu noch irgendwie kurz was sagen.

Stefan

Ja, danke schön.

Stefan

Danke für diese Überleitung.

Stefan

Ich habe tatsächlich in den letzten Jahren TypeScript-Bücher geschrieben.

Stefan

Das erste Buch, das ich geschrieben habe, war in 2020 TypeScript in 50 Lessons, das beim Smashing Magazine Verlag rausgekommen ist, das als angenehmer, unaufgeregter Einstieg in TypeScript als Typsystem auf JavaScript gedacht ist.

Stefan

Das heißt, das Zielpublikum waren Entwicklerinnen und Entwickler, die JavaScript schon kennen, sich dort auch schon wohlfühlen und jetzt merken, hey, jetzt müssen sie TypeScript verwenden.

Stefan

Brauchen die Info, warum man das erstens überhaupt haben will und zweitens, wie das jetzt so richtig funktioniert und warum es da so viel Syntax gibt und warum das so kompliziert ausschaut, und versucht, das grundlegende System, Typsystem runterzubrechen auf einfach zu verdauende Lektionen.

Stefan

Genau, das war das Ziel von dem Buch.

Stefan

Das habe ich dann zufälligerweise in 50 Lektionen geschafft.

Stefan

Das war ein Riesenspaß, das war quasi mein Corona-Projekt, mein erstes Lockdown-Projekt, wobei es stimmt nicht.

Stefan

Ich habe es zwischen dem ersten und dem zweiten Lockdown tatsächlich das meiste geschrieben dazwischen.

Dominik

Das sieht auch super aus, also von außen, wenn sie an den Schrank stellen.

Jochen

Wir wissen das, weil wir dieses Buch auch alle haben.

Jochen

Ja, zwar als Python-Entwickler, was natürlich auch schon was heißt.

Stefan

Alles schon in die Kamera gehalten.

Stefan

Das macht mich irrsinnig happy, ihr Kind sich das nicht vorstellen.

Stefan

Das sind diese unglaublich schönen Momente, weil man sieht, dass das Buch tatsächlich auch an Leute kommt und Leute das verwenden.

Stefan

Also die Lesebändchen gesehen, herrlich, spitze.

Stefan

Und die Optik ist wirklich ganz, ganz besonders, weil das war eigentlich auch ein Grund, warum ich mit Smashing Magazine zusammenarbeiten wollte.

Stefan

Die haben einfach irrsinnig viel Liebe zum Detail und versuchen wirklich sehr individuelle Bücher zu machen, haben eine wunderschöne Typografie, die sauber zu lesen ist, und verzetteln sie dann in kleinen Finesten so stark.

Stefan

Und ich habe zum Beispiel das Cover wurde gestaltet von Rob Draper, den habe ich tatsächlich in Düsseldorf kennengelernt, auf der Björn Tellerrand, der als Künstler die Intro-Grafiken zu den Golden Globes gemacht hat, für Nike und BMX-Fahrräder bzw.

Stefan

Schuhe designt hat.

Stefan

Und der mir gefragt hat, hey so, E-Mail geschrieben, hey, der war wohl das cool, mögst du mal ein Buch design?

Stefan

Und der ja passt, ich war doch, hey, wow, cool, nicht.

Stefan

Ich hoffe, er kostet jetzt nicht eine Million oder so.

Stefan

Er hat tatsächlich dann unser Buch, also das Buch gestaltet war versucht, da mit diesem Kapitelinlays ein bisschen das Ganze zugänglich zu machen, freundlich zu machen.

Stefan

Das war uns ganz, ganz wichtig.

Stefan

Und die Person, die nachher, also die Airy, die nachher das Ganze gesetzt hat und versucht hat, ein Produkt rauszumachen, hat dann auch recherchiert und hat zum Beispiel das Lesebändchen, das rote Lesebändchen, in der Farbe bestellt von den roten Unterlinien in Visual Studio Code.

Stefan

Das heißt, das ist der gleiche Farbton.

Stefan

Und so tief ins Detail geht es dort.

Stefan

Und das ist halt einfach absolut herrlich für mich, der praktisch nur den Text beigetragen hat, dass du siehst, wie andere Leute sich so investieren in dieses Projekt und versuchen gemeinsam dort irgendwas Cooles auszumachen.

Stefan

Also da kriege ich heute noch Gänsehaut.

Stefan

Das ist ja für mich so, ich weiß, es ist mein Buch, aber es ist nicht nur mein Buch.

Stefan

Also da sind so viele Leute daran beteiligt gewesen.

Stefan

Es war ein irrsinnig cooler Effort von so vielen Menschen und das macht mich einfach jedes Mal wieder glücklich, wenn ich dann sehe, dass die Leute auch so sehen, sie das in die Bücherregale stellen.

Stefan

Oder das Beste, was du machen kannst, hast einen Zoom-Call, stellst du in den Hintergrund und schick mal ein Foto von dem Zoom-Call.

Das ist das allerbeste.

Stefan

Das macht mir die größte, größte Freude.

Stefan

Und es hat ein Freund für mich gemacht, wie er ein Interview für sein Startup gemacht hat.

Stefan

Auf mir sehe ich, hey, da ist mein Buch im Hintergrund.

Stefan

Herrlich.

Stefan

Also macht Riesenspaß.

Stefan

Das ist aber das erste TypeScript-Buch.

Stefan

Ich habe dann noch ein zweites TypeScript-Buch geschrieben.

Stefan

Das ist erst im September rausgekommen, also ist noch ganz, ganz frisch.

Stefan

Das ist das TypeScript-Cookbook, das jetzt mit O'Reilly veröffentlicht worden ist.

Stefan

Das war praktisch eine Auftragsarbeit.

Stefan

Also O'Reilly hat so diese Acquisition-Editors, die suchen halt nach potentiellen Autoren, schlagen Buchprojekte vor oder schlagen vor, hey, möchtest du zu dem Thema was schreiben?

Stefan

Und sie haben gesagt, sie wollen ein TypeScript-Buch veröffentlichen in diesem Stil wie TypeScript in 50 Lessons, ob ich mir vorstellen kann, noch ein solches zu schreiben.

Stefan

Und am Anfang haben wir gedacht, nein, das geht nicht, ich habe jetzt schon ein Buch geschrieben.

Stefan

Ich habe halt einfach eine gewisse Ansicht, gewisse Stimme, eine gewisse Idee zu dem Ganzen.

Stefan

Ich habe aber gedacht, naja, wenn es ist so reile, probierst du, da mir kurz ein Inhaltsverzeichnis unterschreibst, wie du dir ein zweites Buch vorstellen kannst.

Stefan

Und gerade habe ich 100 weitere Einträge gehabt innerhalb von drei Stunden.

Stefan

Also ich bin mir am Nachmittag hingesetzt und dacht, ups, wow, da ist ein Buch.

Stefan

Und bin mit denen in einem Vertrag gegangen und habe halt dann versucht, den Nachfolger vom TypeScript im 50 Lessons Buch zu schreiben.

Stefan

Wenn du in TypeScript im 50 Lessons lernst, wie das Typ-System funktioniert, lernst du im TypeScript Cookbook alle Dinge, die schief gehen können.

Stefan

Dinge, die, wenn du wirklich Programme damit schreibst, wo du merkst, hey, da passt gerade was nicht, du spielt das Typsystem nicht so mit, wie ich mir das denke.

Stefan

Beziehungsweise brauche ich halt irgendeine Technik oder irgendein Prinzip oder irgendein Pattern, das ich anwenden kann, um einem gewissen Problem zu machen.

Im Moment,

Dominik

ich dachte, so Typen hast du, damit nichts mehr schief gehen kann.

Dominik

Und mit Typen, mit sicheren statischen Typen sind die Sprachnummer ganz besonders gut.

Stefan

Genau, da beschreibt man nur mehr Programme, die nur mehr funktionieren und man hat keine Bugs mehr und es ist super heppig.

Ja, ja, genau.

Stefan

Ja, also ich bin also eine

Dominik

Überleitung tatsächlich auf das Thema, was wir heute machen wollen, oder?

Jochen

Ja.

Dominik

Ganz herzlichen Dank, dass du heute da bist, Stefan, das freut uns sehr.

Dominik

Und in Python haben wir von Typen auch schon das eine andere Mal so am Rande gehört.

Jochen

Ja, wir haben diese Episode immer lange vor uns hergeschoben, weil wir uns nie ausreichend vorbereitet gefühlt haben dafür, weil das halt so ein großes Thema ist.

Dominik

Es gibt auch eine ganz große Gemeindeheisen für Types irgendwie.

Jochen

Ja, es gibt auch viele, die das nicht so mögen, ja.

Stefan

Wie seid ihr da so drauf?

Stefan

Also habt ihr jetzt Typen schon in eurem Python-Code drinnen oder ist das eher nur so das Buch mit sieben Siegeln, das ihr nicht öffnen wollt?

Dominik

Annotationen nutze ich persönlich sehr gerne, insbesondere dann, wenn ich mit anderen Menschen arbeite, um einfach so zu dokumentieren, was macht das denn überhaupt?

Dominik

Das heißt aber nicht, dass das immer stimmt, was da steht.

Ja, das ist ein ganz ehrliches Spiel.

Jochen

Ja, also ich verwende sie auch schon und ich habe halt einen Projektmarker so komplett irgendwie annotiert, einfach nur auch, weil ich wissen wollte, wie schwierig ist es denn nun, wie weh tut es denn irgendwie?

Jochen

Und ja, das ging schon, aber es war auch, also ich habe da jetzt nicht so wahnsinnig viel irgendwie Nutzen rausziehen können, aber ich hatte auch vorher in dem Ding halt auch schon 100% Test Coverage.

Jochen

Insofern war da einfach wahrscheinlich nicht mehr so viel zu viel.

Jochen

Ja, auch das habe ich ja gemacht, um es mal gemacht zu haben, als das ist halt mit der Schule.

Dominik

Ich habe tatsächlich in den Projekten bei mir jetzt Enforced MyPi Pre-Commit-Hook.

Dominik

Das ist auch schon, da geht ziemlich vielen Leuten auf die Nerven.

Dominik

Aber da kannst du

Johannes

überall Object hinschreiben, oder?

Das zählt doch auch.

Ja, okay.

Also da sind die meisten Jungs noch nicht drauf gekommen.

Johannes

Oh, da habe ich jetzt ein Geheimnis verraten.

Ups, Entschuldigung.

Johannes

Any oder anyone?

Johannes

Zack.

Stefan

Also ich bin beeindruckt vor der 100% Test Coverage.

Stefan

Also ich bin leider Gottes der faulste Tester.

Stefan

Diese der Donau.

Stefan

Also das ist, ich sage immer, also ich habe diesen Spruch gehabt, wie ich noch in einer Agentur gearbeitet habe, dass gesagt, ja, getestet wird beim Kunden, nicht wenn es in Production ist, es soll reichen.

Stefan

Aber keine Ahnung, liegt es an der Software, die ich schreibe oder an der Rolle, in der ich bin.

Stefan

Ich bin sehr, sehr selten jemand, der wirklich ausgiebige Test-Suite schreibt.

Stefan

Also Arschaufenhaupt, das ist, glaube ich, meine größte Schwäche.

Dominik

100% Coverage ist auch schon sehr.

Stefan

Aber ich finde es beeindruckend wirklich.

Johannes

Ja, das haben wir in dem Projekt genehmigt.

Johannes

Ich bin auch 100%, also 100% Branch Coverage sogar.

Johannes

Und TypeScript.

Johannes

Also es ist ja oft so, dass man das so ein bisschen als gegensätzliche Pole ansieht, sage ich mal.

Johannes

Die einen machen Typen und die anderen machen Testing.

Und das ist schön, Stefan, dass du das jetzt bestätigt hast, aber

Stefan

ich bin quasi das Typenparadebeispiel.

Stefan

Das Ding ist das, JavaScript und Python haben ja die gleiche Eigenschaft, dass beides in der Praxis dynamisch typisierte Sprachen sind.

Stefan

Sprich, natürlich gibt es Typen, sonst könntest du mit den ganzen Wert nichts anfangen.

Stefan

Es ist aber relativ egal, was das für ein ist.

Stefan

Du kannst dann ein Number oder ein Integer einer Variable zuweisen und im nächsten Schritt einen String und keiner regt sie auf und keiner beschwert sie und das funktioniert halt einfach.

Stefan

Oder du kannst verschiedene Typen mischen, du kannst einen String mit einer Zahl kombinieren.

Jochen

Nein, das geht im Putten.

Jochen

Das geht nicht.

Okay, cool.

Stefan

Wow, dann setzt sich schon mal einen Riesenschritt weiter in JavaScript.

Johannes

Ich glaube, das ist ja das große Problem an JavaScript, oder?

Johannes

Dass du solche implizite Konversionen drin hast.

Jochen

Ja, also gibt es ja, das heißt halt immer weak getyped versus strong getyped, aber ich meine, ich weiß nicht, ob das irgendwie

Johannes

versus Static, aber diese ganzen Bezeichnungen sind ja alle nur so ein bisschen.

Stefan

Also die schöneren Bezeichnungen sind meiner Meinung nach statisch und dynamisch, wo du einfach weißt, okay, definierst du den Typen im Vorhinein oder wird er definiert durch die Verwendung?

Stefan

Weak und strong, also schwach und stark ist sehr schwache Bezeichnungen, meiner Meinung nach.

Stefan

C zum Beispiel hat ein statisches Typsystem, aber ein sehr, sehr schwaches, obst du jetzt einen Charakter hast oder ein Integer oder irgendwas anderes, es ist einfach komplett wurscht.

Stefan

Also du kannst alles damit machen.

Johannes

Du kannst auch hin und her wechseln und kannst auch Bitfiddling mit allem möglichen Scheiß machen.

Stefan

Genau, genau, genau.

Stefan

Wundervolle Bundes.

Stefan

Und von dem ist das Statische eigentlich das Wichtige, weil es ein bisschen andere Herangehensweise ans Programmieren voraussetzt.

Stefan

Du machst dir einfach mehr Gedanken über die mögliche Wertemenge einer Variable, bevor du einen Wert zuweist.

Stefan

Das schließt jetzt nicht aus, dass du sagen kannst, du bekommst einen Typen durch Typ Inferenz, das mache ich sehr, sehr gerne, weil ich sage, okay, diese Variable x ist 3 und dann weißt du, dass das ein Numbo oder Integer oder was auch immer ist.

Das geht natürlich auch.

Stefan

Das machen auch moderne Programmiersprachen sehr, sehr, sehr gerne.

Stefan

Grundlegen, dass du halt mit wenig Annotation machen kannst.

Stefan

Nichtsdestotrotz definierst du Verträge zwischen Bausteinen deines Codes, zwischen den Functions, zwischen Methoden in deinen Klassen, etc., in denen du sagst, du erwartest aber jetzt diesen Wertebereich und nichts anderes und du lässt auch nichts anderes zu.

Stefan

Und TypeScript ist meiner Meinung nach da sehr, sehr spannend, weil TypeScript hat versucht, eine sehr dynamische, dynamisch typisierte Programmiersprache und generell sehr dynamische Programmiersprache wie JavaScript in einer gewissen Art und Weise zu formalisieren.

Stefan

Also das Ziel ist ja jetzt nicht a komplett neue Programmiersprache to definieren oder zu entwickeln, sondern auf Basis einer Regelwerk zu finden, damit all beteiligten Programmierinnen und Programmierer irgendwas to diskutieren anders, was da eigentlich for sich geht.

Stefan

Nichts ist schlimmer when you a half year after that program geschrieben hast, wieder anders, hey, was war denn diese Variable X?

Stefan

Also, what habe ich mir da eigentlich gedacht?

Stefan

And then hast du irgendwo eine fette Wurst an Code and musst rauslesen, was du eigentlich damit machst.

Stefan

Also das ist was, was mich immer komplett verwirrt hat, wie, also ich habe dann irgendein funktionales Programmierparadigma mal ausprobiert, viel mit asynchronen Promises gearbeitet in Node, irgendwelche dynamischen Objekte gehabt, wo ich ständig neue Keys hinzugefügt habe und wieder entfernt habe.

Stefan

Und das war kurz anders.

Stefan

And drei Monate später habe ich nicht mehr gewusst, was ich da mache, weil ich das Programm heute lese, ich kenne mich nicht aus und ich würde es auch heute nicht mehr so machen.

Stefan

Einfach weil, also gut Österreich is, sorry, Kraut und Röben einfach zusammenschmeißen und hoffe, dass am Ende alles funktioniert.

Stefan

And this is good for kleine Scripture.

Stefan

This is good when duel geschwind was runterhackst.

Stefan

Aber wenn ihr wirklich mit einem Team versucht, reale Software zu machen, dann ist das die niedrigste Schwelle, die du hast, um zu dokumentieren, was jetzt von deiner Software und von den Nutzern deiner Software überhaupt erwartet wird.

Stefan

Und ich glaube, deswegen sind Typen so wichtig.

Stefan

Und deswegen, glaube ich, sind Typen auch in Python sehr, sehr interessant, weil du ja da die gleichen Voraussetzungen hast.

Stefan

Also du musst dir wissen, was erwartet jetzt deine Funktion.

Stefan

Und je mehr Bibliotheken, das du hast, wie gesagt, ich habe schon gesagt, ich bin jetzt in diesem Lunchen und LLM-Wahnsinn irgendwie gefangen, da hast du da sehr, sehr komplexe Objekte, die du hin und her schickst.

Stefan

Woher sollst denn du wissen, oder woher soll ich wissen, der kein Python schreibt, sondern nur lest, was da jetzt eigentlich erwartet wird und was ich doch rauskriege?

Dominik

Das finde ich auch.

Dominik

Also das tatsächlich so als Dokumentationstyp für Python ist das das, was ich auch am häufigsten gerne mag.

Dominik

Also in kleinen Closures, in kleinen Methoden oder Funktionen irgendwie die Argumente so zu annotieren, dass beim Riesenklar wird, was denn der Mensch da haben möchte, der diese API bereitstellt.

Dominik

Dass ich das irgendwie zusammengebaut kriege oder so oder verstehe, was er denn da braucht oder sowas.

Johannes

Das sehe ich anders.

Jochen

Ja, ich weiß nicht so gut.

Johannes

Aber deshalb heute hier.

Johannes

Also ich finde das Argument, was der Dominik bringt, das stimmt, wenn man nur simple Funktionen hat.

Johannes

Also wenn man wissen will, ob da jetzt ein Integer oder ein String rein muss.

Johannes

Und man hat vier Parameter und die haben alle simple Typen.

Johannes

Aber für mich fällt es auseinander, wenn die Typen komplex werden, weil dann hast du irgendwelche benannten Typen, die irgendwelche interne Struktur haben, die völlig opak ist und dann hast du 17 verschiedene Varianten davon und am Ende weißt du genauso wenig, was da rein muss und was nicht.

Johannes

Und das hat alles so seine Grenzen.

Jochen

Ja, ich habe letzte Woche mit einem Freund telefoniert und haben uns auch kurz über Type-Onnotations unterhalten und der meinte so, ja, schön, gut, und ich sehe die Vorteile und so.

Jochen

Ich find's einfach irgendwie hässlich, weil irgendwie das Argument.

Jochen

Die Idee, ja, okay, das ist eigentlich alles gesagt.

Stefan

Ästhetik ist immer das Argument.

Jochen

Idee kann damit was anfangen oder so, wenn man das jetzt anguckt, der meinte so, ja, dann hat man bei den ganzen modernen Libraries heutzutage, dann hast du da irgendwie Funktionen und da hast du pro Zeile einen Parameter, weil da kommt immer der Name des Parameters, dann kommt halt die Typ-Annotation, die einem nicht viel sagt und dann kommt nochmal ein Kommentar, der erklärt, was die Typ-Annotation einem eigentlich sagen will.

Jochen

Und das dann so untereinander.

Jochen

Und dann meint er so, das erinnert mich total an C-Code aus den 80ern.

Jochen

Ich weiß nicht.

Jochen

Ich mag das nicht.

Jochen

Das ist nicht Python.

Jochen

Ja.

Jochen

Aber ich muss, also dieses Argument höre ich auch häufig, wenn man jetzt über den alten, also wenn man zum Beispiel übernächste Woche wieder, oder ist das nächste, ich weiß nicht.

Jochen

Hier aufs Python.

Dominik

Nächste Mittwoch.

Das ist nächste Woche, ja.

Jochen

Genau, gehen.

Jochen

Da gibt es dann die Alte eingesessenen, die sagen auch immer so, ah.

Dominik

Immer nur Arx Quarks.

Jochen

Nein, das nicht, aber ja, ja, aber das ist schon so ein Punkt, mit dem viele Probleme haben, ja.

Stefan

Ich kenne genug Python, dass ich den Witz mit Argus Quarks verstanden habe.

Johannes

Dann wirst du schon schon zu den Roboter zu erhalten.

Stefan

Ja, nein, also gut, also ich bin immer sehr kritisch, wenn es darum geht, dass man die Ästhetik bewertet, weil ich schreibe sehr viel in Rust.

Stefan

Rast ist eine sehr unästhetische Sprache.

Stefan

Du hast quasi, hey, wie viel Syntax kann Programmiersprache vertragen?

Stefan

Und Rast sagt ja, also her damit.

Stefan

Aber dafür ist mir halt in Rast zu jedem Zeitpunkt absolut hundertprozentig klar, was passiert.

Stefan

Und das ist halt auch ein Vorteil, den man nicht leugnen kann, gerade wenn man in Teams arbeitet.

Stefan

Und da nehme ich halt ein paar Annotationen, die ich da habe, einfach hin.

Stefan

Und irgendwas hat das da geblinkt, sorry, ich bin kurz rausgekommen.

Stefan

Und verstehe zumindest, was passiert.

Stefan

Und ich muss ganz ehrlich sagen, was ich rein jetzt sehe von dem, was Python-Typings umsetzt, ist das eh sehr minimalistisch.

Stefan

Also da kann man sich noch weit, weit mehr vorauskommen.

Stefan

Also ich finde das gar nicht einmal so hässlich.

Johannes

Ja, ich finde, das Problem ist halt, dass diese Typsysteme oft zu weit getrieben werden.

Johannes

Und das treibt dann Blüten.

Dominik

Ja, also für alles und jedes und nochmal die letzte.

Genau, für alles geht es.

Johannes

Und das muss dann alles ein benannter Typ sein und das geht dann, also ich habe hier ein Beispiel aus der Apple-Dokumentation, da gibt es einen Typen, der heißt CN Label Contact Relation, Younger Cousin, Mother, Siblings Daughter or Father, Sister's Daughter.

Stefan

Ist ein Typ.

Johannes

Ja, ob man den jetzt braucht oder nicht.

Johannes

Auf der anderen Seite hier ein Beispiel aus der .NET-Bibliothek, die Links sind dann alle in den Shownotes.

Johannes

Da gibt es eine Methode, die heißt Run.

Johannes

Ihr habt 30 Argumente.

Johannes

31, das erste ist ein Object, das heißt Makro, das zweite ist ein Object, das heißt Arc1, das dritte ist ein Object, das heißt Arc2 und so geht es weiter bis Arc30.

Johannes

Da bringen mir die Typen nichts.

Johannes

Da sagen mir die Typen nicht, was das macht.

Johannes

Und zwar in beide Richtungen nicht.

Johannes

Es gibt halt da diese Fetischisten, die sagen, du musst aber überall benannte Typen drin haben und du musst das Typsystem vollständig ausnutzen.

Stefan

Und es

Johannes

geht mir genauso auf den Senkel wie die alten Herren, die dann sagen, nein, Typannotationen ist ekelhaft und hässlich und wie in den 80ern.

Johannes

Irgendwo in der Mitte ist dieses Maß und

Stefan

du hast mich gerade an was Wunderbares erinnert, ich bin ja in einer Java-Welt groß geworden und habe

Johannes

geliebt worden.

Johannes

Ich auch.

Aber direkt.

Stefan

Ich komme aus der Nähe von Linz und direkt auf dem anderen Bergel gegenüber wohnt einer der Erfinder vom Spring-Framework.

Stefan

Also wir kennen uns, unsere Kinder gehen gemeinsam in die Schule und solche Sachen.

Stefan

Und da gibt es eine Klasse, das ist die Has this Type Pattern try to sneak in some Generalic or Parameterize Type Pattern Matching Stuff Anywhere Visitor.

Stefan

Und es ist fantastisch.

Stefan

Also bei uns in der Firma Java Developer diese Firma haben die Java Developer wohnen diese Whitescreen-Monitore, aber nicht, dass sie irgendwie dort mehrere Fenster nebeneinander hinkriegen, sondern ich sage immer, das ist damit die Klassennamen ohne Zeilenhumbruch darstellen können.

Stefan

Und das ist natürlich, das ist Mumpitz, das ist ganz klar.

Stefan

Also ich denke, man muss die ganzen Sachen immer ein bisschen pragmatischer sehen und halt auch einen richtigen Nutzen oder wissen, welchen Nutzen man da rauszieht.

Stefan

Das gilt für alles in der Softwareentwicklung, meiner Meinung nach.

Stefan

Also was ich am liebsten, genau.

Stefan

Was ich am liebsten habe zum Beispiel, also ich schreibe immer noch sehr, sehr viel Note und wenn ich starte damit, dann habe ich einmal keine Typen zu Beginn, weil ja selbst noch nicht weiß, wie meine Software am Ende ausschaut.

Stefan

Aber wenn ich dann fertig bin, wenn ich dann ein paar Funktionen extrahiert habe, dann lasse ich mir ein paar Typen einführen, einfach nur, dass ich festgelegt habe, was ich hier an dieser Stelle erwarte, damit wenn ich zurückgehe oder wer von meinen Kolleginnen und Kollegen zurückgeht, auch weiß, was dort zu erwarten war.

Stefan

Und um das geht es eigentlich.

Stefan

Und gerade in TypeScript, also gerade auch in meinem Buch gibt es ein paar Beispiele drinnen, da kann man sich schon richtig, richtig vorauskommen.

Stefan

Da gibt es irrsinnig mächtige Werkzeuge wie String Template Literal Types oder Taple Types, Variatic Touple-Types.

Stefan

Das sind Dinge, wo ich mir denke, Wahnsinn, dass das überhaupt geht, also beeindruckend technisch, dass das geht.

Stefan

Aber die Use Cases dafür sind halt stark limitiert und man muss wirklich überlegen, ob das dafür steht.

Stefan

Und ich habe dort drei Lektionen, wo wir ein funktionales Programmiertool wie Currying versuchen, auf drei sehr, sehr komplexe Arten umzusetzen und sagen, aber überleg, ob diese Typen jetzt das gerechtfertigen, was du da als Funktion schreibst, oder ob du nicht lieber eine Funktion nimmst, die viel, viel weniger kann, aber genauso einfach zu verwenden ist und die einfach zu typisieren ist, mit der du besser die Typinformationen auskriegst.

Stefan

Und die stelle dann auch so zur Diskussion.

Stefan

Also man muss halt immer abwägen können, wie rechtfertigst du den Einsatz dieses Werkzeugs und wie weit treibst du das.

Dominik

Ja, ich glaube, dass das tatsächlich gar nicht so einfach rauszufinden.

Johannes

Ja, und ich glaube aber, dass da noch ein anderes Problem dahinter ist.

Johannes

Und ich bin sehr froh, Stefan, dass du da gesagt hast, dass du gegen Tests bist und oder gegen große Testcoverage.

Johannes

Und du hast jetzt gerade eben so ein bisschen deinen Ansatz beschrieben, wie du Programme schreibst.

Johannes

Und du hast das gesagt, du hast meiner Meinung nach ganz wichtig ist.

Johannes

Du hast gesagt, du fängst an, ein Programm zu schreiben und weißt noch nicht, wie es am Ende ausschauen wird.

Johannes

Und das geht mir genauso.

Johannes

Und das ist einer der Gründe, warum ich warum ich Python mag, weil mir das die Freiheit gibt, da so explorativ rumzugehen, ohne mir groß Gedanken machen zu müssen, wie es denn jetzt sauber zusammenpasst.

Johannes

Und ich glaube, dass das ein Programmierstil ist.

Johannes

Das ist, ich nenne das exploratives Programmieren.

Johannes

Ich muss so ein bisschen diesen Space erkunden, muss so ein bisschen sehen, was kann ich, was schaffe ich, was mache ich.

Johannes

Und das ist halt mein Stil.

Johannes

Ich gehe da rein und sage, jetzt machen wir erstmal irgendwas.

Johannes

Es gibt aber auch Leute, die da vielleicht mathematisch herangehen, ja, und die sagen, okay, ich habe ja einen Plan und eigentlich auf dem Papier habe ich es ja schon hingeschrieben.

Johannes

Dann kann ich auch die Tests zuerst schreiben, weil ich weiß ja schon, was das machen soll.

Johannes

Ich weiß ja schon, wie es am Ende aussieht.

Johannes

Oder ich kann gleich die richtigen Typen reinschreiben.

Jochen

Ja, da müssen wir nicht mehr das Akonym ändern.

Jochen

Einfach Type-Driven Development kann man neu genau anstarten hier.

Johannes

Und da, ja, das sind, glaube ich, einfach zwei verschiedene Arten zu programmieren, die eben verschiedene Dinge eher bevorzugen.

Stefan

Es ist tatsächlich, glaube ich, auch ein bisschen von der Sprache abhängig, weil ich glaube, Python und JavaScript unterstützen ja diese Art des explorativen Programmierens sehr, sehr stark.

Stefan

Einfach eben, indem sie die Typen auch entfernen.

Stefan

Also du kannst sie wirklich einfach einmal herumprobieren und schauen, was rauskommt und schauen, wie weit du mit deinen Ideen kommst.

Stefan

Was ich spannend finde, also ich bin jetzt seit einigen Jahren noch sehr, sehr stark in Rust drin.

Stefan

Ich habe das jetzt schon erwähnt und sorry, der klassische Rastnutzer nicht, muss ich ständig sagen, dass er Rust verwendet, aber es ist halt wirklich so.

Stefan

Die Sprache macht einiges sehr, sehr richtig.

Stefan

Du hast in Rust das her sehr stark typisierte Programmiersprache mit einem fantastischen Typsystem.

Stefan

Das ist grandios, dass das so funktioniert, wie es funktioniert.

Stefan

Das heißt, du kannst dir gar nicht leisten, dass du einfach nur mal schaust, wo kommst du mit deinen Wertebereichen überhaupt am Ende hin.

Stefan

Aber trotzdem schafft es Rust, dass du explorativ arbeiten kannst, weil einfach die Mittel, die zur Verfügung gestellt werden, so zugänglich sein können, weil die Typen, die vor Hause schon drinnen sind, so entgegenkommen sind.

Stefan

Das heißt, du kommst mit ein paar Basitypen aus der Standardbibliothek und den üblichen Wertebereichen schon sehr, sehr weit, bevor du dir selbst deine eigenen Strukturen und Interfaces nenne ich jetzt einmal heiße anders überlegen musst.

Stefan

Und das ist sehr, sehr spannend.

Stefan

Es ist aber trotzdem eine andere Art des Programmierens.

Stefan

Also das Endro-Resultat schaut auch dann anders aus.

Dominik

Also ich mag das aber auch gerne, so Models oder so Data Classes zu bauen und dann zu gucken, hey, was sind das denn überhaupt für Objekte und die halt dann direkt zur Annotation zu verwenden, das so strukturell sehr klar.

Stefan

Ne, es schließt sich auch nicht auch aus, nicht.

Stefan

Ich bedenke mir, die Gefahr liegt wahrscheinlich, dass man sich auf eines komplett verschreibt.

Stefan

Macht das, was der Johannes wieder gesagt hat, ganz richtig ist, es ist im Ende des Tages ein Werkzeug nicht.

Stefan

Und es muss irgendein Job erfüllen.

Stefan

Und wenn das gut funktioniert, dass du dir vorher Gedanken darüber machst, welche Daten du benötigst, dann ist das absolut legitim, meiner Meinung nach nicht.

Stefan

Also ich finde die gerade so angenehm.

Stefan

Wichtig ist, dass die Sprache, mit der Story das unterstützt.

Jochen

Ja, ich glaube auch eben, aber ich meine, das hat natürlich mal einen Preis, weil es halt zusätzlich Komplexität unter Umständen halt auch einführt und es dann halt vielleicht auch unzugänglicher macht.

Jochen

Also ich, worauf ich eigentlich hinaus will, ist, naja, je nach Use Case kann es halt kann es halt unterschiedlich nützlich sein.

Jochen

Also wenn man halt zum Beispiel eben in einem Team einer großen Software schreibt, dann kann es halt sein, dass es sehr viel bringt.

Jochen

Auch irgendwie möglichst viele Hürden zu errichten, bevor irgendwie Code.

Johannes

Du willst quasi gar nicht, dass die Entwickler irgendwas machen.

Jochen

Ja, das ist leider halt eine Strategie, das ist schwer zu unterscheiden von irgendwie, man versucht Fehler zu vermeiden, bevor sie dann produktiv gehen, zu bloß nicht deployen, was dann halt auch viele Leute machen, was halt irgendwie auch blöde Konsequenzen hat unter Umständen dann.

Jochen

Weil also viele Sachen, also man hat dann zum Beispiel nicht nur ein Staging-System, sondern noch so drei andere oder vier andere und führt immer mehr hinzu, dass man bloß nicht nach Produktionen deployen.

Dominik

Ich habe zwei Abteilungen bei uns kennen.

Dominik

Wir haben Deployment-Release-Zyklus so alle sechs Monate.

Jochen

Ja, genau.

Jochen

Und dann in den sechs Monaten passiert halt auch nichts, aber ja, ist halt vielleicht auch irgendwie Konflikt mit anderen Zielen.

Johannes

Hast du ja diesen Artikel über Move Fast and Break Things gelesen, der kürzlich rauskommt.

Jochen

Ja, genau.

Jochen

Ja, richtig.

Jochen

Und genau, also an der Stelle macht es ja vielleicht, wenn man in so einer Situation ist, sehr viel Sinn, da vor den Leuten zu verlangen, dass sie sich erst Gedanken machen und dass es halt, man versucht möglichst viele Fehler zu fangen, bevor sie halt in der Produktion aufschlagen, weil da ist es halt viel teurer, sie halt zu entfernen, als aber es kann halt total anders sein, wenn jetzt jemand zum Beispiel, und das ist halt eine der Stärken bei Python, bei JavaScript auch ein bisschen anders, dass es halt vor allen Dingen

Jochen

auch von Leuten benutzt wird, die sich selber gar nicht als professionelle Programmierer sehen würden, sondern die eher sagen würden, naja, ich bin eigentlich eher so Data Scientist oder Analyst oder sowas oder halt irgendwie jemand, der irgendwie, keine Ahnung, Roboter irgendwie dazu bringt, irgendwie lustige Dinge zu machen oder sowas.

Jochen

Und ich will mich jetzt eigentlich.

Jochen

Oder Teilchenbeschleuniger, also solche Sachen, genau.

Jochen

Und ich will gar nicht jetzt irgendwie Typ-Theorie verstehen oder irgendwie, keine Ahnung, auch Unitests.

Jochen

Und da sind wir auch bei einem Ding, wo die Sachen so ein bisschen ähnlich sind.

Jochen

Also ich dachte auch lange Zeit irgendwie Unitests sind was ganz anderes und Typisierung ist eine, ist ein anderes Ende von einem Spektrum und ich bin eher so Team Test.

Jochen

Aber inzwischen denke ich so, naja, das ist schon relativ ähnlich.

Jochen

Auch ich meine, auch Unitesting ist halt so eine Sache, die man sich erst irgendwie erschließen muss.

Jochen

Und für manche Leute macht es einfach, wenn man halt irgendwie so in einem Jupyter Notebook Sachen macht, ja, manchmal macht es schon Sinn, das zu testen, aber für viele Leute ist es auch nicht, lohnt es sich, weiß ich nicht, ob es sich wirklich lohnt, da so tief einzusteigen.

Jochen

Und aber ich meine, klar, wenn man jetzt große Software im Team entwickelt, dann klar hat man Tests und eine, ja, CI-Pipeline und weiß ich nicht, diesen ganzen Kram halt, ne?

Johannes

Das Stichwort da ist doch Programming by Contract, oder?

Johannes

Und das ist halt eine Möglichkeit, so einen Contract zu schreiben.

Johannes

Aber also ich bin da in so einem Zwiespalt.

Johannes

Einerseits bin ich total genervt von solchen Typsystemen, die dann sehr präzise sind und die dann, ich habe auch, ich bin auch mit Java aufgewachsen, Stefan, also ich zähle deinen Schmerz.

Johannes

Und dann wirkt man sich ab und macht einen Pair aus Int und String und dann weißt aber nicht, wie da an dem zweiten dran kommst.

Johannes

Und das ist alles ganz schön.

Johannes

Aber auf der anderen Seite gibt es nicht die Möglichkeit, zu sagen, ganz triviale Sachen zu sagen.

Johannes

Zum Beispiel, hier muss eine Zahl rauskommen, die immer größer ist als 0 oder immer kleiner als 0.

Johannes

Größer als 0 geht ja tatsächlich noch.

Johannes

Aber kleiner als 0 kannst du nicht sagen.

Johannes

Du kannst nicht sagen, hier muss was rauskommen, was zwischen 0 und 1 liegt.

Johannes

Und das ist irgendwie so eine weirde Sache.

Johannes

Ich bin dann so im Zwiespalt.

Johannes

Ich hätte gerne keine Typsysteme, aber wenn ich Typsysteme hätte, hätte ich gerne so welche, die so exakt sind, dass ich sowas sagen kann.

Johannes

Und dass mir dann auch der Compiler sagen kann, ja, Moment, hier rufst du eine Funktion aus mit einer Zahl, die zwischen 0 und 1 sein kann, aber die muss zwischen 0 und minus 1 sein.

Johannes

Nee, das ist nicht Validierung, sondern das ist, nee, das sind sogenannte Value-Types, das kannst du auch in ein Typsystem reingießen, wenn du das möchtest.

Jochen

Hast du in einer Sprache, das kannst du, also ich glaube, ich habe eine mal gesehen, was ist das?

Stefan

Also grundsätzlich im funktionalen Programmierbereich.

Stefan

Aber ich würde einmal annehmen, nicht in den populären oder weit verbreiteten Programmieren.

Johannes

Nicht in denen, die man benutzt irgendwo.

Dominik

Oder die man schon mal gehört hat.

Stefan

Aus einem ganz einfachen Grund, weil du halt unter den Wertebereichen von einer Zahl halt auch tatsächlich irgendwelche Bytes liegen, die von einer CPU ausgelesen werden.

Stefan

Also das wenn dir das Typsystem das erlaubt, dass du dort irgendwas zwischen minus 1 und plus 1 zum Beispiel definierst oder mein Gott, eine ganze Zeit zwischen 25, was auch immer, dann schiebst du die Validierungen nur an eine andere Stelle.

Stefan

Ja gut, aber

Johannes

das macht man im Typsystem generell, oder?

Johannes

Also ich meine, der, also bei dem TypeScript-Compiler durch ist, ist ja weg.

Stefan

Das ist ja richtig, genau.

Das ist ja richtig.

Stefan

Ich glaube in Python genauso, ne?

Stefan

Wenn ich mich nicht täisch.

Jochen

Ja, generell.

Johannes

Also die Annotation erstmal gar nichts.

Jochen

Genau, das ist, also das ist in Python auch so leicht anders.

Das wissen ja auch viele Leute.

Jochen

Ja, das ist ganz, das ist halt, wenn man zu den praktischen Dingen kommt, die halt damit problematisch sind.

Jochen

Also ich bin ja häufiger auch irgendwie in unterschiedlichen Firmenkontexten da so unterwegs.

Jochen

Und das, was ich in letzter Zeit halt häufig sehe, ist halt sowas wie, Leute annotieren halt irgendwie ganz viel, aber sie haben keinen statischen Type-Checker, der da drüber laufen würde.

Jochen

Und in Python ist halt auch keiner eingebaut.

Jochen

Was vielleicht auch nicht so gut ist.

Jochen

Und man müsste da, und dann mache ich dann sowas wie, ich lasse mal MyFi drüberlaufen.

Jochen

Und die Leute verwenden alle Type-Dickt und sowas und denken halt, ja, das überprüft jetzt, ob meine ganzen Werte da so, also meine ganzen Werte in dem Dikt halt so den richtigen Typ haben und so.

Jochen

Und Python selber macht da gar nichts.

Jochen

Das überprüft überhaupt nichts.

Jochen

Es ignoriert die Annotation einfach.

Jochen

Ich lasse an MyFi rüberlaufen und dann kriege dann so 400 Fehler.

Jochen

Dann denke ich mir so, okay, ja.

Jochen

Also du hast da schön deine Annahmen darüber, wie die ganzen Typen aussehen, dokumentiert, aber die sind halt leider alle falsch.

Jochen

Also es stimmt überhaupt gar nicht.

Jochen

Und ja, da ist dann, denkt man sich, warum hat man sich denn überhaupt die Mühe gemacht?

Jochen

Also es ist halt irgendwie.

Stefan

Ja, wie ist denn der Zustand der Entwicklungsumgebungen in Python?

Kommt drauf an.

Dominik

Also auch die hängen halt daran, ob du MyPy zum Beispiel als Static Type-Shaper Extension richtig konfiguriert hast.

Dominik

Ja, und ob dann auch MyPy die Stubs halt leasen kann, die halt da notwendig sind oder halt auch nicht.

Dominik

Die müssen halt alle dann auch nicht mehr.

Aber viele Idees

Johannes

machen das doch auch selber schon.

Jochen

Ja, ja, genau.

Jochen

Da gibt es ja auch dann, ich weiß gar nicht jetzt, was bei VS Code dann normalerweise verwendet wird.

Dominik

MyPi ist eine Extension.

Jochen

Ja, aber ich meine, wenn jetzt zum Beispiel einfach nur das.

Also IntelliJ macht das selber.

Jochen

Ja, die machen das, die haben einen Proprietären, dann gibt es irgendwie MyPy, klar.

Jochen

Und es gibt halt noch PyRite und der Language Server für Python, kann es sein, dass er selber in Type von Microsoft in TypeScript geschrieben hat, ich glaube schon.

Stefan

Ja, es ist nämlich spannend, weil ich denke, TypeScript hat da einige richtige Entscheidungen getroffen auf dem Gebiet.

Stefan

Die ihr jetzt alle angesprochen habt, was kompliziert und was komplex in Python ist.

Stefan

Nämlich, dass du, dass die Sprache dir zu einem Typsystem anbietet, cool, aber eigentlich nichts damit machst, sondern du brauchst eh nur einen extra Typ-Checker und anscheinend wie bei den Package Managern gibt es dort auch mehrere, wo du dann raussuchen kannst, welcher gefällt dir jetzt und welcher passt zu dir und so weiter.

Stefan

Und ich finde es grandios, dass es auswählt gibt, keine Frage nicht, aber es erhöht natürlich auch die Komplexität.

Stefan

Und TypeScript hat TypeScript selbst ist ja eigentlich mehrere Dinge.

Stefan

Es ist zum einen einmal ein Typsystem, cool.

Stefan

Also wie werden Typen geschrieben, definiert, wie sind sie im Zusammenhang.

Stefan

Es ist auch ein Typ-Checker dabei.

Stefan

Also der TypeScript-Compiler TSC macht in erster Linie mal Type-Checking, aber kompiliert dann auch tatsächlich JavaScript-Code, den du ausführen kannst.

Stefan

Also es gibt so jetzt Proposals, dass du auch Typ-Annotation irgendwann einmal in JavaScript schreiben können solltest, so ähnlich wie in Python-Version dort einfach von der Runtime ignoriert.

Stefan

Aber da sind wir noch nicht.

Stefan

Also da kommen wir erst hin.

Stefan

Das heißt, du brauchst auch den Compiler.

Stefan

Das heißt, wir haben Typsystem, Typchecker, Compiler und noch auch ganz, ganz wichtig, eine Integration in Editoren und Entwicklungsumgebungen.

Stefan

Und das war eigentlich, also dieser gesamte Tooling-Aspekt rundherum, nicht nur das Typsystem anzubieten, sondern auch Werkzeuge anzubieten, dass du noch ein zu validen JavaScript-Code kommst und du deine Fehler siehst und die Fehler auch sofort in deinem Editor und deiner Idee dargestellt werden, das sind meiner Meinung nach genau die Punkte, die noch auch den, unter Anführungszeichen, den Ziegelszug von TypeScript auch zu verantworten gehabt haben.

Stefan

Weil ohne dem hast du halt nur die Hälfte der Dinge.

Stefan

Du brauchst halt irgendwie alles, damit du sauber entwickeln kannst.

Stefan

Und wenn ich mir denke, dass ich Visual Studio Code aufmache, wo TypeScript schon drinnen ist und ich mache irgendein JavaScript-File auf und das läuft im Hintergrund schon der TypeScript-Compiler und checkt meinen JavaScript-Code und versucht zu informieren und zu verstehen, was ich schon geschrieben habe ohne einzige Typ-Annotation.

Stefan

Und ich kriege aus dem raus schon Autocomplete und die ersten Warnings, dass vielleicht irgendwas nicht ganz rundlauft und schief geht, das ist so viel wert, ohne dass ich eine Zeile TypeScript schreibe, wo wir denken, ja, das ist eigentlich eine richtig gute Idee gewesen.

Jochen

Ja, naja, absolut.

Johannes

Da kann Python sich, glaube ich, auch noch eine Scheibe abschneiden, weil da gibt es noch so ein paar Löcher.

Stefan

Also wenn ich jetzt sage, ich installiere Py-Scham oder wie auch immer, welche Idee und die kommt schon mit einem Typ-Interpreter oder einem Type-Checker mit, das wäre natürlich göttlich, nicht, dass du einfach sagst, hey, du brauchst immer die Typ-Annotation schreiben, aber die Idee haut irgendeinen Type-Checker schon per Default drinnen.

Stefan

Wahrscheinlich schreiben sie ihn selbst, weil ChatPraints schreiben es

Jochen

irgendwie selbst.

Jochen

Haben Sie.

Der von JetPraints ist behaupten.

Johannes

Aber die.

Der ist super gut.

Johannes

Das ist einer der Gründe, warum er Pyjar verwendet, weil die halt da die beste Typ-Inferenz haben und die besten.

Ich meine, man merkt, dass es der Java ist, ja, aber.

Stefan

Aber das können sie, also da sind sie richtig, richtig gut.

Stefan

Sie haben auch für schon wieder Rust, für Rust haben sie auch einen eigenen geschrieben.

Stefan

Also die ganze Welt verwendet Rust Analyzer.

Stefan

Außer du nimmst Rust-Rover von JetBrains, dann ist der Eigner drinnen und sie haben auch recht damit.

Stefan

Also das ist halt richtig gut integriert in die Werkzeuge, die sie zur Verfügung stellen.

Jochen

Ja, auch ein zusätzlicher Effekt, den das hat, dass halt quasi bei Python halt der statische Type-Checker halt nicht so wirklich zur Sprache dazugehört, ist halt auch, dass bei TypeScript ist es halt so, das, was sich sozusagen in der TypeScript-Sprache tut, auch immer sofort verfügbar ist, halt dann, und das ist bei Python nicht so, weil die statischen Type-Checker vor allen Dingen von den großen Wänden gebaut werden, halt nicht MyPy, Dropbox, ich weiß nicht, ob die immer noch da so hauptsächlich dran sind, aber dann gibt es noch einen von Google, es gibt noch PyRite.

Jochen

Die hängen sowieso immer so ein bisschen in den Versionen hinterher, weil sie ihre Codebasis sowieso nicht an der aktuellsten Version halten können, weil sie das gar nicht schaffen, weil das einfach zu viel Arbeit ist.

Jochen

Das heißt, normalerweise bei MyPy hängst du halt immer so eine Version irgendwie von dem, was die Sprache eigentlich kann, zurück.

Jochen

Was halt auch total doof ist einfach.

Stefan

Du musst ja auch noch darauf eingehen, welches Subset des Typsystems du jetzt verwendest.

Stefan

Ja.

Jochen

Genau.

Stefan

Da kann ja gar nichts schief gehen.

Ja, das ist eine TypeScript-Version gibt es ja jetzt auch.

Stefan

Ja, und Type-Script-Personenmanagement ist ja stark in der Kritik.

Stefan

Sehr keine Frage.

Stefan

Also das jedes Release ist ja bei Legion.

Johannes

Ja, und das ist aber einfach ein schwieriges Problem.

Johannes

Also ich glaube tatsächlich, dass TypeScript einfach dadurch, dass es eine jüngere Sprache ist, gewisse Fehler vermeiden konnte, die man halt vor 20 oder 25 oder 30 Jahren machen musste mit diesen, mit den ganzen alten Sprachen.

Johannes

Aber manche Sachen sind halt immer noch nicht gelöst und Version Hell gehört halt dazu.

Stefan

Wobei ja auch sagen wir das TypeScript schon historisch gewachsen.

Stefan

Also du merkst, du merkst schon die dunklen Flecken der Vergangenheit und versuchst sie zu ignorieren.

Stefan

Das ist ja so, das passiert halt.

Stefan

So wie Sachen verwendet werden, hast du nachher die Probleme.

Ja, und

Johannes

das muss sich ja auch an JavaScript orientieren.

Johannes

Also es muss ja JavaScript-kompatibel sein und da kriegst du halt viel, sag ich mal,

Jochen

auch da kriegst du Historie.

Das ist ein kleines

Johannes

bisschen Programmiersprachenhistorie mitgeliefert.

Ja, ja.

Jochen

Ja.

Jochen

Ja, aber ich wollte gerade nochmal auf Java ein, wo wir das gerade hatten, es ging leider schon ein bisschen drüber davon wieder weg, aber da hatte ich nämlich auch noch so eine schöne, da hatte ich letztens sehr, sehr schönes gelesen, das halt in der, der einer der Autoren von der Sprachspezifikation von Java hat halt irgendwann mal so geschrieben zu den Generics, also dass sie die Generics eingeführt haben.

Jochen

Also ja, das war irgendwie ein Fehler.

Jochen

Und dann hat er irgendwie noch in dem Buch selber findet man auch irgendwo so eine sehr schöne Fußnote, ja, wo halt quasi die Annotation von Inam Inam ist auch ein Python ein Problem, aber in Java halt auch.

Jochen

Und Inam ist halt irgendwie definiert als, ich versuche gerade, ob ich das hier finde, ah ja, genau.

Jochen

Ist eine generische Klasse definiert als Enam, Spitze, Klammer T, Extens Inam, Spitze, Klammer T, Klammer zu, Klammer zu.

Jochen

Also diese rekursive Definition ist halt so ein bisschen schwierig zu verstehen.

Jochen

Wir haben inzwischen aufgegeben, es zu versuchen, Leuten zu erklären.

Jochen

Es gibt irgendwie Spezialisten, die uns versichert haben, über Typtheorie, die uns versichert haben, dass das schon alles okay ist und kein Problem.

Jochen

Und wir sollen uns einfach nicht so viel Gedanken drüber machen, was wir sehr gerne annehmen.

Stefan

Das Spannende ist ja bei den Java Generics, dass die als einziges Element im Typsystem von Java keine Auswirkungen auf die Gestaltung der Laufzeitobjekte haben.

Stefan

Also das sind auch so nach dem Compile-Schritt wird das einfach entfernt und nie wieder angesehen.

Stefan

Und das ist halt das Beeindruckende dran.

Stefan

Also das war halt auch so, oh shit, das brauchen wir jetzt, wir müssen das jetzt machen im Release 1.5, glaube ich, war das.

Stefan

Und das war die einfachste und unproblematischste Art, wie wir dazu kommen.

Stefan

Und alle Implikationen, die das hat, die werden bis heute mitgezogen.

Stefan

Du kannst quasi generische Klassen nie wirklich optimieren.

Stefan

Geht einfach nicht.

Stefan

Was halt spannend ist, weil die hast du halt überall, du hast überall Genericks drin.

Stefan

Deswegen werden auch oft nur in der Standardbibliothek das generische Object verwendet, anstatt dass du einen generischen Typparameter hast.

Stefan

Und was ihnen mit Inam sein findet ist, was ich sowieso nicht.

Also ich habe das gesehen bei unseren Kollegen und das ist kein Inam, das ist ein Ernst.

Dominik

Eigentlich jetzt ein guter Zeitpunkt, um nochmal so ein bisschen zu erklären, worum es überhaupt geht und was alles so drin ist.

Dominik

Wir sind jetzt auch schon auf so einem relativ hohen Fluglevel unterwegs, aber wir haben auch viele Menschen, die uns zuhören, die vielleicht noch gar nicht wissen, was denn ein Generic überhaupt ist.

Dominik

Und vielleicht sollten wir das einmal kurz wissen wollen.

Jochen

Jetzt kriegen sie es hat mal gesagt, ja.

Stefan

Im GF10, es gibt auch Generics in Python.

Stefan

Ja, mit, ja genau.

Stefan

Hui abuma, wovon getan.

Johannes

Also das ist ja, das ist, also diese Generics in den Typ-Annotationen, das ist ja wirklich nur sehr instruktiv.

Johannes

Es ist nur sehr so vage gesagt.

Johannes

Das ist keine, da ist die Arras ja noch viel größer.

Dominik

Johannes, hättest du denn neue?

Dominik

Was ist denn bitte ein Generic, bitte?

Johannes

Ein Generic ist eine Spezialisierung eines Typen anhand eines anderen Typen.

Johannes

Und das klassische Beispiel ist da die Java-Liste.

Johannes

In Python hast du ja eine Liste, die, sag ich mal, dynamisch typisiert ist.

Das heißt, wenn du eine Liste hast, kannst du da eine Zahl reintun und einen String und einen komplexe Zahl und ein Objekt und noch eine Liste.

Johannes

Das ist immer sehr unterhaltsam, wenn man das in den, wenn ich das in den Seminaren mache, wenn ich den Leuten Programmieren beibringe, die vielleicht schon mal eine Programmiersprache gesehen haben oder die schon mal was davon gehört haben und dann sage ich hier, so jetzt kannst du da, du kannst noch eine Liste auch reintun oder Dictionary kannst du auch einfach in deine Liste reintun.

Und in Java geht das nicht.

Johannes

In Java hat jede Liste einen Typen.

Johannes

Das heißt, du kannst, wenn du einfach nur List sagst, dann meinst du List von Object.

Johannes

Das heißt, alles, was du da reintun kannst, ist Object.

Johannes

Aber du kannst diese Liste spezieller gestalten, indem du eben diesen Generic-Mechanismus verwendest und sagst, du hast jetzt nicht eine Liste von Object, sondern du hast eine Liste von String.

Johannes

Das heißt, der Compiler weiß an bestimmten Stellen, dass dieser Typ, den du da hingeschrieben hast, der vorher vielleicht nur ein Platzhalter war, in TypeScript verwendet man dann oft T oder K oder V, das ist auch in Stefans Buch kommt es mehrmals vor, dass du dann eben zu einem bestimmten Zeitpunkt diesen generischen Typen ersetzt durch einen konkreten Typen und sagst, okay, ich habe jetzt hier nicht eine Liste von Objects, sondern ich habe ganz klar eine Liste von String.

Johannes

Und dann kann der Compiler oder eben das Typsystem überprüfen, dass du da tatsächlich lauter Strings drin hast.

Johannes

Der Code, den du da ausführst, ist genau der gleiche, aber du hast jetzt eben einen spezifischen Typen für eine Liste von Strings gemacht.

Johannes

Und das hat gewisse Vorteile.

Johannes

Zum Beispiel, wenn du da ein Objekt rausholst, kriegst du dann halt eben nicht nur ein generisches Objekt zurück, sondern du kriegst dann tatsächlich einen String zurück.

Johannes

Das ist der große Vorteil, den du in Java davon hast, dass du diese Accessormethoden hast, die dir die spezifischen Sachen rausgeben.

Johannes

War das korrekt erklärt, Stefan?

Stefan

Genau das.

Stefan

Also gut, Experte.

Stefan

Ich sage, ich bin nie Experte, ich bin einfach nur Laufgebung und schreib den ganzen List auf.

Johannes

Ja, gut, aber das macht dich zum Experten.

Stefan

Aber nein, das beschreibst du ziemlich gut.

Stefan

Also du kannst mit Typ Parametern dir die Entscheidung auf den tatsächlichen Typen für später aufheben.

Stefan

Das ist das, was dort dann passiert.

Stefan

Und eben, wie du sagst, dann wird es halt eine Array List von String oder eine Array List von Integer.

Stefan

Und du substituierst diesen Typ-Parameter mit einem konkreten Typen und kriegst du konkreten Typen wie der Retour.

Stefan

In manchmal Programmiersprachen kannst du dann auch noch so things wie constraints oder bounds angeben, wo du eben sagst, hey, du hast dort jetzt einen beliebigen Typparameter, ja, aber er muss einem gewissen Subtypen entsprechen.

Stefan

Das heißt, er muss eine gewisse Funktionalität zur Verfügung haben oder muss TypeScript ist ja strukturell typisiert, was bedeutet, dass du einfach sagst, hey, solange die Methoden dort sind und solange die Properties dort sind, passt schon, muss nicht den gleichen Namen haben, muss nicht in irgendeiner Hierarchie sein, sondern Hauptsache schaut irgendwie so aus, wie das eine, was ich da erwarten würde.

Stefan

Und dann haut dich schon hin.

Stefan

Und dann kriegst halt zum einen die Sicherheit, dass du nicht irgendwelche Typen reingibst, die nicht damit funktionieren.

Wie macht man?

Stefan

Und zum anderen kriegst du halt noch mehr Informationen über deinen Typ noch heraus, wenn du ihn dann verwendest.

Dominik

Wie macht man das denn in Python-Protokolle?

Jochen

Doch, das ist in Python ist das seit drei achtem Grunde auch so oder kann man das so machen.

Jochen

Man kann auch nominal typisiert das Ganze machen, aber da geht das jetzt auch, genau.

Jochen

Mit Typing Protocols geht das auch.

Jochen

Ja, genau.

Hat er

das schon mal irgendwo gesehen?

Ja, wirklich.

Jochen

Ich verwende das.

Johannes

Also ich finde das eine großartige Idee, aber ich habe es noch nie irgendwo verwendet gesehen.

Jochen

Ja, ja, doch.

Jochen

Also ich kenne es auch vor allen Dingen aus dem Fluid Python-Buch von Luciano Ramalou.

Jochen

Und der hat sich auch mit diesem Typisierungsthema stark beschäftigt und hat dann diverse Fehler in der Typeschat, im Type-Chat-Repository, wo halt die ganzen, wo auch die Standardbibliothek von Python annotiert ist, hat er da gefunden und viele davon konnte er fixen mit diesem Structural Typing-Ansatz.

Jochen

Und also Fehler im Sinne von halt die Annotationen waren halt irgendwie, da waren halt False-Positives oder halt False Negatives möglich.

Jochen

Auch sehr interessant, wenn man sich halt anguckt, welche Fehler sind häufiger.

Jochen

False Positives sind viel, viel häufiger bei Typ-Annotationen als False Negatives.

Jochen

Also in der Python-Standard-Bibliothek waren es irgendwie achtmal so häufig.

Jochen

Was halt auch ein Hinweis darauf ist, dass es halt für Leute wichtiger ist, dass halt die, also false Positiv heißt, eine Annotation hat gesagt, nee, das ist, du kommst hier nicht rein, das ist irgendwie, du bist nicht der richtige Typ.

Jochen

Dein Typ ist hier nicht dich gefragt.

Jochen

Sozusagen, obwohl es eigentlich doch okay gewesen wäre.

Jochen

Und also offenbar ist es halt irgendwie so mehr opportun, irgendwie auf der Seite von strikter zu sein, zu irren, als umgekehrt.

Jochen

Was ja auch so ein bisschen vielleicht damit zusammenhängt, welche Leute das, für welche Leute das halt vor allen Dingen gut ist, nämlich die, die halt versuchen wollen, möglichst viel da draußen zu halten.

Jochen

Und wenn sie ein bisschen zu viel draußen halten, ist es besser, als was durchzulassen, was halt dann irgendwie knallt zur Laufzeit.

Jochen

Das wäre dann vollstegativ.

Jochen

Ja, genau.

Jochen

Und ja, der hat der hat da das, also lange erklärt in dem Buch und da habe ich das halt quasi her.

Jochen

Und ja, ich finde das eigentlich sehr nett, weil damit kann man im Grunde genau das Gleiche machen wie ein Type-Script mit diesen Intersection und Union-Types.

Jochen

Was ja auch irgendwie so, das ist halt so sehr cool eigentlich, dass das geht.

Jochen

Und das geht halt, wenn man jetzt so mit Abstract-Base Classes das Ganze macht und nominal geht das halt nicht so richtig.

Stefan

Das Problem ist, wenn du Nominal arbeitest, du baust du auf den Schlocker Hierarchie auf.

Stefan

Wenn die implizit ist durch die Basitypen, die du definierst.

Stefan

Und das kannst du sehr, sehr schön und elegant umschiffen, indem du sagst, hey, alles, was ich erwarte, ist einfach nur, dass das Ding so ausschaut oder diese Werte und Eigenschaften hat, die ich an dieser Stelle erwarte.

Stefan

Methodennamen, Rückgabewerte, Property-Typen etc.

Stefan

Und ich sage mal, eine Programmiersprache wie JavaScript wäre gar nicht anders zu typisieren gewesen, oder es wäre gar nicht möglich gewesen, die anders zu typisieren ist wie mit einem strukturellen Typsystem, weil sonst praktisch kein Code mehr funktioniert hätte, den du irgendwie geschrieben hast.

Stefan

Und das war immer so ein Designprinzip von TypeScript, dass sie sagen, hey, wir wollen bestehenden JavaScript-Code unterstützen und mögliche Fehler herausfinden und nicht einfach nur aufgrund von arbitr geschaffenen Hierarchiekonstrukt sagen, das passt oder passt nicht.

Stefan

Und ich glaube, es kann mir gut vorstellen, dass das Python auch stark hilft.

Jochen

Ja.

Definitiv.

Jochen

Ja, das ist jetzt also seitdem, also ich meine, es ist auch ein, glaube ich, in Go ist das ja auch so.

Jochen

Mit den Interfaces in Go verhalten sich im Grunde auch so.

Stefan

Genau, du implementierst implizit Interfaces, wenn die Methodensignatur gleich ist.

Stefan

Dann bist du kompatibel zum Interface.

Jochen

Ja.

Jochen

Ja, und also nö, ich verwende das tatsächlich.

Jochen

Ich glaube auch, dass es halt, das ist eigentlich sozusagen das, wo es dann anfängt, Spaß zu machen.

Jochen

Weil ehrlich gesagt, mit den Hierarchien, Klassenhierarchien und so, das ist nicht so meine Vorstellung von Spaß.

Dominik

Ja, also kann man ja gemeckert.

Stefan

Ja, du hast ganz recht, Johannes.

Stefan

Das ist das, was, oder ich glaube, es war Johannes.

Stefan

Ja, genau, das

Johannes

ist das, was natürlich passiert.

Johannes

Du hast Klassen und dann hast du Hierarchien davon und dann benutzt du die und fertig.

Stefan

Das ist dem Konstrukt zu schulden.

Stefan

Und da kann das Konstrukt doch nichts dafür.

Stefan

Das ist halt einfach so.

Stefan

Nee, und es liegt

halt nahe, ja.

Johannes

Du hast schon diese Hierarchie und dann benutzt du sie halt auch weiter.

Johannes

Du hast schon die Struktur, also nehmen wir sie.

Johannes

Aber das ist dann eben das Problem, worauf du dann triffst.

Johannes

Du kommst an der Stelle, wo du weißt, hier muss ich jetzt eigentlich nur addieren, aber der Typ, den du verlangen musst, ist halt irgendein ganz wilder oder ein ganz abgefahrener oder irgendeiner, der wo ganz anders in der Hierarchie drin ist.

Und das, genau.

Stefan

Was mir sehr gut gefällt am Python-Typ-System, was ich gesehen habe, nur durchs Drüber drüber fliegen, ist dieses New-Type-Konstrukt, wo du sagen kannst, hey, es gibt schon einen bestehenden Typen und das vielleicht sehr, sehr freigiebig.

Stefan

Das ist vielleicht der Integer da ist drin oder was auch immer.

Stefan

Aber du kannst eben noch dieses eine Label verschaffen, damit du jetzt nicht irgendwelche unterschiedlichen Integer-Werte durcheinander kriegst oder irgendwelche Objektwerte, die ähnlich sind, durcheinander kriegst.

Stefan

Weil strukturelle Typsysteme funktionieren halt immer bis zu dem Grad, wo du sagen hast, hey, aber dieses eine Ding will ich da jetzt nicht herinnen haben, weil ich erwarte doch etwas anderes und kann dies durch das Typsystem nicht so ausdrücken.

Stefan

Mach das New Type, dann wird es explizit und dann kannst du genau sagen, hey, an dieser Stelle erwartest du etwas, was so ausschaut, always muss doch etwas anderes sein.

Stefan

Und das finde ich eigentlich ganz brauchbar.

Jochen

Das ist, genau, das benutze ich genau für diesen Use Case, dass man halt oft quasi sowas, zum Beispiel Integer möchte man einschränken von der Range, aber das kann man im Typsystem nicht so richtig ausdrücken.

Jochen

Und ich finde, dann reicht oft schon, um den gleichen Effekt zu haben, im New Type einzuführen.

Jochen

Also wo ich das dann halt zum Beispiel aktuell brauche, ist halt, ich habe halt ein Jahr und ich weiß, dieses Jahr ist halt nur von 2025 bis 2040 oder irgendwie sowas.

Jochen

Und mir reicht im Grunde, wenn, ich mache das gar nicht über das Typsystem, dass diese Range dann sozusagen abgesichert wird.

Jochen

Aber allein, dass ich dadurch, dass ich sage, ich definiere den New Type hier, der halt eigentlich ein Int ist, kann mir der Type-Checker sagen, wenn ich irgendwie mal ein anderes Int da reingesteckt habe, was ich nicht mal als Ja irgendwo anders deklariert habe.

Jochen

Und kriegt dann sozusagen den Effekt, dass wenn da irgendjemand irgendwas reinsteckt, was kein Ja ist, dann gibt es halt auch einen, sagt der Typechecker halt schon, okay, nee, das sieht nicht gut aus.

Jochen

Und so kann man sich halt das sozusagen so ein bisschen herbei emulieren, dass man irgendwie damit auch überprüft, ob das inhaltlich Sinn macht.

Entschuldigung.

Stefan

Also gerade mit dem, also in TypeScript kannst du das ein bisschen.

Stefan

Du kannst teilweise Werte oder geringere Wertbereiche definieren.

Stefan

Also in TypeScript ist es das spannende, wie in jedem Typsystem, du hast Wertemengen und du definierst ja nur, ob dieser eine Wert, den du hast, jetzt in diese Menge passt oder nicht.

Stefan

Das sind sehr große Mengen zum Teil, String, Number oder alle Objects.

Stefan

Zum Teil sind sie halt auf deine Objekttypen heruntergebrochen, wo du sagst, diese Kombination an Properties, die gewisse Typen haben, erlaubst du dort oder nicht.

Stefan

Du kannst aber auch sagen, hey, dieser einzige oder einzelne konkrete Wert, die Zahl 1, das Dring Stefan, was auch immer, kann auch als Typ gelten.

Stefan

Das heißt, du kannst einen Wert haben, wo du sagst, alles was diese Variable annehmen darf, ist der Wert 1.

Stefan

Und das klingt am Anfang doof, weil was machst du mit einer Variable, die nur 1 sein kann?

Stefan

Du kannst das schenken.

Stefan

Aber du kannst noch diese Literal-Types oder Value-Types, dass du benannt hast, Johannes, kombinieren mit anderen Value-Types und kannst dann zum Beispiel alle validen Augenzahlen eines Würfels darstellen.

Stefan

Eins oder zwei oder drei oder vier oder fünf oder sechs.

Stefan

Also damit hast du schon einen sehr, sehr engen Wertebereich definiert und weißt noch aus, wenn ein Wert da reinkommt, dann hat er garantiert eine dieser sechs Zahlen.

Stefan

Und das ist spannend, das kannst du auch mit Strings machen.

Stefan

Und was halt dann wirklich elegant ist, ist, dass du zum Beispiel Strings mit gewissen Pattern definieren kannst.

Stefan

Du kannst sagen, hey, du erlaubst alle Strings, die mit ON anfangen, weil du gerade ein Event-System implementierst und du hast halt on-Click, on Keydown, on Keypress, was auch immer.

Stefan

Das heißt, es muss mit On anfangen und nachher muss der erste Buchstabe unbedingt Großbuchstabe sein.

Stefan

Solche Strings akzeptierst du, andere akzeptierst du nicht.

Stefan

Da kannst du wirklich sehr elegant Wertebereiche definieren, mit denen du korrekte Werte angibst, mit denen du auch über deine Werte diverse Aussagen treffen kannst, die dir auch helfen, die aber jetzt nicht so übermäßig komplex sind, dass du jetzt sagst, hey, das ist jetzt viel zu viel Aufwand, das zu definieren.

Stefan

Mein Lieblingsbeispiel ist immer noch HTTP-Methoden, get put post-delete, was auch immer, oder HTTP-Error-Codes, da gibt es 70 um den Dreh.

Stefan

Ich weiß jetzt nicht, ob es 201 gibt, 217 noch gibt, weiß ich nicht.

Stefan

Das kann man dieser Union-Typ sehr, sehr schön sagen.

Stefan

Und dann bin ich mir sicher, dass ich den richtigen HTTP-Statuscode in meiner Response schicke und brauche nicht großartig überlegen, ob ich noch im richtigen Wertebereich bin oder nicht.

Johannes

Ich muss mich einmal korrigieren, ich habe eben nachgelesen, Value-Types ist nicht das richtige Wort.

Johannes

Es bezieht sich auf was anderes.

Johannes

Das wird als Abgrenzung zum Reference-Type verwendet.

Johannes

Also ob man einen Wert oder eine Referenz hat.

Johannes

Aber das Konzept, das hast du gerade sehr schön erklärt.

Vielen Dank, Steffen.

Stefan

Das ist auch in Kapitel 4 beschrieben von meinem Buch und da bist du ja noch nicht, ne?

Johannes

Naja, das haben wir vorhin schon festgestellt, ich habe noch nicht weit genug gelesen.

Johannes

Aber ich habe es jetzt wieder rausgeholt und jetzt lege ich es mir unters Kopfkissen und werde das per Diffusion.

Stefan

Kurz, es ist so wie die Matura geschafft hat, mit dem Mathematikbuch und den Kopfkisten funktioniert.

Dominik

Ich finde, wir müssen noch ein bisschen darüber reden, wie man das so in Python dann machen kann noch und wie man das Typing-Modul vielleicht noch so ein bisschen benutzt.

Dominik

Alter, wir hatten jetzt so ein New Type, was irgendwie ganz cool ist.

Dominik

Wir hatten die Generics.

Jochen

Ja, die Generics, achso, genau, wo wir dann schon mal, da habe ich nämlich jetzt heute Angst gehabt, als ich versuche, versucht das, da dachte ich mir so, oh mein Gott, wenn hoffentlich fragt das keiner, deswegen frage ich das jetzt mal.

Jochen

Kann mir dann vielleicht erklären, was der Unterschied zwischen Kovariant, Kontravariant und Invariant und so ist.

Jochen

Ja, genau.

Jochen

Weil das kann man nämlich auch mit angeben und ich dachte mir so, okay, ich kann es ja angeben, aber oh Gott, was bedeutet das eigentlich?

Dominik

Und was macht dann Bound und so?

Stefan

Ich kann es aus einer Typtheorie sagen, was kontravariant ist.

Stefan

Ich weiß aber nicht, ob das so auf Python auch zutrifft.

Stefan

Aber ich versuche es jetzt einmal so zu erklären.

Stefan

Kovariant ist, wenn du schnell die Petit fragen.

Stefan

Nein, es ist irrsinnig schwierig zum erklären.

Stefan

Lass mich kurz mein zweites Buch aufmachen, weil da wäre Zeichnung.

Stefan

Aber bevor ich jetzt allgemeine Beschreibungen erkläre, sage ich es lieber einmal so.

Stefan

In einer kovarianten Beziehung hast du zum Beispiel einen Typ, der ist String oder Number.

Stefan

Was bedeutet das, dass wenn du einen Wert hast, der Number ist, dann kannst du den auf jeden Fall auf diesen einen Typen zuweisen, der Strand oder Number sein kann.

Stefan

Das heißt, je enger dieser Wertebereich wird, hat keinen Effekt drauf, kannst du weiterhin darauf zuweisen.

Stefan

Kontravariant ist genug umgekehrt.

Stefan

Du kannst zum Beispiel jetzt nicht eine Funktion, die als ersten Parameter String oder Number oder einen Typen, einen Funktionstypen, der als ersten Parameter String oder Number erwartet, kannst jetzt nicht eine echte Funktion zuweisen, die nur String erwartet, weil ja der Fall, dass auch eine Number als Parameter sein kann, nicht dadurch abgedeckt wird.

Stefan

Das heißt, du ist der Typ zwar auch ein Subtyp, der Parametertyp ist ein Subtyp vom anderen.

Stefan

Aber nachdem der in einer Funktion steht, sind die nicht zueinander kompatibel, sondern nur umgekehrt.

Stefan

Das heißt, du kannst eine Funktion, einen Funktionstypen definieren, der als ersten Parameter eine Number angibt.

Stefan

Was bedeutet, dass du auch Funktionen zuweisen kannst, die String oder Number erwarten, weil eben dieser eine Fall abgedeckt ist.

Stefan

Und das ist der Unterschied zwischen Kovarianz und Kontrovarianz.

Stefan

Brauchst du eigentlich nie, macht dir irgendwelche komischen Fehlermeldungen, wenn du irgendwelche Sachen zuweisen willst, die dann nicht so funktionieren.

Stefan

Ist aber, glaube ich, in der Typtheorie die korrekte Beschreibung.

Stefan

Ist nicht kompliziert, ihr möchte euch da für die Shownotes eine Grafik zur Verfügung stellen, die das wunderschön erklärt.

Stefan

Und da suche ich mir den Link jetzt wirklich raus aus meinem Buch, weil das habe ich genau aus dem Grund, habe ich es da rein da.

Stefan

Weil das sind die Sachen, die merken wir selber nie genau.

Dominik

Das ist, was man immer nachlesen muss.

Dominik

Also in welche Richtung kann man was irgendwie doch voneinander erben, wenn ich das richtig verstehe.

Dominik

Und das eine allgemeine Analyse.

Generisieren.

Johannes

Generisieren.

Johannes

Also ich habe es jetzt hier auch gerade, wenn jemand anders spricht, kann ich ja googlen.

Johannes

Also, so wie ich das jetzt hier verstehe, ist es, das bezieht sich direkt auf Python hier und Qualitätsquelle, Stack Overflow, kann man auch verlinken.

Johannes

Es wird hier so erklärt, du hast zwei Klassen, Basisklasse und eine abgeleitete Klasse.

Die Derived.

Genau.

Johannes

B und D, also Basisklasse und abgeleitete Klasse.

Johannes

Und du hast irgendeinen generischen Typenliste mit irgendeinem Typen drin.

Johannes

Und jetzt ist die Frage, wenn du eine Liste hast, die den Typen B hat, also den Basistypen, kannst du die dann da verwenden, wo du eine Liste vom Typen D erwartest, also eine abgeleitete Klasse.

Oder ist es andersrum?

Dominik

Das wäre dann Kovariant oder Kontravariant.

Johannes

Genau, und das eine ist Kovariant und das andere ist Kontravariant, weil du eben sagst, okay, wenn du den als Generic verwendest, dann geht die Beziehung in die eine Richtung oder die Beziehung geht in die andere Richtung.

Johannes

Und das ist natürlich schön, dass man da zwei Worte genommen hat, die exakt gleich klingen.

Dominik

Also Kovariant ist, wenn man quasi annotiert mit der Implementierung und Kontravariant ist, wenn man mit der Basis annotiert, ja.

Dominik

Und Invariant wäre dann, wenn man nicht beides verwenden darf, weil der sagt ja halt, nö, denn das ist nicht genau das, was ich erwarte.

Johannes

Ja, irgendwie so.

Johannes

Für genauere Sachen muss man PEP 484 lesen.

Das haben wir ja sicherlich alle schon gemacht.

Johannes

Da muss man gar nicht genauer drauf eingehen.

Jochen

Ich packe die Grafik in die Show Notes und dann schauen wir mal, genau.

Johannes

Schauen wir mal, was das hilft.

Jochen

Ja, aber genau, ich dachte auch so, also man kann das ja angeben und dann dachte ich so, ich habe das noch nie verwendet.

Jochen

Ist das irgendwie, hab ich was, passe ich was?

Dominik

Und was macht dann Bound?

Dominik

Also, weil das macht man ja irgendwie auch bei den Conta-Variants oder was sagst du das?

I don't know.

Dominik

Steht zumindest in der Typ, Pising, Typing.

Johannes

Tatsächlich ist in dem PEP 484 eine sehr schöne Erklärung drin.

Johannes

Mit Employees und Managers.

Johannes

Wenn du eine Liste, wenn du eine Funktion hast, die eine Liste von Employees nimmst, solltest du da, kannst du da eine Liste von Managers reingeben.

Johannes

Und für manche Funktionen kann das Ja sein, wenn du halt sagst, okay, wir müssen Gehalt auszahlen, das müssen Angestellte kriegen und wenn die angestellten Manager sind, dann ist es halt so.

Johannes

Kann aber auch nein sein, dass du, dass du zum Beispiel, keine Ahnung, alle, die

Dominik

alle Angestellten feiern, Manager feuern.

Johannes

Genau.

Johannes

Zum Beispiel, dass du die, nee, aber dass du zum Beispiel jemanden hinzufügst zu dieser Liste.

Johannes

Und wenn du sagst, okay, die Funktion nimmt eine Liste, die die Angestellte enthält, dann kannst du in diese Liste auch einen Angestellten rein reintun.

Johannes

Wenn du aber eine Liste von Managern reingegeben hast, dann geht das nicht.

Johannes

Und das ist jetzt eben genau so eine Frage, wo du beide Optionen haben kannst, also so eine Situation, wo du beide haben kannst und das tatsächlich auch eigentlich beantworten können musst, ob du da eine abgeleitete oder eine Basisklasse reingeben darfst.

Dominik

Das ist eine Co-Variante, eine Kontrollvariante.

Dominik

Und der Bound ist dann quasi tatsächlich die, wenn dann erst die Manager gefallen, weil das die spezialisiertere Variante ist.

Dominik

Ja.

Dominik

Ja, wir haben noch mehr von Typing-Modul, damit wir uns noch mehr schöne Sachen dazu erzählen können und mehr ergänzen können mit präzisem Fachwissen.

Dominik

Und zwar den Type-Alias und die Type-War.

Dominik

Die da noch irgendwie dazu können.

Dominik

Also was ist denn der Unterschied?

Dominik

Und man kann ja auch noch das schöne Keyword-Type dazu schreiben und sowas.

Jochen

Na, ich meine, weil bei Type-Alias, das kannst du auch einfach so hinschreiben.

Jochen

Das ist nur eine explizitere Darstellung.

Jochen

Und manchmal ist es halt problematisch, wenn du zum Beispiel einfach einen String verwendest, den du ja auch quasi benutzen kannst, statt, und manchmal muss man das ja auch zyklische Imports zu vermeiden und so.

Jochen

Und dann ist halt unklar, was gemeint ist, wenn man nicht Type-Alias davor schaut.

Dominik

Also beispielsweise, wenn ich jetzt irgendwie eine Union habe, das könnte jetzt mehrere Sachen sein, dann kann ich dann Tabi Alias für verwenden, dass es das damit gemeint ist, ihm einen Namen gibt.

Jochen

Ja, aber du könntest ja auch einfach hinschreiben, MyUnion gleich und dann irgendwie der Typ oben, Pipe-Symbol, der andere.

Jochen

Aber wenn du.

Dominik

Du hast dann ein Type-Alias schon.

Dominik

Das heißt, das selber kann ich annotieren mit Nein, ist es nicht.

Jochen

Ja, also du könntest damit dann wieder adortieren.

Jochen

Aber wenn du jetzt zum Beispiel da Strings verwenden wollen würdest für die Typ-Typen, dann geht es halt nicht mehr so richtig.

Jochen

Und dann macht, also Type-Alias macht das dann halt explizit, dass das halt sozusagen.

Der Alias ist, okay.

Dominik

Und die Type war, das hatten wir eben.

Dominik

TVK TKV, was warum TKV?

Dominik

Ein besonderer Sinter, weil ich diese kurzen Dinge, also einer der Grunde, warum ich Go nicht leiden kann, sind diese Ein-Charakter-Variablen-Namen.

Johannes

Ja, das sind halt die Generics, oder?

Johannes

Die wir vorhin hatten.

Genau, genau.

Johannes

Stefan, du hast angesetzt.

Erklär uns, was Type ist.

Stefan

Ja, ja, also ich habe jetzt ganz kurz diesen PEP484 aufgemacht und der ist wunderschön.

Stefan

Also Type-Variable, also immer Type-Parameter dazu, aber das ist im Grunde genau das gleiche.

Stefan

Das ist eben ein Typ, der später durch einen konkreten Typ ersetzt wird.

Stefan

Das heißt, du kannst jetzt sagen, diese Typ-Variable in diesem Beispiel von PEP484 ist das ST.

Stefan

Seized-Type wird das heißend worden, weil da geht es um Siist.

Stefan

Wo du sagst, hey, du machst jetzt eine Funktion, die erlaubt x beliebige Typen, allerdings kannst du sie durch irgendeinen Bound, das ist das zweite Dorten, der zweite Parameter, einschränken.

Stefan

Also ein Bound sagt hier, also der generellische Typarameter sagt hier, alle möglichen Werte, aber später nur ein konkreter.

Stefan

Und der Bound sagt hier, alle möglichen Werte, die auch diese Eigenschaften erfüllen, später ein konkreter.

Stefan

Und das ist dort in diesem Beispiel recht gut, weil du wird Seized als Bound definiert, was bedeutet, dass du eine Länge definieren können musst oder Länge lesen können musst.

Stefan

In Python hast du nur diese Hilfsfunktion, du hast ja selten Methoden auf Klassen, soweit ich das weiß.

Stefan

Deswegen brauchst du halt überall diese Bounce.

Stefan

Andererseits könntest du ja sagen, du hast irgendeine Subklasse oder so.

Stefan

Aber Bound ist auch etwas, das kennen wir in anderen Programmiersprachen auch.

Stefan

In TypeScript wird das als Constraint bezeichnet.

Stefan

Aber im Grund geht es darum, dass du einfach vordefinierst, du hast ein paar Eigenschaften, die du sicherstellen willst.

Stefan

In dem Fall, was dort dann beim PEP 484 ist, mit diesem Upperbound sagst du einfach, du willst die Möglichkeit haben, eine Länge zu berechnen.

Stefan

Du willst einfach wissen, hey, da gibt es eine Size, das hat eine gewisse Länge, Größe, was auch immer.

Stefan

Spannend wäre so, ob ich dort einen String reingeben kann, weil man kann auch die Länge von einem String definieren.

Ja, kannst du.

Stefan

Genau.

Stefan

Alles klar.

Johannes

Cool, dass die Lennen von irgendwas hat.

Ja.

Stefan

Also ich kenne keinen Python, aber ich habe diesen Codes gelesen und weiß sofort, was ich dazu erwarten habe, weil String muss auch eine Länge rauskriegen.

Schon cool.

Johannes

Und das ist auch sehr interessant hier, weil also diese Type-Variable, die gerade in diesem Beispiel, ich habe es zufällig auch gerade offen, benutzt wird, die wird in dieser Funktion, da wird eine Funktion definiert, die heißt longer und die nimmt zwei Variablen x und y, die sind beide vom Typ ST und der Rückgabewert ist ebenfalls ST.

Johannes

Und das ist eine sehr interessante Sache, weil das eben bedeutet, du kannst hier zwei Sachen reingeben, die von der gleichen Sorte sind und kriegst wieder eins raus, was wieder von der gleichen Sorte ist.

Johannes

Aber wir sagen gar nicht genau, was das für eine Sorte ist, sondern wir sagen nur, das muss als Anforderung haben.

Johannes

Das Minimum, was es erfüllen muss, ja, das ist der Bound.

Johannes

Ich muss davon die Länge abrufen können.

Johannes

Und das hat diese Funktion schon sehr genau spezifiziert.

Johannes

Die Spezifikation dieser Funktion, also Longer XY, ist ja erstmal sehr lose und jetzt durch diese Typvariablen und durch den Bound ist es doch relativ genau spezifiziert und auch sehr exakt, würde ich sagen.

Stefan

Was ich sehr spannend finde an dem Beispiel, und das ist wahrscheinlich jetzt so eine Python-Eigenwart, aber im ersten Aufruf wird dort dieser generische Typ-Parameter oder diese Type war ersetzt durch eine List.

Stefan

Das ist, glaube ich, die eckigen Kammern nicht.

Stefan

Im zweiten Aufruf, da hast du geschwungene Klammern, wird durch ein Set ersetzt, also der Typ wird durch ein Set ersetzt.

Stefan

Aber im dritten, da ist im ersten Aufruf eckige Klammern, im zweiten Parameter sind geschwungene Klammern.

Stefan

Da wird der Parent-Type davon, eine Collection, verwendet, wo du sagst, hey, okay, ist nicht List, ist nicht Set.

Stefan

Also es könnte beides sein, du nimmst einfach was, was beide beschreibt.

Stefan

Finde ich cool, dass das das Typsystem so macht.

Stefan

Normalerweise würde TypeScript dir da vielleicht einen Fehler werfen.

Stefan

TypeScript würde da sagen, hey, wenn du das einmal durch einen Typ ersetzt, dann musst du auch im zweiten Parameter den gleichen Typ verwenden.

Stefan

Und so findest du aber in der Hierarchie tatsächlich einen Parent-Type, den du nutzen kannst.

Das ist ziemlich geil.

Stefan

Also richtig cool.

Johannes

Ja, das ist ziemlich schön.

Stefan

Es ist nämlich ja so, dass ich das jetzt verwenden möchte, muss ich ganz ehrlich sagen.

Stefan

Ich glaube, ich habe das so weit.

Dominik

Sehr gut.

Johannes

Viele Programmiersprachen-Features kommen ja durch Knight umgesetzt, das ist bei Python und auch nicht anders.

Johannes

Viele Sachen sind einfach aus Knight durch andere Sprachen entstanden.

Stefan

Nein, also den größten Knight habe ich ja durch die Imput-Signatur.

Stefan

Das macht einfach so viel einfacher.

Stefan

In JavaScript ist umgekehrt, du importierst zuerst die Einzelelemente aus dem Paket und das ist reine Ästhetik, so ist viel klarer.

Stefan

Du spezifisierst zuerst das Paket und dann importierst du die Sachen draus.

Stefan

Jeder Editor freut sich, wenn er das so kriegen kann.

Ja.

Dominik

Was mich noch interessieren würde hier an der Stelle, ist diese Overloads, die da mit drin stehen.

Dominik

Das ist ja auch so eine Sache, dass die man nur bei den Type-Annotations findet oder auch woanders, wo halt derselbe Methodenname mehrfach hintereinander definiert wird.

Dominik

Was macht denn das genau?

Stefan

Schreibst du in Python dort dann beide Methoden aus?

Stefan

Also implementierst du da beide Methoden oder sind es nur die Signaturen?

Johannes

In Python musst du dich da anstrengen dafür.

Johannes

Das hat ja nicht mal viel mit, ja, es hat vielleicht schon was mit Hypes zu tun, aber also so richtiges Overloading gibt es ja gar nicht in Python.

Johannes

Du fügst eine weitere Signatur hinzu zur Methode.

Dominik

Ja, genau, aber was macht denn das?

Dominik

Und warum macht man das?

Stefan

Du hast noch nicht zwei Funktionen, du hast zwei Signaturen.

Johannes

Du hast eine Funktion, die, also es ist so, der ganz grundlegende Prozess ist, dass eine Funktion in Python eine Variable ist, die halt ein Funktionsobjekt enthält.

Johannes

Und diese Variable hat einen Namen und diesen Namen, der ist eindeutig, den kann es nur einmal geben.

Johannes

Und zu diesem Namen kann es auch nur diese eine Funktion geben.

Johannes

Was du jetzt aber machst, um Überladung zu machen, und das ich erkläre es gleich noch für die Zuhörer, ja, ist, dass du sagst, du definierst eine Basismethode und der fügst du dann eine weitere Signatur hinzu.

Johannes

Und wenn diese, da ist dann eben so ein Dur Dekoratoren, hast du so einen Mechanismus, der diese Signaturen entsprechend überprüft.

Johannes

So, was ist Überladung überhaupt und was erreicht man damit?

Johannes

Überladung ist, wenn du eine Funktion, also ganz klassisch aus dem Java-Umfeld, wenn du eine Funktion hast, die heißt add und die definierst du für Float und Float und dann kommt hinterher wieder ein Float raus.

Johannes

Dann funktioniert die ganz einwandfrei für Floats, aber du kannst damit nicht int addden.

Johannes

Du kannst keine Integer addieren, weil der Compiler dir sagt, ja, ich habe die Funktion gefunden, aber die geht nur für Floats.

Johannes

Was du jetzt in Java machst, ist, du schreibst eine zweite Funktion, die auch add heißt, aber die eine andere Signatur hat.

Johannes

Und die wird durch das Kompilat zu einer anderen Funktion.

Johannes

Das heißt, zum Zeitpunkt des Kompilierens kann der Compiler sagen, ah, du meintest diese Funktion mit der Signatur oder du meintest diese Funktion mit der Signatur.

Johannes

Und das geht auch in TypeScript, wenn ich mich recht erinnere, dass du überladene Methoden hast, die dann eben durch den Compiler zum Zeitpunkt des Compilens die richtige Zuweisung bekommen, die sind dann im JavaScript-Kompilat heißen, die dann unterschiedlich, weil die eben da unterschiedlich sind.

Stefan

Das ist genau der Unterschied.

Stefan

Heißt das nicht?

Stefan

Ein Overload in TypeScript ist im Grund nur eine andere Funktionssignatur auf Basis über der tatsächlichen.

Stefan

Du musst mindestens zwei angeben, eine, die dem Typs-System mitgeteilt wird als Nutzungssignatur und eine, die du verwenden kannst, noch um tatsächlich die Funktion zu implementieren.

Stefan

Und dann kannst du so viele Overload schreiben, wie du willst, und du hast dort einfach unterschiedliche Aufrufe, durch die du durchgehen kannst, aber im Endeffekt wird nur eine Methode aufgerufen oder eine Funktion aufgerufen.

Stefan

Deswegen habe ich genauso nachgefragt, weil ich bin mir nicht sicher, wie das jetzt in Python funktioniert, weil es ist spannend.

Es wird für und wieder, ne?

Okay.

Johannes

In Python ist ein bisschen anders.

Johannes

In Python musst du das eben über Dekoratoren machen, weil du diesen Namen nicht mehrfach haben darfst.

Johannes

Und was da im Wesentlichen passiert, ist, du sagst, wenn die Methode aufgerufen wird mit zwei Variablen oder mit Argumenten, die dieser Signatur entsprechen, dann rufe bitte diese Subsignatur auf.

Johannes

Also du fügst da quasi eine weitere Funktion hinzu, die nur in bestimmten Fällen aufgerufen wird.

Johannes

Aber das ist was, was zur Laufzeit passiert.

Johannes

Also zur Laufzeit wird dann entschieden, welche Submethode aufgerufen wird.

Johannes

Das ist im Wesentlichen ein Matchcase, der da vorsteht.

Jochen

Naja, aber ich weiß nicht, ob das im Typing-Zusammenhang nicht was anderes ist.

Jochen

Also ich meine, es gibt diese Overload-Geschichten vielleicht in Klassen, weil ich aber hier auch bei den Funktionen, wenn ich jetzt einfach das sozusagen für diese Typ-Annotation verwenden will, dann ist es, soweit ich sehen kann, auch so.

Jochen

Es gibt die Funktion einmal, aber ich kann halt viele sozusagen mit Overload dekorierten Funktionen haben, die keine Implementation haben, aber wo ich sozusagen nur quasi die unterschiedlichen möglichen Arten, wie ich das, wie das aufrufen werden kann, halt annotiere, weil ich das nicht in eine Annotation schreiben kann, weil geht halt nicht.

Jochen

Und ja.

Achso, okay.

Jochen

Da gibt es zwei, also es gibt halt, dann habe ich, also es gibt mehrere Overload-Dinge, denke ich.

Genau, also

Johannes

das ist blöd, ja.

Es ist blöd, dass es die, dass diese Sachen in unterschiedlichen Sprachen unterschiedliche Dinge bedeuten.

Johannes

Und es ist, also wenn ich der Kaiser wäre, dann wäre das anders.

Also das ist tatsächlich was, was ich vermisst habe, ja, an Python.

Johannes

Als ich zu Python gekommen bin aus Java.

Johannes

In Java kannst du sagen, ich habe hier eine Funktion, die heißt add und die nimmt Integer und ich habe eine Funktion add, die nimmt Strings und ich habe eine Funktion add, die nimmt was weiß ich, ja, Listen.

Johannes

Und die machen sehr unterschiedliche Dinge, aber im Endeffekt das gleiche Semantische.

Die fügen die aneinander.

Johannes

Und die heißen gleich, weil die das gleiche machen.

Johannes

Und sowas gibt es in Python nicht, weil in Python musste jedes Mal einen neuen Namen haben dafür oder einen neuen Scope oder so.

Ja, das hat.

Stefan

Also weißt du, warum das in Java überhaupt möglich ist, dass du den gleichen Namen mehrmals vergeben kannst.

Johannes

Ja, weil die beim Kompilieren die Namen, weil die Namen weg sind beim Kompilieren.

Stefan

Nein, nein, weil die

Funktionssignatur ein Typen.

Stefan

Nein, weil die Funktionssignatur die Typen haben, weil Java-Typen erfordert und dadurch ist einfach genug unverbunden, um das zu identifizieren können.

Johannes

Genau, es sind unterschiedliche Funktionen.

Johannes

Also die Funktion add int int ist eine andere Funktion als die Funktion addFloatFloat.

Stefan

Und darum ist es natürlich in JavaScript.

Stefan

Genau, darum ist sie in JavaScript, TypeScript und Python halt komplett anders, weil im Endeffekt hast du halt nur eine Funktion mit ein paar Parametern.

Stefan

Und die Typen sind ja, wie wir mitbekommen haben, eh eigentlich wurscht.

Die sind dann weg.

Jochen

Ja, zur Laufzeit aufhin.

Johannes

Aber diesen Mechanismus, den kriegst du hin, der heißt Single Dispatch.

Johannes

From Funct Tools Import Single Dispatch, PEP 443.

Johannes

Das, was ihr beschrieben habt, das heißt Overload, das ist ja was ganz anderes.

Python Langutil.

Äh.

Jochen

Okay.

Jochen

Ich habe es jetzt hier aus From Typing, also so wie ich das gesehen habe, es gibt auch so ein sehr schönes Beispiel dafür.

Jochen

Das ist auch aus dem Flow-Python-Buch, habe ich das da.

Jochen

Also das ist halt so ein Beispiel für Methoden, die halt eigentlich in, also die halt auch so ein Problem, das man mit Type-Annot-Annotationen halt so hat, beschreiben, nämlich dass man, dass halt die Typ-Annotationen nicht so express, also die ist ja auch eine Sprache, ist halt eine andere Art, das hinzuschreiben.

Jochen

Und die ist halt nicht so expressiv wie Python selber.

Jochen

Das heißt, wenn ich jetzt Funktionen habe, wie zum Beispiel Min und Max, jetzt weiß ich gar nicht, ob es das in der Type JavaScript-Welt auch so gibt, aber die kann ich halt sehr schön in Python hinschreiben, so in irgendwie so 20 Zeilen oder sowas und ist sehr, sehr schön zu lesen, ist nicht kompliziert.

Jochen

Und die Typ-Annotation dafür ist aber sehr, sehr schwer, weil das halt so super generisch ist und dann kann man noch ein Callback übergeben, das halt irgendwie zum Sortieren verwendet wird und sowas.

Jochen

Und ja, die korrekten Type-Annotationen für Min und Max sind halt sehr viel länger als die Implementation.

Jochen

Und das ist halt, äh, liegt halt daran, dass man das in dieser neuen Annotationssprache halt nicht so gut hinschreiben kann.

Jochen

Und dafür, also da hast du dann halt so irgendwie, ich weiß nicht, zig Overloads, weil du kannst das sowieso immer nur quasi für einen Teil der, wie man das aufrufen kann, halt annotieren und dann musst du das halt, musst du halt zehn Dinger übereinander häufen, um das halt irgendwie abgebildet zu kriegen.

Jochen

Und ja, und auch in diesen Dingern sind dann halt, waren halt lange Fehler drin und die sind halt auch echt schwer zu finden.

Jochen

Also ja.

Und die machen ja auch überhaupt gar nichts, diese Fehler, jetzt mal ganz ehrlich.

Jochen

Ja, na gut, also irgendjemand hat dann halt offenbar lange genug.

Jochen

Irgendjemand, also es kann ja sein, du rufst das halt auf, lässt auf eine bestimmte Art und dann läuft dein Type-Checker drüber und der sagt, der spuckt dir dann halt irgendeine Fehlermeldung aus, die vollkommen unverständlich ist und es verdufft dir halt den Vormittag oder so, weil du verstehst gar nicht, wo das Problem ist.

Jochen

Und dann war es halt nicht mal wirklich ein Problem, sondern es ist einfach nur etwas, was halt in den Annotationen kaputt war.

Jochen

Und du hast es korrekt aufgerufen, das ist ja schon ärgerlich.

Jochen

Also ich meine, ja, also ja, ja, gut.

Johannes

Zugegeben, ja.

Aber was war jetzt die Lösung Jochen?

Johannes

Weil ich habe dich jetzt unterbrochen, aber gibt es da jetzt eine Lösung dafür?

Johannes

Kann ich jetzt da Overload sagen.

Jochen

Genau.

Jochen

Und du kannst jetzt, also sozusagen, wenn du eine Funktion annotieren möchtest, aber das halt die Annotation nicht einfach so hinschreiben kannst, dann kannst du die möglichen Arten, wie das halt, also die, wenn es halt mehrere, wenn du mehrere Annotationen hinschreiben musst für die Funktion, kannst du das per Overload hinschreiben.

Jochen

Hast dann halt der Methodenbody oder Funktionsbody ist dann halt Ellipsis, also Punkt, Punkt, Punkt.

Jochen

Und genau, dann kannst du halt alle Arten, wie man das Ding halt getypt aufrufen kann, halt hinschreiben.

Johannes

So richtig schön sieht es aber auch nicht aus.

Jochen

Nee, das sieht nicht schön aus.

Stefan

Ich würde es zum Beispiel in TypeScript auch nicht immer verwenden.

Stefan

Meistens ist das ein Codes, weil wenn du Methoden oder Funktionen hast, die mehr können soll.

Stefan

Als für das, was sie beschreibt.

Dominik

Ja, so ein bisschen so eine Krücke, ne?

Dominik

Warum macht man das dann nicht?

Dominik

Vielleicht, wenn man so ein Public-AP-Interface hat, was unbedingt benutzbar bleiben muss, aus irgendwelchen Gründen.

Dominik

Vielleicht für Legacy oder.

Stefan

In JavaScript gibt es es, weil, also in TypeScript gibt es es, weil du halt in JavaScript Parameter weglassen kannst oder Parameter in unterschiedlichen Positionen auch was anderes heißen.

Stefan

Und da der TypeScript irgendeine Methode braucht, um das darzustellen.

Stefan

Und deswegen haben wir es.

Dominik

Ja, gut, wenn man ein Sternchen, Quark schreibt oder sowas.

Stefan

Also gerade dieses Add-Beispiel vom Johannes, das würde ich eigentlich jetzt den TypeScript mit Generics umsetzen.

Johannes

Ja gut, wenn du jetzt eine Methode add für Integer und eine Methode add für String hast, musst du ja schon zwei unterschiedliche Implementierungen haben auch.

Also an irgendeiner Stelle musst du ja dann die Implementierung verzweigen.

Stefan

Nicht in JavaScript.

Johannes

Ja, wenn du Plus verwendest, okay, aber dann muss das Plus irgendwo hin verzweigen, weil das macht ja sehr unterschiedliche Dinge.

Dominik

Der müsst ihr dann da nicht überschreiben.

Ja, ja.

Dominik

Ja.

Dominik

Was mir noch fehlt, wir haben schon relativ viel gesagt, was ist sowas wie, ich glaube, es ist eben schon einmal gefallen, so etwas wie rekursive Types oder sowas, wenn ich zum Beispiel einen JSON-Type definiere oder sowas.

Oh, sag doch nicht sowas.

Stefan

Kapitel 7.

Johannes

Da bin ich ja noch weit entfernt von Kapitel 7.

Stefan

Rekursive Types ist schon nötig, wenn du jetzt zum Beispiel irgendwie eine Liste definieren willst, einfach verkettete Liste, dann hast du dort nur einen Knoten und der verweist auf den nächsten Knoten.

Stefan

Aber das ist eigentlich nur Typsystemfu, nicht.

Stefan

Also du musst nicht irgendwie die Möglichkeit haben, dass du Typen definieren kannst, die sich selbst referenzieren können, wenn nötig.

Dominik

Also wie JSON-Objekte oder sowas zum Beispiel tatsächlich.

Stefan

Zum Beispiel, ja, genau.

Stefan

Also in JSON kann es ja auch sein, dass du naja schwierig.

Dominik

Ja, eine Liste von Objekten habe, in denen andere das entschecken, die wieder irgendwie Teugs haben oder so.

Ja, genau.

Stefan

Oder ein Array von Arrays, wenn du schon dabei bist.

Stefan

Aber ich habe einmal mit jemandem vom TypeScript-Team gesprochen bezüglich rekursiven Typen.

Stefan

Das ist meistens ein Implementierungsdatei, wie tief der Compiler da dann gehen kann.

Stefan

Also was sind die, wie ist der Compiler entwickelt, dass er bald genug sagen kann, hey, da stoppe jetzt und pass nicht mehr weiter.

Stefan

Also wie geht der Compiler mit der Rekursion?

Dominik

Ja, da auch in der IDE irgendwie, ich weiß nicht, bei JSON-Type oder sowas, bis wie viel Level tief darf der denn gucken, ob das noch stimmt und

so geht es nicht kaputt, ja.

Stefan

Und da wären es auch immer besser, der Mathe-Scripte-Compiler ist schon recht.

Johannes

Das ist der Mathematik egal, die guckt.

Ja.

Jochen

Genau.

Jochen

Ja, das kommt dann wieder darauf an, welche Art von Mathematik, wenn man den konstruktiven Zweig anhängt.

Jochen

Aber das gibt es gar nicht.

Jason, hast du schon

Johannes

schon in der Grundvorlesung, also ich habe ja eine mathematische Ausbildung genossen an der Universität, da werden dann die natürlichen Zahlen nochmal definiert und die werden rekursiv definiert.

Johannes

Da gibt es eigentlich nur eine natürliche Zahl, das ist die 0 oder die 1, je nachdem, wo du anfangen willst.

Johannes

Und dann sagt man einfach, jede Zahl hat einen Nachfolger und zack, hast du alle natürlichen Zahlen beisammen.

Johannes

Es geht schon weit rein mit der Rekursion und die geht auch weit genug in der Mathematik.

Ja, ja, ja.

Jochen

Ja, ich weiß nicht, haben wir noch.

Jochen

Ah, oh, was mir noch einfällt, genau.

Jochen

Das schließt so ein bisschen an das Piedentic-Thema von eben an.

Jochen

Ich meine, das ist ja jetzt etwas, was man, also die Typen werden ja zur Laufzeit ignoriert in Python, aber nicht immer und man müsste es auch nicht, weil im Grunde kann man rausfinden, wie die Annotationen sind.

Jochen

Und es gibt halt auch Software, die das macht, wie zum Beispiel Pydentic.

Ja, oder MyPy.

Oder FastAPI oder FastAP.

Ja.

Genau.

Jochen

Gibt es sowas eigentlich in TypeScript auch?

Jochen

Weil, ich meine gut, das wird ja kompiliert zu JavaScript, aber es gibt ja jetzt auch, glaube ich, Interpreter, die direkt TypeScript interpretieren, so Deno oder sowas macht das, glaube ich.

Jochen

Ich weiß nicht so genau.

Jochen

Könnte das ja im Unternehmen.

Stefan

Das ist ja ein weit verbreiteter Ihr glaube ich, dass Deno direkt TypeScript interpretiert.

Stefan

Ach so.

Stefan

Deno hat nur einen TypeScript-Compiler inkludiert.

Stefan

Also kompiliert TypeScript, bevor er es JavaScript ausführt.

Stefan

Also tatsächlich, ich sage mal, im JavaScript-Bereich reden wir eher von unterschiedlichen Typsystemen, die existieren.

Stefan

Wie Flow-Type ist zum Beispiel eins, das sehr, sehr optisch sehr, sehr ähnlich ist zu dem, was TypeScript zur Verfügung stellt, aber halt in den Noncen unterschiedlich ist.

Stefan

Oder eben TypeScript, und das sind auch schon die populärsten.

Stefan

Der Closure-Compiler hat aber ähnlich funktioniert.

Johannes

Wie Typen definiert werden.

Stefan

Ja, CoffeeScript ist aber sogar eine eigene Programmiersprache.

Stefan

Also wie Typen

Johannes

definiert werden.

Gleiche Historik.

Stefan

Ähnlich, ähnlich.

Stefan

Da gibt es einen wichtigen Punkt, weil wie Typen definiert werden in JavaScript, das ist ja eigentlich nicht, dem TypeScript-Team zu verdanken, sondern dem ECMAScript 4-Standard, der schon viel, viel älter ist, der nie umgesetzt wurde, an den sich aber alle Typsysteme jetzt irgendwie dranhalten bei der Definition des eigenen Typsystems.

Stefan

Ich würde eher sogar sagen, dass ActionScript, also die Flash-Programmiersprache, noch eher ähnlicher oder verwandter mit TypeScript and Flow Type ist.

Stefan

Aber das ist es dann auch.

Stefan

Also du hast entweder unterschiedliche Typ-Systeme, dann entscheidest du in the meisten Fällen heutzutage eh für TypeScript und dann bietet die TypeScript eigentlich alles, was du dafür brauchst.

Stefan

Also du laufst gar nicht in Gefahr, dass du irgendwie an others werkzeug nimmst.

Stefan

Und TypeScript versteht halt auch komplett JavaScript.

Stefan

Das heißt, du kannst halt dort with JavaScript-Code anfangen und dich nur mal auf die Typen-Inferenz vom TypeScript-Type-Checker verlossen.

Stefan

Dass du sagst, hey, ich weiß jetzt, welche Typen du verwendest rein in der Verwendung deines Codes.

Stefan

Dass du jetzt so eine retroaktive Typ-Annotation machst, macht man eher nicht.

Stefan

Es gibt ein paar Werkzeuge, ich könnte dir aber jetzt nicht diesen Namen dazu sagen.

Stefan

Macht man aber aus dem Grund nicht, weil der TypeScript-Type-Checker eh gut genug ist, dass er schon sehr, sehr viel rausfindet, bevor du überhaupt irgendeine Annotation machen musst.

Stefan

Was ein gutes Migrationssool ist, ist JSDoc, das sind halt ein Typ Annotationen im Kommentar, wo du einfach sagst, hey, du hast diese Funktion, die auch drei Parameter, du definierst den Typen im Kommentar und nicht im Code.

Stefan

Und das machen viele Bibliotheken, das machen sehr viele alte JavaScript-Bibliotheken, wie zum Beispiel Lodesh oder Anderscore, schon.

Stefan

Und TypeScript kann mit dem umgehen.

Stefan

Also TypeScript kann auch Typinformationen aus diesen Kommentaren lesen und hat halt so weit mehr Kompatibilität mit dem gesamten Ökosystem, als wie wenn sie darauf bestehen würden, dass sie nur die Typen verwenden, die du annotierst.

Johannes

Okay, aber so ein richtiges Äquivalent zu dem, was der Jochen gefragt oder gesagt hat, gibt es nicht wirklich.

Johannes

Zur Laufzeit hast du nicht wirklich mehr die Typinformation.

Stefan

Also zur Laufzeit es gibt Bibliotheken, die fügen Typinformationen zur Laufzeit hinzu und leiten dadurch TypeScript-Typen ab.

Stefan

Aber das ist es dann schon.

Stefan

Also es gibt auch aber so Reflection-Geschichten.

Johannes

Achso, okay, dass du so rumgehst.

Stefan

Das ist aber alles Moonpitz.

Stefan

Also das würde ich alles nicht.

Stefan

Das möchte ich nicht einmal erwähnen, weil es einfach Schwachsinn ist.

Stefan

Eine Sache, die aber gut ist, zum Beispiel dieses SOD, wenn du jetzt sagst, hey, du brauchst jetzt Typinformation zur Laufzeit auch, dann kannst du über die SOD-Bibliothek dir deinen Typen in JavaScript definieren.

Stefan

This is aber nicht TypeScript, das ist JavaScript.

Stefan

Und kannst dann, wenn du diesen Typen weiter im TypeScript-Code verwenden willst, sagen, hey, leite mir jetzt aus diesem JavaScript-Konstrukt, das ich gebaut habe, das einen Typen darstellen soll, leite mir von diesem JavaScript-Konstrukt doch einen TypeScript-Typen ab, den ich weiterverwende.

Stefan

Und du bekommst dann zum einen einen Typen, classischer TypeScript-Typ, den du in deinen Methodensignaturen verwenden kannst, den du annottieren kannst, wo du Type-Checken hast, das funktioniert, das ist grandios gut.

Stefan

Parallel dazu hast du aber immer noch dieses JavaScript-Konstrukt, mit dem du Validierungen anfangen hast.

Stefan

Das heißt, du kannst sagen, hey, du kriegst jetzt so JSON from the backend, steckst it in the validator rein und kriegst entweder Ergebnis, das nachher dem Typen entspricht, super, oder Fehlermeldung, mit der du umgehen kannst.

Stefan

Und das ist eine grandiose Bibliothek.

Stefan

Also erstens ist sie so nah an TypeScript, dass du wirklich sämtliche Dinge, die du in TypeScript schreiben kannst, auch damit umsetzen kannst.

Stefan

Und zweitens ist sie schnell, sie macht robusteren Code, ich bin total glücklich mit der, die kann ich sehr, sehr gut empfehlen.

Also unbedingt.

Stefan

Aber prinzipiell gilt als man.

Okay, cool.

Johannes

Also ähnliches.

Stefan

Also in der Verfahren.

Stefan

Sehr ähnlich.

Stefan

In SOT ist es aber so, dass du halt die Typen dann anfängst zu schreiben in dieser JavaScript-Welt mit den dort vorhandenen Methoden und Funktionen.

Stefan

Und das ist halt umgekehrt zu dem, was du, wie du normalerweise in TypeScript hast, dass du sagst, du schreibst dir einen Typen und die sind nach dem Kompilator einfach weg.

Stefan

Also TypeScript ist so eine Erase-to-JavaScript-Sprache, was auch bedeutet, wenn du es dir zur Laufzeit haben willst, musst du in JavaScript anfangen und musst dir den anderen weggehen.

Johannes

Ja, okay, aber da steht ja nicht, würde ja nicht prinzipiell was dagegen sprechen, oder?

Dass du von TypeScript zu JavaScript beziehungsweise.

Johannes

Es ist nur ein Teil des Tooling, es existiert.

Johannes

Ja, okay, aber das ist auch gut.

Johannes

Also du hast auf jeden Fall das Leistung.

Stefan

Unbedingt zu empfehlen.

Stefan

Ja, unbedingt zu empfehlen.

Also das ist richtig richtig.

Johannes

Finde ich super spannend.

Johannes

Könnte auch für mich nützlich sein.

Stefan

Also gerade wenn du mit Backends arbeiten musst, denen du nicht trauen kannst, herrlich.

Ja, oder mit Inputs von Benutzern.

Johannes

Ich meine, da musst du eh immer Validierung machen, aber das kann einem ja in dem Sinne die Arbeit ein bisschen abnehmen.

Jochen

Naja, quasi man definiert halt, wie man gerne hätte, dass die eigene Datenstruktur aussieht und benutzt dann diese Information halt auch zur Validierung dagegen.

Jochen

Das ist natürlich, also ja, das ist genau eigentlich der Use Case von Piedentic ja auch.

Stefan

Muss man das Patentik nur genau anschauen?

Stefan

Also das ist ja jetzt um Satmail, ob es heute gehört, wie wir begonnen haben.

Johannes

Erklär mal Jochen, wie er denn zwischen Fast API und Padantic.

Jochen

Ach, ja, FastAPI ist sozusagen ein

Dominik

Interface, was Advent-Server.

Jochen

Ja, genau, oder?

Jochen

Padentic ist eine Bibliothek, die benutzt wird von Fast API.

Jochen

Und die halt sozusagen ermöglicht, wenn man halt mit Typ-Annotationen sozusagen oder der Syntax, man.

Jochen

Es gibt noch mehr, weil man kann halt auch noch mehr machen, als nur die Sachen, die mit Annotationen möglich sind.

Jochen

Man kann halt auch Validierungsfunktionen haben und Upper Limits und Lower Limits und weiß ich nicht.

Jochen

Und ganz viel komplizierte Socks halt auch mit dazu schreiben.

Jochen

Das gehen alle mit den Typ-Annotationen natürlich nicht, aber wenn man einfach nur die Typ-Annotationen hinschreibt, dann passiert das halt auch, dass dann sozusagen man ein JSON nehmen kann und man hat halt eine Objektstruktur definiert mit den Typen und dann sagt man halt hier, hier ist das JSON, parst das mal und validier das mal.

Ja, und

Dominik

wenn es nicht, dann kriegst du 4, 2, 2, weil da fehlt irgendwie ein bisschen.

Jochen

Und wenn es nicht okay ist, kriegt man halt schöne Fehlermeldungen auch zurück, wo dann genau gesagt wird, so an der Stelle hast du gesagt, das soll eine Number sein, aber da ist eigentlich, da ist ein String oder das ist halt irgendwie, das passt sonst wie nicht, das soll eine Liste sein, aber es ist halt nicht.

Jochen

Ja, und das natürlich nicht.

Johannes

Okay, also es ist, also es ist quasi das, woraus Fast API gebaut hat.

Johannes

Fast API ist verdäntig via HTTP.

Jochen

Ja, plus es sind noch so ein paar Sachen zusätzlich dabei.

Jochen

Starlet ist halt irgendwie sozusagen das alles, was HTTP angeht oder so macht darunter, ne, die Bibliothek von Tom Chrissie.

Jochen

Also Fast API ist schon so ein bisschen, ist halt so irgendwie drei sehr coole oder drei, vier sehr coole Open Source Bibliotheken in einem French Code irgendwie quasi.

Dominik

Noch so Routing-Kann, das haben wir halt irgendwie von Flasper kannte, ne, als Dekorator oder Flaskbar auch.

Jochen

Ja, genau.

Jochen

Das ist natürlich auch der Auto.

Johannes

Also Stefan, wenn du Fast AP schon kennst, dann weißt du auch, wie Pedantic funktioniert.

Nur halt innerhalb der.

Johannes

Okay.

Stefan

Also wie gesagt, ihr habt den Namen in den Architektur-Diagramm geschrieben.

Stefan

Also das ist mehr Erfahrung damit auf.

Stefan

Reicht anscheinend.

Es ist schon mehr damit gemacht, dass es nicht mehr so ist.

Genau.

Jochen

Ja.

Jochen

Aber genau, also ja, das ist auf jeden Fall auch so noch ein ganz interessanter Ding, dass man, weil ich meine, das ist ja tatsächlich so, wie viele Leute das benutzen.

Jochen

Viele Leute benutzen dann Type-Dikt und denken, das würde passieren, dass es validiert wird, aber es passiert halt nicht.

Jochen

Ja.

Jochen

Ja, ansonsten, ich weiß es nicht.

Jochen

Haben wir noch irgendwas Großes vergessen oder so?

Jochen

Aber ich glaube, ansonsten, ich habe hier fast nichts mehr, was ich noch irgendwie unbedingt gerne wissen wollte.

Johannes

Ja, nach anderthalb Tagen, nach anderthalb Stunden alles über

Jochen

Tage sein können, kein Problem.

Johannes

Typsysteme und Typen gesagt.

Johannes

Das ging ja relativ schnell jetzt.

Dominik

Für meinen Typ hat er immer noch keine Erklärung von mehr, sonst.

Johannes

So Typen wie dich, Dominik, schwer zu beschreiben.

Das ist so.

Ja.

Dominik

Wirklich, ich finde es schön.

Dominik

Stefan, hast du noch was, was du unbedingt loswerden wolltest?

Stefan

Ich glaube, ich habe jetzt noch ein anschauliches Beispiel gefunden zu Kovarianz und Kontravarianz.

Stefan

Oh, nachdem ich mir die Grafik so lange angeschaut habe.

Stefan

Ich hoffe, ich kann es erklären.

Stefan

Kovarianz ist in Wirklichkeit, was wir als Subtyping verstehen.

Stefan

Angenommen, du hast ein Lebewesen, dann hast du einen Subtyp davon, das ist ein Pflanzenfresser, dann hast du einen Subtyp davon, das ist eine Kuh.

Stefan

Das heißt, du wirst immer konkreter und konkreter und konkreter.

Stefan

Was bedeutet, wenn du irgendwo ein Lebewesen erwartest, kannst du dort einen Pflanzenfresser reinschmeißen, kannst du aber auch Kühe reinschmeißen oder Schafe reinschmeißen oder veganer.

Stefan

Vermehrt.

Stefan

Und das ist Kovarianz.

Stefan

Das heißt, du kannst etwas sehr Breites akzeptieren und kannst was sehr konkretes reinstopfen, wenn der Subtyp.

Dominik

Also das heißt, ich erwarte ein Lebewesen als Type Annotation quasi.

Stefan

Genau, genau, genau.

Stefan

Jetzt hast du aber zum Beispiel eine andere Kovarianz, nämlich du hast jetzt Pflanze und davon abgeleitet Gras und davon abgeleitet vielleicht teuer oder so.

Stefan

Und jetzt willst du eine Funktion zur Verfügung stellen, die akzeptiert Grasesser, dann kannst du dort bei den Grasessern Kühe, aber auch Pflanzenfresser reinschmeißen.

Stefan

Wenn du jetzt aber sagst, du akzeptierst jetzt Pflanzen, also alle die Pflanzen oder Funktion von Entitäten, die alle Pflanzen essen können.

Stefan

Alle Pflanzen.

Stefan

Dann kannst du dort keine Kühe reingeben, weil Kühe können nur Gras essen.

Stefan

Und das ist Kontravarianz.

Stefan

Das heißt, du hast zwar auch einen Subtypen, du hast ja breiten Typen.

Stefan

Ich akzeptiere ja Pflanzenfresser, allerdings kannst du keine Kühe reingeben, weil Kühe nur Gras essen dürfen.

Dominik

Okay, und Invarianz ist dann ganz festgesetzt, dass halt nur den einen speziellen Typ.

Stefan

Genau, Invarianz ist, geht in beide Richtungen.

Ja.

Stefan

Genau.

Stefan

Also ich hoffe, dass das nochmal veranschaulicht.

Dominik

Ich glaube, wir gucken uns lieber dein Bild nochmal an.

Dominik

Ich hoffe, das Bild ist so anschaulich für die Leute, die da ausgestiegen sind.

Ja, super.

Johannes

Und das in den nächsten vier Folgen alles nochmal erklären.

Jochen

Das ist ja auch okay, wenn da eine, wenn da eine Erklärung dabei ist, die.

Dominik

Hallo bei python-podcast.de.

Dominik

Wir haben aber noch gar nicht ganz fertig, weil wir möchten gerne noch unseren Pick der Woche, glaube ich, auswählen.

Ich fange mal an.

Johannes

Stefan, weißt du denn, was ein Pick ist?

Stefan

Ja.

Stefan

Also müssen wir jetzt irgendeinen Link raussuchen, den ihr total grandios findet.

Dominik

Ja, genau.

Johannes

Irgendwas Schönes zeigt.

Dominik

Ja, meistens nehmen wir Python-Module, aber das ich nehme tatsächlich, ja, auch nicht immer.

Dominik

Ich nehme tatsächlich diesmal eins von Simon Willison und zwar das LLM.

Dominik

Ich glaube, das haben wir ja bei einer der Machine Learning-Folgen.

Jochen

Ach, das Kommandozeilent.

Jochen

Zwar schon

Dominik

in den Shownotes irgendwo gehabt, aber es ist tatsächlich, bei mir ist vermehrt in Benutzung, ich im Monkey Patch schon immer das Default, aber sonst ist es sehr, sehr schön, weil du halt ganz viele Templates und Chains von Templates direkt benutzen kannst in deiner Kommandozeile, um halt mit den verschiedenen Modellen zu sprechen, direkt, die du da haben willst.

Dominik

Und es ist toll, wenn man harte Intuition gibt, dann so die Standardpersönlichkeit des antwortenden LLMs irgendwie so ein bisschen gerade zu rücken auf das, was man selber gerne als Antwort hätte.

Dominik

Such die Leute gut aus, mit denen du sprichst, das wollte ich damit sagen.

Johannes

Und dann lädst du uns ein, Dominik.

Dominik

Weiterhin viel Spaß bei den nächsten Picks, wollte ich noch sagen, ja.

Ja.

Dominik

Ja, was hast du denn gibt mich doch?

Jochen

Was wollte ich, ah, genau.

Jochen

Ich dachte mir, so, naja, vielleicht auch ein Buch mal.

Jochen

Und zwar eins, das ich nicht gelesen habe.

Jochen

Aber wo man das alles nachlesen kann, da kann man auch die Antworten, wenn man dann drauf gekommen ist, wie das sein muss, an uns schicken.

Jochen

Und zwar The Little Little Typer ist ein Buch, das ich habe es versucht zu lesen, es ist irgendwie, ich habe dann zwischendurch aufgegeben.

Dominik

Das wird sich sagen, wie Experiment mit Types und Beisen.

Jochen

Ja.

Jochen

Aber da steht das, glaube ich, alles ganz genau drin, wenn man das wissen will.

Jochen

Und vielleicht nochmal was Praktisches, weil ja, das ist ja doch nicht irgendwie was für alle wahrscheinlich.

Jochen

Doku ist ganz nett, auch nicht Python, sondern Go-Geschichte.

Jochen

Heroku hatte ja in letzter Zeit so ein bisschen Probleme.

Jochen

Und es ist nicht mehr so richtig irgendwie der Platz, wo man vielleicht so mal so, wenn man, also früher hat man das ja, wenn man irgendwas mal eben deployen wollte, hat man das oft dann bei Heroku oder so getan, weil das halt sehr einfach war, aber das geht irgendwie nicht mehr.

Jochen

Und das kann man auch in Selbstbox.

Jochen

Also meine Lösung dafür ist ja, dass ich das halt einfach, ich habe da so meine Standard Ensible Dinger.

Jochen

Also du

Johannes

bist vom Dir ist Heroku zu kompliziert geworden und deshalb hast du jetzt deine eigene Hosting-Lösung gebaut.

Ja, leider, ja.

Johannes

Das ist natürlich keine Option, die jetzt viele.

Jochen

Genau, also das kann ich auch nicht unbedingt empfehlen.

Jochen

Das ist das unerwartet kompliziert.

Jochen

Aber bei mir geht es jetzt daher, habe ich das Problem nicht mehr.

Jochen

Und ich mache ja auch keinen Docker oder so, sondern ich deploy dann direkt irgendwie.

Knallerhart, Bare Metal.

Jochen

Ja, genau.

Jochen

Und bei Doku hat man dann halt irgendwie sowas, wo man dann so ähnlich wie mit Heroku.

Jochen

Einfach, man hat halt so ein Pog-File und dann kann man das einfach direkt und da auch, also wenn man Docker-Container bauen kann, kann man direkt Docker-Container dahin deployen und die laufen dann unter Subdomainen direkt mit HTTS und so.

Dominik

Warte das sogar mit Heroku, also Doku?

Jochen

Nee, nee, das ist also, aber du musst halt das Doku auf einem von irgendwo auf einem, weiß ich nicht, auf einer virtuellen Maschine irgendein Dings halt deployed haben.

Self-hosted.

Jochen

Genau, Self-Hosted Heroku quasi.

Jochen

Und genau, das ist, glaube ich, manchmal ganz hilfreich, sowas zu haben.

Jochen

Oh.

Johannes

Okay, dann schließe ich mich da direkt mal an, weil dann in dem Fall habe ich drei Picks.

Jochen

Ah, okay.

Johannes

Der erste ist Vercel.

Johannes

Das ist wie Heroku nur cooler.

Johannes

Der zweite wäre Fly.io.

Johannes

Das ist quasi Docker-Sachen auf Hosted Infrastruktur überall hin machen und die machen krasses technische Zeugs damit.

Johannes

Also du schickst den in den Docker-Container, aber die zerlegen den und bauen sich da eigene Sachen draus.

Johannes

Das ist auch technologisch sehr interessant.

Johannes

Das war jetzt aber der opportunistische Pick, nur um da dir die Alternativen zu Heroku und self-hosted einmal gesagt.

Johannes

Genau, mein eigentlicher Pick ist was ganz anderes.

Johannes

Und zwar, das ZDF hat ja eine Mediathek und auf dieser Mediathek kann man Sachen ansehen und wenn man ein paar Sachen angesehen hat, dann versucht das ZDF da Recommendations draus zu machen.

Wow, das ist ein bisschen.

Dominik

Ewigkeiten, dass ich von Fernsehen etwas höre.

Du meinst das ZDF meinst du das tatsächliche Fernsehen, was

Johannes

das zweite deutsche Fernsehen meine ich.

Johannes

Und also nur die Mediathek.

Johannes

Und weil das ZDF ja in öffentlich-rechtlicher Hand ist, haben die sich gesagt, eigentlich müssen wir das ja den Leuten zurückgeben.

Johannes

Und das haben sie tatsächlich gemacht.

Johannes

Die haben ihr Recommendation-System auf GitHub gepackt.

Ach, okay, so ansehen.

Johannes

Und GitHub ZDF-Open Source gibt es auch jetzt schon ein Repository drunter, das heißt Recommendations PA Base.

Johannes

Und da sind, da ist das Recommendations-System vom ZDF drin.

Johannes

Und fand ich einfach spannend, das mal anzusehen.

Johannes

Weil er ja doch auch einiges an Arbeit drinsteckt.

Johannes

Und weil es da auch viele Firmen gibt, die sowas gerne hätten.

Johannes

Genau, das war's von mir.

Johannes

Stefan, hast du noch was für uns dabei?

Stefan

Ich habe nur was rausgefunden, das ist schon ein älterer Artikel von Bob Nystrom aus dem Jahre 2015.

Stefan

Heißt What Color is your function?

Stefan

Und Bob Nystrom ist einer der Sprachdesigner, der jetzt aktuell an Dart arbeitet.

Stefan

Und das ist sehr spannend, weil er versucht zu erklären anhand von Farben, wie sich normale Funktionen und asynchrone Funktionen im Sprachdesign unterscheiden.

Stefan

Also rein aus der Perspektive von welche Herausforderungen kriegst du als Sprachdesigner, wenn du so ein Asynchrate-Konstrukt gestalten hast.

Stefan

Und wie gesagt, der ist schon ewig gehört, aber er ist vor kurzem wieder bei uns in der Firma aufgeproppt, kann ich dir empfehlen, versuch das so zu erklären, dass du die Ergebnisse oder die Erkenntnisse in Python genauso anwenden kannst.

Stefan

Und ich finde die immer wieder sehr interessant.

Stefan

Gehe sehr oft wieder drauf zu.

Stefan

Für die Programmiersprachen Interessierten.

Jochen

Ja, sehr cool.

Jochen

Also quasi diese Analogie oder diese Metapher habe ich auch schon häufig gehört.

Jochen

Ich wusste aber nicht, wo sie herkommt und ja, das muss ich auf jeden Fall mal lesen.

Johannes

Nee, da gibt es tatsächlich noch was älteres.

Johannes

What color are your bits?

Johannes

Das ist von 2004.

Johannes

Da geht es um die Herkunft von Bits.

Johannes

Also ob deine Bits urheberechtlich geschützt sind oder nicht.

Johannes

Was du damit machen kannst um die Farbe, damit sie die Farbe ändern.

Johannes

Aber das ist, ja, also ich musste da auch zuerst dran denken.

Johannes

Also es scheint eine gute Metapher zu sein.

Johannes

Wir können das ja beides verlinken.

Ja, sehr gerne.

Ja, cool.

Dominik

Ich würde sagen, herzlichen Dank, dass ihr heute alle wieder da wart.

Dominik

Herzlichen Dank, Stefan, herzlichen Dank Johannes.

Stefan

Ja, danke für die Einladung.

Stefan

Freut mich sehr auch.

Dominik

Dann, ja, bleibt uns gewogen, schaltet uns wieder ein, hört uns, wo ihr gerade seid, morgens, mittags, nachts, abends, tagsüber zum Schlafen, zum Einschlafen.

Dominik

Einen wunderschönen Tag.

Dominik

Bis bald.

Tschüss.

Jochen

Ciao.

Tschüss.