Transcript: Platonismus und Python - Data Class Builders
Full episode transcript. Timestamps refer to the audio playback.
Hallo liebe Hörer und Hörer, willkommen beim Python Podcast Episode 66.
Heute quatschen wir über das nächste Kapitel im Fluent Python Buch,
falls euch das interessiert, über Data Classes und warum das riecht oder nicht oder was cool ist
und wer das sonst so ist mit Sachen.
Hi Johannes!
Hallo, hallo Dominik, hallo Jochen.
Hi Jochen!
Ja, hallo Dominik, hallo Johannes.
Ich habe gehört, lieber Jochen, du wolltest, du warst auf einem Podcast Barcamp.
Genau, und dann habe ich so gesagt, wie wir Podcasts aufnehmen.
Ja, und dann haben wir gesagt, wir sollten ein bisschen mehr Kultur machen und das wieder ein bisschen schöner.
Ja, das hat mich so leicht irritiert, aber dann dachte ich, ja gut, dann höre ich mal vielleicht, was so Leute zu sagen haben.
Wir haben ja vielleicht auch Erfahrung und so.
Weil wir unseren Podcast an anderen Podcasts machen, als sie ihren Podcast machen.
Und deswegen machen wir das jetzt so, wie die anderen Leute, die nicht so einen Podcast machen, wie wir den Podcast machen.
Wie wir das richtig machen.
Also ich habe mich auch mit Leuten unterhalten und die haben dann so geguckt.
Ich glaube, das geht.
Und gar nicht so schlecht.
Ja, das geht schon, aber ich meine, wir machen das ja nicht so richtig professionell.
Wo kann ich sagen, Jochen, möchtest du das jetzt professionell?
Nein, nein, das auch nicht.
Aber also zum Beispiel irgendwie ein Ratschlag war halt so, ihr sagt doch vorher, wenn ihr euch vorstellt,
einmal macht das immer gleich quasi, wie der Gefängnis wäre.
Es wäre auch so eine Intro-Melodie oder so, wäre nicht so schlecht.
Dann dachte ich schon so, oh Gott, oh Gott, oh Gott.
Aber ja, ich habe gehört, es gibt Leute hier unter uns.
Ich kann ja meinen eigenen Jingle schreiben, dann mache ich den auf meinen Style und dann können wir ja gucken, wie der Rest dann runtergeht.
Dann kann man jetzt die Kurve angucken.
Ich kriege dann auch einen eigenen Jingle.
Ich nehme meinen eigenen Jingle.
Wenn ich dabei bin, muss der am Anfang eingespielt werden.
Das ist eigentlich eine coole Idee.
Ja, okay, dann sieht die, wie viele Leute hören noch zu Kurve wahrscheinlich aus, wie so Akapulko, Klippenspringer, irgendwie ins Nichts.
Das ist vielleicht auch nicht so toll.
Ja, aber ich finde, wie wir es sonst so machen, wir haben ja eigentlich schon mehr eine Struktur, als du jetzt denkst.
Also erstens kennen uns hier die Leute und wenn die sich dafür interessieren, wie wir sind oder interessieren würden,
also ganz ehrlich, dann können die uns auch fragen.
Hallo at PythonPodcast.de
Also wir machen irgendwas mit Python.
Das hat man vielleicht.
Schon mal rausgehört.
Ich glaube, das ist auch offensichtlich.
Und viel mehr muss man, glaube ich, gar nicht wissen.
Also muss man nicht, kann man natürlich gerne.
Dafür kann man ja fragen oder uns kennenlernen.
Unseren Hörer treffen, das bald stattfindet.
Wir organisieren das nämlich.
Genau.
Wir haben noch immer noch gar keinen festen Termin, aber es wird wahrscheinlich auf August, September hinauslaufen.
Ja, aber ich fürchte, das müssen wir jetzt sagen.
Sag ich doch.
August oder September.
Das ist kein fester Termin, oder?
Nein.
Dann müssen wir jetzt noch mal kurz unsere Kalender übereinanderlegen.
Also ich glaube, tatsächlich wird es eher Ende August.
Bis Anfang September werden müssen, wegen Schulferien.
Ja, Anfang September bin ich übrigens im Urlaub.
Ja, das musst du leider absagen.
Das geht halt nicht.
Na gut, dann wird es halt vielleicht eher sogar Ende September.
Okay, dann sagen wir, wir schieben die Ankündigung auf nächste Episode, die hoffentlich im Juli.
Ja, genau.
Also es sollte noch gutes Wetter sein.
Wir wollen es nämlich draußen machen.
Und okay, wir haben September, wirklich.
Was ist mit August?
Geht nicht gut.
Wie gesagt, das ist ein Schulferien.
Okay, geil.
Dann diskutieren wir das später aus.
Ja.
Auf jeden Fall das Schulferien-Treffen.
Sagt gerne Bescheid, wenn ihr vorbeikommen wollt.
Es ist hier in der Gegend.
Also hier heißt Rheinland-Düsseldorf.
Ja.
Wir können ja schon mal sammeln.
Also wenn ihr uns irgendwas an hallo.atpipenpodcast.de schreibt, dann notifizieren wir euch, sobald wir genaueres wissen.
Genau.
Und es wird wahrscheinlich draußen irgendwie...
Draußen gibt es vielleicht was zu essen.
Irgendwie so.
Ja, ja.
Irgendwie Dinge.
Ja.
Okay.
Genau.
Ja.
Das zur anderen Struktur, Jochen.
Ja.
Wir machen immer News.
Ja, wir machen News.
Cool.
Dann machen wir doch gerade ein bisschen News.
Ja.
Aber vorgestellt hat sich jetzt keiner, oder?
Ach, Mist.
So.
Jetzt auch kam ich schon...
Der Jochen wollte so schön hinfahren und jetzt hat sich keiner eingestiegen.
Ich bin ja dumm.
Jochen, wer bist du denn?
Ja.
Die sind doch die wichtigen Leute.
Stellt euch mal vor.
Ja, aber man muss ja immer die anderen vorstellen.
Man kann sich ja nicht gut selber vorstellen.
Also ich stelle mal die Dominik vor.
Dominik ist...
Das hätte schon nicht sein.
Ja.
Das hätte Dominik.
Das ist vorbei.
Das ist vorbei.
Also meine drei Hashtags sind Python, Eurorack und...
Egentik.
Bytecoding, ja.
Bytecoding.
Ja, ja.
Bytecoding, ja, genau.
Okay, Mist.
Jetzt sind alle guten Hashtags schon weg.
Meinst du, wir haben irgendwie Python...
Jetzt mal Python Podcast.
Jacqueline.
Jacqueline.
Ja, Uculele.
Uculele ist auch sehr gut.
Das ist auch schön, ja.
Ja.
Ich habe auch noch ein paar andere Instrumente, aber...
Und Johannes, sollen wir...
Ja, also ich...
Hallo, ich bin Johannes.
Für die, die mich nicht kennen.
Ich bin gelegentlich hier im Python Podcast als Gast, weil ich diese beiden...
Das ist gut.
Das ist gut.
Das ist gut.
Das ist gut.
anderen Typen da kennen.
Und
ich komme nicht aus dem Rheinland.
Ich bin...
Du warst da mal hier. Ich war mal im Rheinland,
ja, aber es hat sich dann
als... Also ich musste
wieder weg.
Und jetzt bin
ich hier. Hier hat es übrigens
800 Sonnenstunden im Jahr mehr als
bei euch im Rheinland. Das ist nur so nebenbei.
Deshalb bin ich auch so ein sonniges Gemüt.
Ich kenne tausend Reklaster,
die bei Johannes. Ja, richtig.
Die kennst du übrigens alle aus dem Chaosumfeld
so ein bisschen mehr oder weniger auch, oder?
Ja, den Jochen habe ich im Computerclub
kennengelernt.
Meine Hashtags
Django,
Mathematik und
Spiele. Spiele, richtig.
Absolut korrekt.
Hört man schon am Namen.
Ja.
So ein Nomen es zu Omen.
Ja.
Okay, dann können wir ja jetzt nahtlos mit den News
einsteigen.
Ich habe nicht die perfekte Struktur.
Sehr gut, sehr gut.
Ich konnte nicht so viel sammeln, weil ich momentan
total im Stress bin.
Ja, dann erzählen wir doch ganz kurz nochmal vielleicht über das Barcamp.
Also das ist jetzt vielleicht nicht so interessant für alle Peißenleute,
aber für alle Leute, die Podcasts mögen schon.
Es gab da nämlich eine tolle Veranstaltung, wo man
Barcamps kennt ja vielleicht aus dem Softwareumfeld,
wo man ganz viele nette Podcastmenschen kennengelernt hat.
Ich möchte nochmal Danke sagen für die tollen Kontakte,
die ich da getroffen und kennengelernt haben durfte.
Ja,
Grüße an hier Working Draft
zum Beispiel.
Ich habe auch gehört,
gute Tipps waren, wir sollten mal wieder mehr
zusammen eine Episode aufnehmen.
Ja, mit Working Draft, das wäre doch mal wieder eine Idee.
Und wir haben auch schon konkret geplant,
was zusammen mit, wo wir sind,
ist vorne zu machen.
Die kennen wir auch gut und
treffen uns immer wieder auf allen möglichen Konferenzen
und so,
aber
ist bisher noch nicht so richtig zustande gekommen,
aber wir sind auf jeden Fall da auch noch dran.
Ja, das war so ein Tipp.
Besucht euch auch
einfach gegenseitig. Auch ein guter Tipp war halt,
ja, schaut nicht nur nach so
totalen Berühmtheiten oder so,
auch wenn das auf dem Papier
oder so erstmal, wenn man darüber nachdenkt, gut aussieht.
Meinst du, Guido? Ich wollte immer schon mal
Guido haben.
Das ist halt mit Englisch vielleicht ein Problem.
Mit Sarah war das jetzt mal eine Ausnahme.
Aber da gibt es ja schon Leute.
Ja, gibt es auch.
In der deutschsprachigen Welt gibt es Paltenmenschen.
Genau, es gibt eigentlich auch genug.
Guido spricht immer schon Dutch.
Aber,
das Problem ist halt bei Leuten,
die zu bekannt sind,
auch, dass man die dann halt oft schon gehört hat.
Und wenn man dann nicht, weiß nicht,
das Lied, die Guido,
mit irgendwie...
Ach, naja.
Es gibt doch jetzt demnächst
ein toller Python,
den Film.
Ja, es gibt im Sommer, soll jetzt rauskommen, ich weiß gar nicht genau wann.
Genau, da gab es einen Trailer, habe ich gesehen.
Next on the plane.
Äh, nee.
Ja, den gab es schon, aber...
Ja.
Das scheint Palten.
Nee, das ist schon...
Irgendwelche Leute machen das immer.
Und über Even You haben sie zum Beispiel
ein Ding gemacht, das war ziemlich gut, das habe ich gesehen.
Und über andere Leute...
Der Typ für VHS und
jetzt Rulldown, habe ich gelesen.
Und genau, das gibt es jetzt auch über Python.
Und soll wohl auch...
Also der Trailer sah auch gut aus.
Und ja, wir werden mal schauen, wie das so wird.
Genau.
Ja, genau, wir sind aufs...
Wir sind auf so ein Podcamp gegangen, so ein Barcamp-Podcast.
Und immer Konferenzen, für mich besonders attraktiv,
wenn ich halt irgendwie zu Fuß hinlaufen kann.
Ich bin irgendwie
bequem an der Stelle.
Und das war halt hier in der Zentralbibliothek
am Bahnhof in Düsseldorf,
was auch so ein total cooles Ding ist irgendwie.
Und man kann die ganzen Räumlichkeiten
auch für alles mögliche verwenden, man muss es nur irgendwie anmelden.
Und jedes Mal, wenn wir da vorbeiliefen,
gerade auf dem Gang, wie man es bei so Konferenzen macht,
kurzes Gespräch, dann kam er vorbei mit...
Ja, das soll aber eigentlich
nicht so sein, weil...
Ja, das soll aber eigentlich
nicht so sein, weil
eigentlich hat man dieses...
Man muss halt leise sein,
in der Bibliothek-Konzept da nicht mehr.
Es ist auch so, dass man da Essen mit reinnehmen
darf und so.
Ich habe dann so eine Führung damit gemacht
und die sagt, naja, wir wollen das irgendwie anders machen
und nicht mehr so wie früher.
Und man kann da auch was essen und
man kann da auch irgendwie ein bisschen lauter sein.
Das ist alles kein Problem.
Und es gibt nicht nur Bücher, sondern es gibt auch so,
weiß ich nicht, so Laserentfernungsmesser.
Und 3D-Drucker und
VR-Brillen.
Und ein Podcaststudio.
Und ein Ding, wo man
ein paar Achtfilme digitalisieren kann.
Und auch alte Vias digitalisieren kann.
Und ein Videorekorder.
Und ein Musikstudio, wo man
leider aber nicht drin laut sein darf.
Da darf man nur digitale Instrumente drin verwenden.
Weil daneben die
juristische Fachbibliothek ist,
wo die Leute dann lernen für Prüfungen.
Und das hat sich dann herausgestellt,
dass das eine ungünstige Kombination ist.
Das wäre das.
Ich verklage dich gleich.
Ja, gut,
hätte man auch vorher drauf kommen können.
Aber das musste wohl erstmal eskalieren.
Und jetzt darf man da nicht mehr singen.
Eigentlich schade.
Ja, schade.
Gibt es auch Backformen.
Ich habe das einmal gesehen.
Das ist Bücherei für Backformen.
Genau, so Bücherei der Dinge nennen die das.
Da gibt es auch so Fußball-Backformen und so Zeugs.
Also wirklich Geburtstagskids
für alle möglichen Geburtstagspartys und so.
Also wirklich, wirklich.
Und man kann da halt hinsetzen und arbeiten.
Es sind 600 Arbeitsplätze in dem Ding.
Das ist halt auch irgendwie echt groß.
Es sind zwei Fußballfelder groß.
Und es gibt jede Menge Räume für alles mögliche.
Und wie gesagt, man muss halt nur sagen,
ich hätte gerne einen Raum für den und den Zweck.
Und dann überlegen die und dann sagen sie einem,
nee, du stinkst oder ja, kannst du haben.
In der alten Zentralbibliothek,
da war ich vielleicht zwölf oder sowas.
Da stand so ein Computer drin rum.
Und der war halt ganz gemein gesichert.
Also dachten sie.
Und da konnte man so ein paar Sachen machen.
Heimlich.
Und dann Sachen ausprobieren.
Tja.
Da gibt es auch eine Menge.
Ich bin nämlich nach der Schule früher immer in die Bibliothek gefahren.
Ja, das habe ich auch.
Ich habe nicht nur nach der Schule.
Aber ob ich da jetzt meine Kinder hinlassen würde,
ich weiß es nicht so genau.
Ja.
Ja, egal.
Aber wie gesagt, ich wusste gar nicht, dass es so einen Ort gibt.
Und dass man so coole Sachen machen kann.
Da gibt es auch Bücher über Peißen, Jochen.
Ja, da gibt es Bücher über Peißen.
Ja, da gibt es Bücher auch.
Ja, da werde ich mir nicht...
Aber es gibt eine Fernleihe, über die man halt eine Menge kriegt.
Weil Christ,
darüber wollten wir gleich reden.
Und die liefert dann halt auch an die nächstgelegene Bibliothek.
Also man kann das auch online machen.
Und dann kann man die Sachen dann lokal abholen.
Und bei uns ist die nächstgelegene Bibliothek
irgendwie ein paar hundert Meter entfernt.
Also wir gehen auch mal zu unserer Stadtteilbibliothek.
Ja, und man kann die Bücher auch überall zurückgeben.
Also es ist wirklich...
Also ich war überrascht.
Über Tonis ausleihen.
Das auch, ja.
Ja, genau.
Also da hat das Ganze irgendwie stattgefunden.
Also wir haben ein paar tolle Tipps bekommen.
Für Marketing und was man nicht alles machen soll.
Das heißt, wir machen jetzt ganz viel Marketing.
Viel Spaß damit.
Für uns bestimmt gut.
Für euch, ja, ihr müsst halt damit leben.
Ja, nee.
Wir haben tatsächlich überlegt, ob wir ein Video mal aufnehmen wollen.
Genau, ob wir ein bisschen mehr Video machen.
Also ich hatte es schon länger überlegt, aber...
Ja, das war so auch einer der Geschichten, wo Leute sagen,
ja, das muss man im Grunde irgendwie, wenn man...
Social Media, Presence, Interaction.
Man muss das schon irgendwie machen.
Ja, man gewinnt halt.
Im Hörerkreis auf YouTube, oder?
Also das sind halt die Leute, die YouTube gucken, die...
Ja.
Und gar nicht mal unbedingt die Podcast-Episoden selber,
aber dass man zumindest da ist und da gefunden wird.
Für die Leute, die halt nur auf YouTube sind.
Und dann halt da einen Trailer hat, dass sie halt wissen,
oh, es gibt den Podcast.
Ich muss da vielleicht irgendwie auf meinem Podcatcher der Wahl...
Das geht halt total steil, Johannes.
Und da stehen die Fans hinterher auch vor deiner Tür
und klopfen heimlich...
Die Groupies.
Ja, also...
So stelle ich es mir vor.
Was ich auch total cool fand, war, wie Leute darüber gesprochen haben,
wie sie halt ihre Workflows halt so ein bisschen automatisieren
mit so diversen Tools und was man da alles machen kann
an Automatisierung von irgendwie...
Ja, was man...
Oder...
Oh, jetzt sind wir bei einer anderen geplanten Folge übrigens,
aber nicht bei Podcast, sondern...
Wir wollten auch bald nochmal wieder bei so Data Science-Kram reden
und dann auch nochmal über die ganzen neuen KI-Sachen.
Darf ich das nicht sagen?
Ich weiß nicht.
MTPs und so.
Ja, ich glaube, man darf das schon sagen.
KI, musst du sagen.
KI.
Oh.
Ach so, Entschuldigung.
Du hast eben so einen tollen Link geschickt, der dazu passt.
Ja, ich habe auch tatsächlich noch News,
weil es gibt eine interessante Veröffentlichung vom MIT Media Lab
mit dem Titel Your Brain on Chat's GPT,
die gerade so ein bisschen durch die News gegangen ist,
wo sie untersuchen, was das denn für Auswirkungen hat.
Also ich meine, es ist natürlich sehr reißerisch
und die Studie hat 54 Teilnehmer.
Das ist kein repräsentativer Querschnitt durch die Gesellschaft.
Aber es gab wohl signifikante Unterschiede zwischen Menschen,
die LLMs benutzen oder nur eine Search Engine
oder Brain-Only in Klammern No Tools.
Das finde ich eine sehr schöne Bezeichnung.
Und was war besser? Für was?
Man kann sich Sachen besser merken,
wenn man sie nicht von einem LLM erzeugen lässt.
Oder wenn man sie...
Wenn man sie sich nicht von einem LLM vorkauen lässt.
Ja gut, das ist keine Überraschung,
dass wenn man das Wissen jetzt nicht selber erarbeitet hat,
dass das dann flüchtig bleibt.
Ja, aber auch Suchmaschine.
Also auch wenn du normal bei Google oder bei irgendwas anderem eintippst
und nicht diese KI...
Kagi, ich benutze Kagi.
Wenn man nicht diese KI-Zusammenfassung benutzt,
ist die Retention wohl deutlich besser.
Und das Interessante ist eigentlich,
dass diese Studie so durch die Neuheit...
Bitte, ich habe es gerade nicht verstanden.
Das Interessante finde ich eigentlich,
dass diese Studie so durch die News geht
und dass die so überall zitiert wird,
weil es halt schon so ein bisschen dieses Gefühl reflektiert von
ja, vielleicht ist das doch nicht so gut für uns.
Ja, aber ist das nicht immer eine Neuigkeit?
Ich meine...
Ja, ja, natürlich.
Die meisten...
Also viele Leute sind halt so doch eher so im Modus...
News, technology is bad for you.
Genau.
Meckernder Rentner im Fenster mit einem Kissen
und Kulturfessimismus kommt halt immer wieder.
Das hört sich aber gut an.
Das ist halt immer eine Schlagzeile.
Ja, aber Jochen, wir sind ja so langsam in so einem Alter.
Ach so.
Genau, und hast du gesehen,
zwei Straßen weit haben sie die Straße gelb gestrichen.
Das habe ich nicht gesehen.
War es in diesem Auftrag.
Unglaublich.
Also was die jungen Leute heute machen,
das hätte es bei uns früher nicht gegeben.
Das waren nicht die jungen Leute.
Das haben sie richtig mit Teams gemacht,
die dann angerückt sind und alles verschönern wollten.
Da haben sie alles mit einer stinkenden Farbe angestrichen
und dann hinterher wollten sie einen Garten da drauf machen.
Ja.
Also der Dominik ist auch in dem Alter, wie ihr hört.
Genau.
Ja.
Also ich verstehe, wie diese medialen Mechanismen funktionieren,
die halt dazu führen,
dass das halt immer Schlagzeilen und Neuigkeiten sind.
Aber ich habe große Zweifel,
dass das quasi ein repräsentatives Bild davon zeichnet,
was irgendwie so passiert.
Insofern.
Ist es sicherlich nicht.
Aber die Anzeichen davon,
dass Leute auf diese Dinge vertrauen
und dann auf solche Fakten reinfallen
oder auf solche ausgedachten Sachen,
dass Ungarn auch Holland genannt wird,
das ist ja auch ein bisschen schwierig.
Ja.
Ja.
Dieses Vertrauen ist halt schon sehr groß.
Ja.
Ich habe gerade, wenn die Leute früher dran waren.
Ich habe Chat-Ti gefragt,
mir dann meine Schule ausgesucht.
Und ja.
Du wirst bitte als Suchersatz benutzt.
Also ganz klassisch so.
Da bin ich zu alt dafür.
Das finde ich ganz komisch.
Ja.
Also Leute denken,
das ist aber auch komisch,
dass es nicht direkt die Wahrheit gesagt hat
oder dass man da ja so ein paar Informationen hatte,
die man so mal kurz überprüft.
Ja, sehr gut.
Das ist ja auch ein bisschen so.
Ja.
Ja.
Ja.
Ja.
Ja.
Ja.
Ja.
Ja.
Ja.
Das mit der Medienkompetenz ist halt ein Problem.
Aber das war auch schon immer ein Problem.
Ich meine,
ich erinnere mich noch,
als das Internet und Google neu waren.
Hast du nicht dem Marktreiher geglaubt,
was der gerufen hat?
Auf das Fernsehen.
Genau.
Als das Fernsehen neu war.
Als das Radio neu war.
Irgendwie.
War of the Worlds.
War auch ein großes Medienkompetenz.
Damals,
als man den Propheten noch wirklich glauben konnte.
Ja.
Ja.
Also es ist ein wiederkehrendes Muster.
Ja.
Oder eben bei Plato gibt es das schon.
Der Wetter dagegen.
Und der Verfall der Jugend.
Sowieso.
Ja.
Ja.
Ja.
Also, ich würde mal einfach sagen,
Plato hat nicht recht gehabt.
Und das mit der Schrift war schon Fortschritt.
Und alle anderen danach.
Das wird Ihnen jetzt aber ganz schön atzen.
Ja, aber ich glaube, du bist ein Fanboy, Jochen.
Ja, auf der anderen Seite natürlich schon.
Ich bin auch irgendwo ein Plato-Fanboy.
Das ist richtig, ja.
Ja, das können wir in der MCP-Folge nochmal genauer auslassen.
Ja, wobei, du hattest ja den Hashtag Mathematik.
Da habe ich ja einen Haken, um da mich rein...
Ich habe jetzt eine Podcast-Episode gehört mit Terence Howe.
Ja, der jetzt auch anfängt.
Oder der jetzt auch viele Dinge macht.
Ja, der macht vor allen Dingen viel mit Lean.
Also sozusagen eine Programmiersprache,
mit der kann man...
Also schreibt man halt nicht Code, sondern quasi Mathe.
Ja, man schreibt schon Code,
aber hinterher sagt er einem dann das.
Genau, kann der Compiler.
Der Compiler hat ja nicht den Binary,
sondern der gibt einem ein Zertifikat,
dass das, was man halt hingeschrieben hat,
folgerichtig war.
Und wenn das ein Beweis war, dann ist es halt dann bewiesen.
Genau.
Und das...
Ja.
Ja, macht es halt auch zugänglicher.
Das macht es halt auch möglich, dass mehrere Leute miteinander
irgendwie kollaborieren, weil das Problem an
der bisherigen Mathe-Notation,
auch die ist natürlich ein Riesenfortschritt gegenüber früher,
aber die ist halt so, wenn man jetzt so ein
aktuelles Mathe-Paper nimmt
und schlägt Seite 15 auf,
dann kann einem niemand sagen,
was da steht, ohne die 15 Seiten
vorher gelesen zu haben.
Und das ist super anstrengend.
Und deswegen macht das keiner und dann kann man nicht so gut zusammenarbeiten.
Sondern muss jeder für sich das irgendwie...
Und das limitiert natürlich die...
die Menge an Dingen,
die man irgendwie tun kann.
Und jetzt können halt auch irgendwie Nicht-Profis
quasi da Pull-Requests
gegen lange Beweise stellen
und man kann halt automatisch ticken,
ob das halt so häufig stimmt, was die geschrieben haben oder nicht.
Und dann... Genau.
Das machen sie auch schon.
Die haben da ein total cooles Projekt, wo es darum geht,
quasi nicht neue Sachen zu beweisen
oder so, sondern
die gesamte mathematische Theorie,
die es so gibt und alle Lammers,
die man halt so hat,
die alle mal formal mit Linen durchzubeweisen.
Und das dann halt in der Datenbank zu haben.
Sodass man halt später sagen kann, okay...
Im Endeffekt halt Mathematik, oder?
Also halt das, was es gibt, so an Mathematik
einmal komplett durchformalisiert zu haben.
Und dass man es halt auch noch suchen kann.
Dass man immer sagen kann, okay,
ich habe jetzt dieses Problem, welche Lammers könnten mir da helfen?
Oder welche Tricks siehst du denn in den Dingen,
die alle bewiesen sind, die man jetzt verwenden könnte?
Und dann kann einem auch ein LRM da vielleicht helfen.
Ja.
Also fand ich auf jeden Fall...
Ja, gewusst wie.
Man muss ja eigentlich on top von den Dingen stehen.
Und nicht nach neuer Information suchen,
sondern auch was, was man selber quasi auch schon rausputzen könnte.
Und das geht dann halt schneller.
Ja.
So ein bisschen anders, glaube ich.
Als wenn man sich davon erstmal die Welt erklären lässt.
Also, äh, das ist Dippel.
Ja, aber auf jeden Fall, Mathematik ändert sich auch noch immer.
Und mehr Leute können an Dingen...
Die hatten dann jetzt auch so ein Paper dazu.
Und da waren halt dann 50 Autoren drauf oder so.
Wo ist so ein Paper?
Das gab es ja...
Es gibt ja sonst so eine Physik mit tausend Autoren.
Und in der Mathematik eigentlich nicht.
Ja, ist spannend.
Also...
Kennt ihr das Chicken Paper?
Hätten wir gerade so einen, wo man gerade Paper macht.
Nee, was ist das?
Chicken, Chicken, Chicken, Chicken.
Zack, Zonker.
Also es gab jemand, der hat es tatsächlich geschafft, ein Paper zu veröffentlichen,
weil das alles Standards erfüllt.
Formalen Standards.
Ach so, okay.
Ja.
Habe ich am Montag gehört.
Danke, Sascha.
Ah.
Ja, jedenfalls, genau.
In dem Podcast habe ich auch...
Also ich bin ja auch so ein...
Das ist ein offiziell peer-reviewedes Paper.
Ah.
Ja.
Da kommen ziemlich viele Hühner drin vor.
Ja, genau.
Eigentlich nur Hühner.
Ja, alles Chicken.
Ja, ja.
Das ist auf jeden Fall eine sehr spitze Zielgruppe dann.
Ja.
Genau.
Also was der...
Also ich würde ja sagen, also bisher war ich immer in dem...
Also es gibt ja im Grunde zwei Lager, was die Theorie der Mathematik angeht.
Es gibt halt so die Platoniker irgendwie.
Also das war eine der wenigen Gebiete, wo halt...
Ja, ja.
Platonismus irgendwie noch eine Rolle spielt.
Und die Intuitionisten oder so.
Und ich würde sagen, naja, gut, ich bin schon irgendwie da eher auf der Platon-Seite,
weil, naja, wie soll das anders gehen?
Man kann ja auch quasi zum Beispiel experimentelle Mathematik machen,
wo man einfach irgendwie zufällig Beweise generiert
und dann überprüft mit einem Ding, das halt nicht alles checken kann,
aber checkt, ob da irgendwas interessant...
Ob das wahr ist erst mal, ob das richtig ist
und dann, ob irgendwas Interessantes rausgekommen ist
und dann manchmal fällt da irgendwas raus.
Irgendwas Interessantes war raus.
Und dann, wie kann man das über so einen Prozess erfunden haben?
Sondern das muss man halt eher entdeckt haben.
Und auch so andere Dinge wie, weiß ich nicht,
dass es Kreise gibt oder Dreiecke oder so.
Da hat man so intuitiv das Gefühl,
naja, die gibt es schon irgendwie da draußen
und die kann man eher entdecken,
dass das halt 180 Grad sind in der Winkelsumme
und das kann man nicht erfinden.
Oder das ist halt einfach so.
Und deswegen dachte ich immer so, ja, also...
Quasi so Platon...
Mathematischer Platonismus ist eigentlich schon so die richtige Geschichte.
Und dann, genau, Intuitionisten seit Anfang des 20. Jahrhunderts
sagen so, nee, nee, das kann man vielleicht alles nicht so machen
und das ist doch eher vielleicht eine Erfindung.
Das habe ich eher so für Quatsch gehalten.
Und der hatte jetzt aber ein super Argument
für den mathematischen Intuitionismus.
Und zwar...
Wie war denn das noch?
Ja, jetzt musst du das auch richtig zusammenkriegen.
Jetzt muss ich das auch richtig zusammenkriegen, verdammt.
Das macht die Mathematik immer besonders einfach.
Genau, ach so.
Ja, richtig.
Das ging ungefähr so.
Da sagt er halt, naja,
also es gibt ja so Zahlen wie Pi.
Wir hatten es, glaube ich, auch in meinem Podcast schon mal irgendwann davor,
als wir über Pi geredet haben.
Naja, das ist halt völlig unklar.
Zum Beispiel, also es ist Pi,
die Dezimalbruchentwicklung von Pi besteht jeden Test für Zufälligkeit.
Und ja, aber niemand weiß, ob es wirklich zufällig ist oder nicht.
Oder ob nicht doch irgendeine Conspiracy da drin,
Verschwörung ist, die da halt doch nicht zufällig sein lässt oder so.
Das weiß halt keiner.
Und man hat auch keine Idee, wann man das rauskriegen kann.
Aber er sagt, naja, eigentlich ist es ja ganz einfach.
Ja.
Natürlich, wahrscheinlich, was man erwarten würde, ist, dass es zufällig ist,
weil man kann relativ einfach beweisen,
dass quasi die allermeisten reellen Zahlen zufällig sein müssen.
Sonst wäre einfach nicht genug Platz.
Wenn da irgendwelche Muster wären,
dann könnte man das irgendwie diagonalisieren oder so.
Das darf nicht gehen.
Die allermeisten müssen zufällig sein.
Das ist was ganz Schlimmes.
Das ist ein ganz schlimmes Argument, Jochen.
Weil jetzt kommst du auf einen ganz schlimmen Punkt in der Maschine.
Die allermeisten reellen Zahlen können wir nicht erfassen.
Die können wir nicht sehen.
Die können wir, die sind, das sind so völlig doofe.
Null Aufdehnung.
Ja.
Das sind so völlig doofe Zahlen wie Pi.
Und das sind die allermeisten und wir kennen vielleicht drei davon.
Ja, ja.
Aber es sind die allermeisten.
Ja.
Und das finde ich sehr unangenehm.
Genau.
Diese Vorstellung.
Da gibt es halt dann dieses Bild von den, das hat ja bestimmt auch schon jeder mal gehört,
von den, dieser Infinite Monkeys.
Ja, so natürlich viele Affen.
Wenn die nur lange genug irgendwie auf ihre,
auf ihre Schreibmaschinen eindreschen,
dann kommt dabei auch mal Shakespeare raus oder so.
Jede von diesen Zahlen muss alle Laken von Shakespeare
in einer richtigen Reihenfolge und so enthalten.
Allein urheberrechtlich geschützt.
Wenn die echt, echt zufällig sind.
Das kann nicht anders sein.
Das muss so sein.
Und jetzt ist halt natürlich die Frage so, okay,
also wenn jede einzelne von diesen blöden Zahlen
im Grunde das ganze Universum irgendwie enthält,
weil, naja, also egal wie man das Universum beschreibt,
diese Beschreibung muss da auch drin vorkommen irgendwo.
Wie kann das denn sein,
dass das schon,
vorher existiert da draußen
und wir es nur entdecken?
Oder ist es dann nicht so,
dass man, ja,
wenn man das jetzt erzeugen wollte,
zum Beispiel über Pi,
Ja gut, aber das,
das geht ja weg, Jochen.
Da musst du nur sagen,
das Universum ist quantifiziert
und schon existieren diese Zahlen nicht mehr.
Ja, aber, aber, aber das,
gut, okay,
Universum,
sehr weit gefasst jetzt nicht als physikalisches Universum,
Universum,
mathematisches Universum eingeschlossen,
wo alle mathematischen Objekte auch drin sind,
inklusive Pi und so.
Und wenn man sagt,
dann könnte ja,
als Katholiker würde ich sagen,
das existiert.
Zirkulär?
Aber jetzt,
aber jetzt zirkulär.
Zirkulär, ja.
Ja, du sagst, es existiert,
weil wir annehmen,
dass das Universum,
in dem die,
dass das Universum,
in dem wir drin sind,
das Universum ist,
in dem die existieren.
Nee, nee,
ich würde,
ich würde sagen,
also es gibt,
ich meine jetzt nicht das physikalische Universum,
sondern ganz weit gefasst,
also auch das,
die Welt,
in der halt auch mathematische Objekte existieren,
da ist halt,
also als Platoniker würde ich davon ausgehen,
eben sowas wie Pi,
das existiert da draußen halt,
nicht in unserem Universum natürlich,
im physikalischen Sinne,
sondern quasi,
als Idee.
Als Konzept,
als Idee,
ja,
in einem anderen Universum,
wenn es ein anderes gibt,
müssen sie auch auf diese Idee kommen,
weil diese Idee existiert halt unabhängig davon,
und ich kann auch nicht getäuscht sein,
wenn man das sieht oder so.
Ich finde,
da gibt es eine Grenze,
Jochen.
Ich verstehe,
worauf du raus willst,
dass das sozusagen was Universales ist.
Egal,
welches Universum du dir vorstellst,
die Kreiskonstante ist immer so.
Ja.
Überall gibt es sowas wie Gravitation.
Nee,
das meine ich nicht.
Du brauchst nicht mal die Gravitation,
du brauchst nur Mathematik.
In jedem Universum,
das Mathematik enthält,
gibt es die Kreiskonstante,
und die ist immer gleich.
Ja.
Ist aber Mathematik keine Gravitation?
Weil Geometrie immer gleich ist.
Nee,
brauchst du nicht.
Nee,
das hat nichts mit Physik zu tun.
Ach.
Aber,
aber es gibt eine Grenze,
Jochen.
Ich glaube,
dass es da eine Grenze gibt,
weil es gibt Dinge,
die sind ganz offensichtlich
von Menschen ausgedacht.
Ja.
Klar.
In der Mathematik.
Mhm.
Ach so,
okay.
Die gibt es nur,
weil wir,
da kannst du einfach fliegen gehen.
Und die Frage ist,
wo ist die Grenze?
Wo sind die Sachen von Gott gegeben,
wie man so sagt?
Mhm.
Die sind,
dieses Zitat,
die natürlichen Zahlen sind von Gott gegeben.
Ja, ja.
Menschenwerke, ja.
Aber da gibt es eine Grenze.
Sind die komplexen Zahlen,
sind die schon ausgedacht?
Ja,
nee.
Die haben ja schon eine Entsprechung
in anderen Dingen drin,
und die findest du überall in der Physik,
und so weiter.
Aber dann gehst du weiter,
sind,
keine Ahnung,
ist die Monstergruppe ausgedacht,
oder nicht?
Ja, ja,
oder die,
wobei die Monstergruppe
ein schlechtes Beispiel ist.
Jetzt musst du dir mal erklären,
was denn die Monstergruppe ist,
also wenn du nicht uns drei meinst.
Es gibt,
es gibt so eine Klassifizierung von Gruppen,
und in der,
in vielen Bereichen der Mathematik
ist es so,
dass du,
dass du fünf sehr schöne Beispiele findest.
Da gibt es die ganz,
die,
die natürlichen Zahlen,
und die,
und die ganzen Zahlen,
und dann,
die kannst du so erweitern,
und da gibt es irgendwie
fünf verschiedene Kategorien,
und dann gibt es noch drei zusätzliche,
die einzeln sind,
und die eine hat fünf Elemente,
und die andere hat sieben Elemente,
und dann gibt es noch die Monstergruppe,
die hat 880.973 verschiedene Elemente.
Irgendwie so komische Zahlen.
Und weil die da so rausfällt,
aus dieser schönen Klassifizierung,
hast du einen schönen Setzkasten
mit den ganzen ordentlichen Gruppen drin,
und dann hast du drei so komische dazwischen,
und dann hast du da noch
die riesige Monstergruppe daneben,
hat die den Namen Monstergruppe.
Okay.
Dies ist ein schlechtes Beispiel,
weil die fällt halt aus diesen Klassifizierungen raus.
Aber ganz viele von diesen Dingen sind,
finde ich,
sind schon eindeutig ausgedacht.
Die sind,
die sind so,
weil wir die Definitionen so gewählt haben,
und daraus fallen die Sachen raus.
Aber,
ja,
das ist,
das ist eine schwierige Frage.
Ja,
aber ich würde auch eben,
wenn man sagt,
ich meine,
man kommt ja an,
selbst wenn die existieren,
man kommt ja an die Dinger nicht dran.
Wenn man es jetzt ausrechnet,
dann fallen da zwar diese langen Zahlen raus,
aber da braucht man Energie,
und Energie hat man aber nicht unendlich viel.
Das heißt,
also Shakespeare's Serket rauszukriegen,
wird schwierig.
Da braucht man irgendwie nahezu unendlich viel Energie.
Das heißt,
man könnte ja sagen,
okay,
vielleicht existieren die,
in unserem physikalischen Universum.
Ja,
genau.
Ja,
ja,
aber,
also ich finde das halt schon,
irgendwie,
damit könnte man schon sagen,
wenn ich da wahnsinnig viel Energie investieren muss,
um da was,
kann ich zwar beliebige Sachen daraus kriegen,
aber,
dann wird es halt dann doch wieder eher so,
also wenn ich das sozusagen in unsere Existenz holen will,
dann muss ich halt irgendwie,
dann bin ich plötzlich,
unterliege ich wieder all diesen Beschränkungen,
und dann ist es doch wieder mehr erfunden,
weil,
ja,
Zeit vielleicht,
ich komme halt nicht,
kann sein,
dass es es gibt,
aber ich komme halt nicht dran.
Aber wenn das mit Zeit ist,
kann es ja vielleicht gehen,
weil in der Zeit könnte es ja noch eine andere Dimension versteckt haben,
die dann nicht nur linear,
aber das bringt nichts.
Doch,
da kann es ja nicht,
unendlich.
Stimmt's?
Ja,
und dann,
ich würde ja sagen,
das ist ja im Grunde das Gleiche,
ob das jetzt Zeit oder Energie,
das kannst du ja gegeneinander aufrechnen.
Vielleicht eine Abkürzung,
so eine Mieterabkürzung.
Ja,
keine Ahnung.
Ich glaube,
da müssen wir mal eine separate Frage machen.
Müssen wir vielleicht auch irgendjemand fragen,
der da mal,
keine Ahnung,
das waren so meine Gedanken beim Hören von Klass.
Ja,
vielleicht finden wir ja einen Mathematiker,
der was weiß.
Ja,
das ist auch,
vielleicht eher in der Mathematik,
weil es eine Natur beschiebt.
Ja,
nee,
aber solche Diskussionen sind in der Mathematik schon,
die kommen immer wieder,
gerade in den früheren Semestern.
Sobald man mal ins,
sobald man das Grundstudium abgeschlossen hat,
dann,
ja,
hat man es akzeptiert.
Das ist die Mathematik,
die gibt es halt.
Ja.
Und da gibt es auch nicht alles.
Ich hatte mal eine sehr lange Diskussion mit einem,
der,
ein Student von mir,
den ich tutoriert habe,
der offensichtlich auch schon,
einen Hang zur Esoterik hatte,
und der dann gesagt hat,
ja,
aber,
aber,
du musst,
du musst alles untersuchen.
Warum untersuchst du das hier nicht?
Und dann habe ich ihm bewiesen,
ja,
wenn ich das untersuche,
oder wenn ich diese Annahme treffe,
dann führt das zu Paradoxa.
Dann,
dann falle ich direkt raus,
brauche ich gar nicht weitermachen.
Das hat er aber nicht akzeptiert,
sondern er wollte mir dann versuchen zu erklären,
dass,
dass es aber eine Sinneserfahrung ist,
und du musst alle Sinneserfahrungen versuchen,
als,
als Wissenschaftler musst du alles akzeptieren.
Das ist aber nicht so,
sondern,
sondern als Mathematiker geht man da pragmatischer vor
und sagt,
ja,
aber das,
da brauche ich nicht weitermachen,
weil das bringt mir nichts.
Du bist ja eigentlich nur Statistiker,
du hast ja so eine Approximation gemacht,
von dem,
was du glaubst,
was dabei rauskommt,
und dann doch dich auf deine eigene Sinneserfahrung verlassen,
die irgendwie da so ein bisschen,
die Klopke in die Mitte geht.
Ja,
Mathematik und Sinneserfahrung.
Ja,
das,
das hat keine riesige Überschneidungsmenge.
Das ist ja genau der Versuch,
quasi von den Sinneserfahrungen zu abstrahieren.
Aber ja,
mit den eigenen,
was natürlich schwierig ist.
Ja,
was natürlich schwierig ist,
ja,
klar.
Ja,
sagen wir mal zu den tatsächlich praktischen Dingen.
Ich habe auch ein News-Ding,
weil,
eins hat er noch.
Ja,
genau.
Weil,
das können wir vielleicht jetzt,
können wir das sagen,
jetzt haben wir die ganzen Leute vergrault,
irgendwie mit,
ähm,
mit den esoterischen,
trauen wir das jetzt auch noch zu.
Genau.
Wolltest du nicht irgendwas sagen,
du hast ein Learnings vom Barcamp,
was man nicht machen soll?
Achso,
jetzt hast du mich ja eingeweiht.
Ja,
wir machen das aber gnadenlos,
egal.
Ähm,
und zwar,
wir machen gleich noch was über MCP,
und,
äh,
oder ich kann dazu was erzählen.
Nein.
Machen wir nicht?
Nein.
Ey!
Wir machen eine eigene Folge zu MCP.
Dann machen wir eine eigene Folge zu MCP?
Ja.
Okay,
na gut.
Also,
ich finde ja,
MCP ist das Master Control Program.
Genau,
das fand ich auch,
äh,
ich hab da,
ich hab da,
äh,
Vortragsvorgang.
Oder Metacolopramid,
je nachdem,
wie man möchte.
Na gut,
dann machen wir das heute eben nicht,
aber das müssen wir echt dann bald machen,
weil,
äh,
sonst weiß ich das alles nicht mehr.
Ich weiß das jetzt gerade.
Wir sind im Jochen unter den Nägeln.
In der Mathematical Compute.
Ja,
weil,
liebe Hörer,
schreibt uns an hello at python-podcast.de,
ob ihr diese Folge dringend hören wollt,
oder nicht?
Ja,
okay.
MCP-Folge.
Meinst du,
jetzt hört noch jemand zu?
Ja,
aber,
aber das,
das News-Item wäre an der Stelle irgendwie hier,
Ex-CTO von OpenAI hat irgendwie von einem Venture Capital Fonds irgendwie zwei Milliarden
gekriegt,
ohne irgendwas,
bei einer Validierung von zehn Milliarden oder so.
Also,
der,
der ursprüngliche Entwickler von,
von ChatGPT ist halt auch dabei,
John Schulmann und,
ähm,
ein paar andere Größen.
Äh,
also,
ich meine,
die ganzen,
die ganzen ursprünglichen Leute,
äh,
sind,
sind ja alle nicht mehr bei OpenAI.
Und,
ähm,
äh,
naja,
also,
das ist halt völlig irre.
Die haben kein Produkt,
nichts und kriegen halt so viel Geld.
Das ist echt Wahnsinn.
Und,
äh,
aber wenn man sich für MCP interessiert,
der aktuell beste Podcast,
äh,
den man hören kann,
eine Podcast-Episode,
ist tatsächlich irgendwie von einem Partner von diesem,
äh,
Venture Capital Fonds,
äh,
von einer Partnerin mit,
äh,
Interview mit David Soria,
äh,
Soria Parra,
oder,
ich weiß gar nicht,
wie man das ausspricht,
ähm,
der,
einer der beiden ist,
die sich das ausgedacht,
haben,
und das ist irgendwie echt ganz nett.
Äh,
ja,
also,
aber dieser ganze Bereich ist momentan völlig irre.
Das,
äh,
erinnert mich echt sehr stark an diese ganze DotCamp,
äh,
Bubble Ende der,
Ende der 90er,
und,
äh,
es,
es,
äh,
irre,
ja.
Naja,
genau,
ähm,
aber dann machen wir das nochmal in einer anderen Episode.
Okay.
Ja,
dann,
dann,
der stellt sich jetzt endgültig Zeit für,
dann machen wir jetzt,
was,
was haben wir jetzt?
Anfacket dort der Ereignisse.
Kommt aber ein radikaler Wechsel.
Achtung,
jetzt kommt ein radikaler Bruch.
Data Class Builders.
Ah,
okay.
Ja,
also,
Kapitel 5.
Weil,
weil Anfacket dort der Ereignisse,
das wollte ich nochmal kurz erwähnt haben,
okay.
Hat Johannes eben geschickt,
das war,
das war schön.
Ja.
Ja.
Link in den Show Notes.
Genau,
für Business Leaders oder für Senior Developers.
Wichtig.
Alles klar.
Ja,
Kapitel 5.
Ist ein etwas kürzeres Kapitel,
und ich fand's sehr gemischt beim Lesen.
Mhm.
Ich fand,
es ist so ein bisschen,
es meandert so ein bisschen,
und bringt dann so ein,
so,
so ein paar Themen,
einfach,
auch so mit rein.
Boah.
Sollen wir erst über das Ende reden,
warum das ein Kurzmail ist,
oder warum das keiner ist?
Ja,
ich stimme dem überhaupt gar nicht zu.
Was ist denn das Argument?
Warum sollte das denn ein Kurzmail sein?
Sag du doch mal,
Dominik.
Du findest,
das ist ein Kurzmail.
Das habe ich nicht gesagt.
Also,
vielleicht geht's erstmal,
was in dem Kapitel geht.
Es geht darum,
wie man Datenobjekte einfach,
wie ich das nenne,
vielleicht falsch,
deklariert.
Ja,
also,
mit Data Class,
oder Name Tuples,
eine Klasse,
die nur Daten hält,
und keine Funktionen hat.
Wieso Name Tuple?
Ja,
zum Beispiel,
das ist eine,
also,
gleich auf der ersten Seite
sind drei Mechanismen genannt.
Oder auch wie ein Type-Tick,
Johannes.
Named Tuple.
Nee,
das nicht.
Kommt direkt auf der zweiten Seite,
steht direkt drauf,
das nicht.
Also,
es gibt Collections.NameTuple,
das ist schon lange
in der Python-Schnabel-Bibliothek
seit 2.6.
Das haben sicherlich
viele schon mal gesehen,
können wir gleich noch erklären,
was das ist.
Dann gibt's eine neue Variante davon,
Typing.Name,
NameTuple.
Und,
der heißeste Scheiß
ist natürlich
Data Classes.DataClass,
ein Dekorator,
der diese ganzen Sachen
mitnehmen soll.
Am Ende geht's immer darum,
Klassen zu machen,
die nur Attribute haben.
Und,
im Endeffekt
ist das auch alles
nur so ein bisschen Zucker
obendrauf gestreut,
weil man könnte prinzipiell
diese ganzen Sachen
alle mit Dicks machen,
oder sogar mit Tuples,
wenn man möchte.
Das heißt,
das Einzige,
was man gewinnt,
und das Einzige ist hier
im sehr großen Anfall,
in den Führungszeichen,
dieses Wort Einzige,
das Einzige,
was man gewinnt,
ist,
dass das Programm
besser verständlich wird.
Ruff lintet zum Beispiel
vom Typing-Import-NameTuple
und sagt,
naja,
es ist Collections-NameTuple,
bitte.
Darfst du nicht,
weil...
Ja, sagen die das?
Okay.
Ich bin so ein bisschen,
ich bin nicht ganz
hundertprozentig mal einverstanden
mit den Sachen,
die Ruff sagt.
Und ich hab heute auch
einen Ruff-Cycle gefunden,
wo ich einen Hinweis
gekriegt hab von Ruff,
der gesagt hat,
du musst,
dass der Generator
ist unwichtig,
ist nicht wichtig,
mach bitte eine Dict-Comprehension
draus.
Dann hab ich eine Dict-Comprehension
draus gemacht
und hab gesagt,
ah, das ist eine unnütze
Dict-Comprehension,
mach bitte einen Dict-Aufruf
mit Generator drin draus.
Da war ich sehr amüsiert.
Wie man es macht,
ist falsch.
Ja,
Ruff hat ja auch so ein bisschen,
ist ja schon so ein bisschen
opinionated.
Also nicht alles,
was da von Ruff kommt,
ist ganz wichtig.
Und es gibt schon
einen wichtigen Unterschied
zwischen NameTuple
und NamedTuple,
was auch in dem Kapitel
erklärt wird.
Also die sind schon
unterschiedlich.
Aber,
jetzt wo wir wissen,
was eine Data Class ist,
eine Klasse,
die keine Funktionen hat,
sondern nur Daten halten soll,
kommt direkt in der Einleitung,
sagen sie,
ja,
das ist eigentlich nicht so gut.
Es wird in diesem Kapitel
mehrmals darauf hingewiesen,
dass namhafte Personen
Data Classes durchaus
als CodeSmell sehen
oder als Einstiegspunkt
und als,
das ist noch nicht fertig,
ansehen.
Und das Hauptargument,
so wie ich es verstehe,
ist,
dass wenn du eine Data Class hast,
dann bedeutet das,
dass du eine Klasse hast,
die nur Daten enthält
und keine Funktionen hat.
Und du musst ja aber trotzdem
was mit den Daten machen.
Und das bedeutet,
dass die eigentlich schon Funktionen hat,
nur dass die irgendwo anders drinstehen.
Weil es nur ein Vehikel ist
und das wäre blöd?
Weil,
weil du,
wenn,
ja,
weil du mit Daten
halt irgendwas machen musst.
Und,
und eigentlich bedeutet Data Class
dann in dem Sinne,
dass du deine Funktionen,
die zu den Daten gehören sollten,
irgendwo anders hinschiebst.
Und dass du die irgendwo anders hast.
Und ich stimme diesem Argument
überhaupt gar nicht zu.
Oh,
puh.
Das,
das hört sich für mich sehr nach,
also ich meine diese Namen,
die immer da gesagt,
kommt Martin Fowler
und Kent Beck,
das hört sich,
hört sich für mich sehr nach
Kingdom of the Nouns an.
Das hört sich für mich sehr nach Java an.
Das hört sich für mich sehr an nach,
der Code ist wichtiger als die Daten.
Und das stimmt halt in den,
in ganz vielen Fällen nicht.
In ganz vielen Fällen sind die Daten
viel wichtiger als der Code.
Was du da drin hast,
welche Felder du hast,
wie du drankommst,
ist,
ist in ganz vielen Anwendungsfällen,
zumindest in denen,
die mir so begegnen,
viel wichtiger als dann,
als dann,
dass,
dass die Funktionen direkt dabei steht
und dass du die direkt dazu packst.
Und das ist die eine,
der eine Aspekt.
Du gibst der Funktionalität
mehr Gewicht als den Daten.
Und das ist oft nicht der Fall.
Das,
da könnte man dann,
mir fällt das Detail jetzt nicht ein,
aber da gibt es eines von Linus Torvalds,
wo er sagt,
naja,
so das ist halt quasi oft ein Fehler von Leuten,
die quasi das Licht noch nicht so richtig gesehen haben,
dass sie halt Wert auf Algorithmen
oder sozusagen auf Dinge legen.
Und wenn man dann mal irgendwann später
da so weiß,
was man tut,
dann guckt man sich eher so die Datenstrukturen an
und wie die eigentlich aussehen.
Und dann ist das mit den,
mit der Funktionalität,
ist dann ganz klar und einfach.
Hoffentlich.
Und ja.
Aber ich würde auch denken,
dass genau,
also für mich,
mich erinnert das auch total an irgendwie
objektorientierte Programmierung
Ende der 90er
ist halt irgendwie das Heilmittel für alles.
Und,
aber inzwischen wird man ja sagen so,
naja,
das aktuelle Heilmittel für alles
ist halt Domain Driven Design.
Und aus der Perspektive
ist es halt,
gibt es halt zwei Unterschiede.
Es gibt halt unterschiedliche Arten von Dingen,
für die man halt Klassen hat.
Und das ist halt,
eine sind halt Entities,
also Dinge,
die halt irgendwie eine Identität haben,
die halt wichtig ist.
Und das andere sind halt so Value Objects.
Und bei denen ist es halt wurscht.
Also sowas wie zum Beispiel ein Objekt,
das halt einen Geldbetrag repräsentiert.
Und das Wichtige ist halt der Wert von dem Geld.
Und aber nicht,
welchen Geldschein man hat.
Das ist völlig egal.
Und für solche Value Objects sind halt
Data Classes halt auch total super,
weil,
also es ist,
ne,
genau.
Aber wenn man das halt Slate hat
und man,
dann braucht man halt natürlich vielleicht schon Methoden
und so.
Also ich würde auch denken,
also das ist differenzierter,
ja.
Es gibt noch einen,
es gibt noch einen zweiten Aspekt,
der mir,
der mir da fehlt
in dieser Argumentation.
Der geht so ein bisschen in das,
was du eben gesagt hast,
die Leute,
die das nicht noch nicht gesehen haben.
Wenn,
wenn man,
wenn man über Klassen
nachdenkt
und die sieht als,
als eine Anzahl von Funktionen,
und ein paar Daten dazu,
dann ist es ein anderer Blick
auf,
auf das,
was man tut.
Es ist ein anderer Blick
auf das Programm
und was ein Programm kann.
Und,
und zwar ist es ein Blick
auf einzelne Objekte.
Weil,
weil wenn,
wenn ich so eine Klasse schreibe,
dann,
also in Python gibt es den Self-Parameter,
in anderen Sprachen heißt der This-Parameter,
dann ist es immer,
es gibt immer ein Objekt,
was irgendwie hervorgehoben ist.
Das ist nämlich das Objekt,
an dem ich gerade dran bin,
in dem ich gerade drin bin.
Wenn ich aber den Blick habe
auf eine Data-Class,
dann geht es mir oft gar nicht so sehr
um eine einzelne Instanz
oder ein einzelnes Attribut
von dieser Data-Class,
sondern dann,
dann verändert sich mein Denken hinzu,
was ist denn,
wenn ich tausend davon in der Hand habe?
Was ist denn,
wenn ich eine Tabelle
von diesen Objekten in der Hand habe?
Und,
und dann ist auf einmal
gar nicht mehr das Einzelobjekt wichtig,
sondern dann ist auf einmal
die Gesamtheit der Objekte wichtig.
Was ist denn,
was ist denn,
wenn ich,
wenn ich,
wenn ich eine Million
von diesen Geldbeträgen bekomme?
Ja.
Was kann ich denn dann damit machen?
Ja.
Und,
und diese Art zu denken
oder auch diese Art zu modellieren
ist in der,
in der klassischen OOP
nicht naheliegend,
weil im klassischen OOP
denkt man eben oft
über Einzelobjekte nach,
weil du eben eine Klasse schreibst,
die eine Instanz hat
und für diese eine Instanz
hast du diese Funktion dran
und wenn du die Funktion
auf der einen Instanz aufrufst,
dann,
dann,
dann hast du diesen Blick
auf die eine Instanz
und das ist was,
was,
was,
was,
Das ist schwer zu greifen
und schwer zu erklären,
aber das verändert das Denken
über Programmstrukturen
und das verändert das Denken
über die Inhalte
von einem Programm.
Und das ist was ganz Gefährliches
zu sagen,
meiner Meinung nach,
dass das ein Codesmall ist,
weil du nur diesen einen Blick
auf Programmierung haben darfst.
Ja.
Und deshalb,
ich bin da sehr skeptisch,
wenn,
wenn Leute sagen,
Dataclasses,
ja,
das ist schon okay,
aber hier,
das fängt direkt an,
Dataclasses are like children, they are okay as a starting point,
but to participate as a grown-up object, they need
to take some responsibility. Das heißt,
die, grob übersetzt,
Datenklassen sind wie Kinder, das ist
okay, wenn man damit anfängt, aber wenn man sie
wie richtige Objekte verwenden will,
dann müssen sie schon auch Funktionalität haben.
Sehe ich gar nicht so
und finde ich tatsächlich
nicht gut, diesen Blick
so zu haben. Aber vielleicht meint das so ein bisschen
was wie, weiß nicht, dann zu
Pedantic überzugehen, was ja fast so was ist
wie eine Dataklasse.
Mit so was wie Validierung dran
dann noch oder so.
Ja, aber auch das ist noch,
Pedantic sind natürlich, ja,
sind schon Dataclasses auch, oder?
Ja, ich würde, das sind halt, da gibt es dann eben,
genau, das ist ein bisschen,
das kommt jetzt in dem Buch nicht so vor, weil
das halt auch teilweise aktuelle, also das Buch ist ja
relativ aktuell, aber gerade so der
sozusagen das Pedantic,
ja genau, beschränkt sich mehr so auf die Standards,
aber wobei ja auch
das Vorbild von Dataclasses in der
Standardlib ist Atos, ist halt auch nicht
so,
ja,
es wird auch verbannt am Ende, aber
mehr so als further reading.
Genau, aber sozusagen
Pedantic ist ja danach erst so richtig
populär geworden, würde ich sagen, oder
jetzt auch noch neuer Message
Speck, gibt es ja auch, vielleicht noch mal schneller
und keine Ahnung, aber da muss man vorsichtig
sein, also ich glaube, da vermischt man dann, also Pedantic,
es ist natürlich auch praktisch, aber es vermischt halt
zwei so Sachen, einmal diese Klassen
Bildergeschichte
mit den Adoptionen,
damit man halt sozusagen
ja, das halt kompakt
hinschreiben kann, was man da
für Attribute dran hat, das ist
bei Pedantic ja genauso und dann gibt es
halt diesen Validierungsteil, der ist aber
irgendwie anders, weil das hast du halt in
Dataclasses
und halt bei NameTouple oder so eigentlich
nicht.
Bei Typing.NameTouple hast du Validierung.
Nee, gar nicht, genau.
Und da muss man halt extrem vorsichtig sein,
also ich meine, das kann natürlich auch sehr praktisch sein,
aber es gibt da auch
eben von dem Entwickler von Atos,
einen sehr schönen Vortrag
von der letzten
PyCon US, wo jetzt auch die Vorträge rausgekommen
sind und der heißt, glaube ich,
Design Pressure und das ist
eigentlich... Der Entwickler heißt Design Pressure?
Nee, der Vortrag heißt Design Pressure
und es ist eigentlich... Aber ist das nicht
Hinek Schlaback? Genau.
Der ist doch auch Deutscher, oder?
Ja, ja, genau, den sollte man auch echt mal
fragen, weil der hat immer tolle
Artikel zu
diesen ganzen... Der hat tolle Software geschrieben, tolle Artikel geschrieben,
macht tolle Videos, toller Typ.
Müssen wir mal fragen.
Wenn du in dieser Episode zeigst,
ob er diesen tollen Podcast kommen möchte.
Genau, vielleicht werden wir auch toll dann so ein bisschen
Glanz könnte auf uns abweisen.
Mal schauen. Ja, genau.
Und ja, eigentlich ist das ein Vortrag
über Softwarearchitektur.
Der war ja auch Reviewer für hier
das Architekturbuch, was ich immer empfehle,
also das Software Architecture with Python
und er hat auch schon
häufiger Vorträge über Softwarearchitektur
gehalten und das ist auch wieder so einer
und der ist
startet mit dem Hot Take
irgendwie so Dinge wie Pydentic oder
irgendwie diese Geschichten, Data Validation
Dinger, das macht eure
Architektur von eurem
Programm kaputt.
Ihr Trottel! So, jetzt sage ich euch mal
warum das so ist.
So, gut, man braucht halt irgendwie so ein
meinte so, ja, ich komme ja aus
der YouTube-Welt, da macht man das so, dass man so einen Hook
platzieren muss und dann muss man
drauf deliveren oder nicht.
What happens next. Genau, genau.
Und wenn man das halt schafft, dann ist gut und wenn man es nicht schafft,
ist halt doof.
Mal schauen, genau.
Und ja, also
da, aber ich würde sagen,
im Grunde hat er da ganz recht, ja, also
ich meine, wenn man jetzt das so macht,
dass man halt Pydentic-Modelle
verwendet, halt
als Data-Classes-Ersatz und
die dann halt quasi benutzt, um
die eigene Domain,
ich weiß ja gar nicht, ob es da für irgendeinen guten deutschen Begriff
gibt oder so, dass also der Bereich,
in dem die eigene Business-Logik stattfindet,
zu beschreiben, dann hat man halt schon
einen bösen Fehler gemacht eigentlich oder dann hat man,
sich in der Ecke manipuliert, aus dem man schlecht wieder rauskommt.
Ja,
und da muss man aufpassen.
Also ich meine, man kann das ja auch richtig verwenden,
aber es ist halt nicht so einfach. Also
das ist halt schon gefährlich.
Also insofern bei Pydentic,
also ist auch ein sehr cooles Projekt, aber
man muss halt echt aufpassen,
dass man da nicht, dass also
das, also wenn man
damit auf irgendein Problem zielt, dann hat
der Pydentic-Lauf auch immer so die
Tendenz, so weich zu werden und so auf den eigenen Fuß
runter zu neigen und,
weil dann im falschen Moment schießt, dann hat man
ein Loch im Fuß. Kannst du nochmal kurz
vergleichen oder erklären, was du meinst,
wann das passiert? Naja, also wenn
du zum Beispiel von, also
anstelle einer Data Class halt
ein Pydentic-Modell verwendest.
Warum ist das blöd?
Naja, weil du dann zum Beispiel Pydentic importierst in
deiner Business-Logik. Und dann
bist du davon abhängig und?
Ja und genau, du hast
halt dann
diese Konzerns irgendwie miteinander
vermischt und dann kriegst du alle möglichen
Arten von üblen Design-Problemen,
Architektur-Problemen.
Genau, ja.
Welche? Naja,
also zum Beispiel, wenn das
dann halt jetzt nicht
schnell genug ist und du willst jetzt was
anderes, eine schnellere Art irgendwie die Sachen zu,
weil du hast das jetzt gekoppelt an, du
speichst das als JSON raus und liest JSON rein
und so, was der Pydentic
auch ganz gut kann. Und jetzt stellst du halt fest,
oh, oder gibst das über
eine App hier raus und jetzt stellst du halt fest,
oh shit, aber, also ich meine, das ist relativ schnell,
aber das ist nicht so schnell, wie es geht.
Also es geht natürlich, es gibt ja Dinge draußen, die sind deutlich schneller
als Pydentic und dann stellst du halt fest, so, okay,
irgendwie Pydentic ist zu langsam
für mich. Du wirst Pydentic
niemals austauschen können, da kannst du dein Ding neu schreiben.
Das ist halt, kannst du einfach
völlig vergessen. Und
ja,
das ist halt, wenn man
das halt quasi nicht so
gebaut hat, dass man halt
Pydentic austauschen kann, dann hat man halt, so
ähnlich wie bei, wenn man halt von den Django
Models Model erbt, ne, also
oft kann das ja auch okay sein und bei Pydentic
kann das ja auch oft okay sein, aber wenn du halt ein
Großprojekt hast und dann
hast du halt irgendwann,
willst du Dinge anders machen, dann
kann es gut sein, dass das nicht mehr geht.
Ja, okay, klar,
natürlich.
Ja,
hm, ich fand das jetzt nicht so, dass
Kinder hier gegangen sind.
Sollen wir mal zurückkommen
zum Buch? Ich glaube, da sind tatsächlich noch ein paar
interessante Sachen drin.
Diese,
es werden hier drei Alternativen
genannt, also Collections.NameTupel,
TypingNameTupel und DataClass.
Und warum nicht
TypeDict?
Ja, das ist natürlich hier,
da lese ich, ich zitiere,
TypeDict may seem like another DataClassBuilder.
Ja, das ist es nicht.
Und TypeDict does not build concrete classes that you can instantiate.
Genau, es ist ein, das macht keine Klasse.
25 oder so was, geht ja nochmal drauf ein.
Ja, genau, also das
macht nicht solche Klassen, wie wir sie hier brauchen,
sondern das ist nur...
TypeAnnotation.
TypeAnnotation ist für TypeDict, aber es funktioniert anders.
Genau, und es ist eine böse Falle, also ich weiß nicht,
wie oft ich das schon gesehen habe, dass Leute
denken, dass sie dann sicher werden
und aber nie MyPy oder sowas ausführen
und dann, wenn man es
dann mal ausführt, kriegt man halt gesagt,
so, ja, also das, was du da machst mit dem TypeDict,
das ist für uns alles falsch.
Nie einer gemerkt.
Hat dir das Claude erzählt?
Nee, mir begegnet sowas ständig.
Hat sich jemand ausgedacht.
Okay,
aber im Endeffekt funktionieren
doch diese drei
Verfahren alle irgendwie gleich. Du musst irgendwie
eine Definition schreiben und du sagst, ich möchte jetzt
eine Klasse haben, die soll einen Namen
haben und die soll folgende Attribute
haben. Und die werden dann
getypt und getypethintet.
Ja, entweder getypt oder auch nicht getypt.
Musst du nicht unbedingt getypt haben.
Und selbst wenn du es
getypt hast, kannst du es ja immer noch anders verwenden.
Selbst wenn du deine Dataglass schön
mit Types versehen hast,
kannst du ja immer noch reintun, was du möchtest.
Also in Tupe wäre es Immutable, dann muss ich
ein Frozen machen bei der Dataglasse.
Genau, aber das hat mit
den Types nichts zu tun.
Auch das Typing.Name
Tupe kann ja andere
Sachen nehmen. Das ist ja erstmal nur eine Absichtserklärung.
Ich beabsichtige,
dass dieses Attribut nur ein Int
sein kann, aber da hüte ich nie mehr davon ab.
Kannst auch eine Liste reinmachen.
Generell bei Python so.
Okay,
aber ich finde es interessant,
weil im Wesentlichen
gibt es da zwei verschiedene
Syntax-Möglichkeiten.
Und die eine, das ist die, die von
NameTuple kommt, wo man halt sagt, ich möchte ein
NameTuple haben und dann rufe ich die Funktion
oder rufe ich den Konstruktor
NameTuple als Konstruktor auf und sage eben,
diese Datenklasse soll
den Namen, hier haben sie das
Beispiel Coordinates haben, also Koordinate haben
und die hat zwei Attribute, Lat und Lon. Und dann kriege ich da eine
Klasse raus. Oder besser gesagt, ich kriege
einen Konstruktor raus für eine Klasse. Ich kriege ja nicht
meine ganze Klasse raus, sondern ich kriege nur den Konstruktor
raus.
Und das ist so ein bisschen irgendwie so eine
textuelle Beschreibung. Und ich habe da immer so
ein bisschen Hemmungen. Das fühlt sich so ein bisschen an, als ob
man irgendwie um diesen
ja,
um so Python außen rum geht
und um den
Interpreter außen rum geht
und dass man irgendwelche langsamen
magischen Sachen macht.
Aber ich glaube tatsächlich, man muss da weg
davon. Man muss sagen, okay, dieses
Herstellen der Klasse, das ist langsam, aber das
ist ja egal, weil das macht man nur einmal.
Das Instanziieren, das ist dann so
schnell wie ein Tuple.
Und die verbrauchen auch nicht mehr Speicher.
Also diese Namen werden nicht bei jeder
Instanz dazu gespeichert.
Nicht wie bei einem Dictionary, sondern
es ist eben ein Tuple. Und im Endeffekt ist es
ein Tuple mit so ein kleines bisschen
Karamellsoße obendrauf gestreut,
wo man eben nicht Index 0,
Index 1 und Index 2 hat, sondern wo man eben
Latitude und Longitude sagen kann.
Und das bedeutet dann Index 0 und Index 1.
Ja, das sieht viel schneller aus.
Also lange Zeit war ein Tuple auch
irgendwie deutlich schneller. Also wobei
nichts ist so schnell wie tatsächlich einfach,
quasi wenn man eine Klasse
instanziiert. Aber NameTuple war dann
halt die schnellste Alternative.
Und wenn man
jetzt früher war das halt oft so,
oder wenn man
halt Attribut-Lookup
macht, dann ist das
bei NameTuple natürlich schneller.
Also irgendwas, Instanz, Punkt,
irgendein Attribut, weil
Tuple Index.
Und inzwischen macht aber Dataclasses
und auch, glaube ich,
NameTuple, wenn man davon erbt, per
Default irgendwie Slots. Aber vielleicht erzähle ich jetzt auch Unsinn.
Das muss man irgendwie mal nachgucken.
Aber ich glaube, das ist tatsächlich so.
Das Fazit ist für mich,
das hat gar keine praktische Auswirkung.
In keinem Fall, den ich je hatte,
hätte das eine Auswirkung gehabt, dass die Konstruktion
von diesen Datenobjekten
zu langsam gewesen wäre. Das heißt, das ist auch wieder so ein
Jagdnifal. Das ist so eine Angst,
die ich in meinem Kopf habe, die aber eigentlich
in dem Moment noch nicht berechtigt ist.
Große API-Responses
oder wo du Zeugs
reinkriegst, weil da kann das schon,
so wenn du so halt irgendwie
10.000 Dinger in Objekte verwandelst
und dann ist halt dein Objekt erzeugt.
Ja, aber gut, wenn da Jason reinkommt, hast du ja eh schon verloren.
Ja, aber es gibt ja schnell einen Jason-Parser.
Aber du musst es dann nochmal zu Objekten machen.
Da bekommst du erst einen Dikt.
Wie auch immer,
für mich der Takeaway ist,
ich habe da immer so ein bisschen Hemmungen.
Ich habe immer so ein bisschen Hemmungen, so NameTupels
zu machen, weil das nicht so richtig in die
Syntax passt, weil das anders aussieht,
als andere Sachen aussehen. Aber es ist gar nicht
schlecht.
Es ist gar nicht schlecht.
Es ist gar nicht schlecht.
Es ist gar nicht falsch, NameTupel zu machen.
Ja, aber was meinst du, das sieht anders aus.
Also ich finde, wenn du das jetzt vom Typing
oder vom Collections importierst, dann kannst du ja
Klasse schreiben. Sieht ja fast aus wie eine
Data-Klasse.
Genau, das kannst du machen.
Das sieht auch normal aus. Das ist auch was, was ich empfehlen würde.
Das kannst du machen, aber dieser
Konstruktor, der NameTupel-Konstruktor,
also das ist tatsächlich alles klein geschrieben
und dann musst du da Strings reingeben.
Ja, das ist ein bisschen...
Ja, was daran auch
komisch ist,
also einmal, ich finde es auch ehrlich gesagt
ein bisschen hässlich, weil das ist uralt.
Das gibt es schon ewig.
Das ist super praktisch.
Das ist natürlich manchmal super praktisch, wenn man halt irgendwie auf alten
Interpreter-Versionen rumguckt.
Genau, das funktioniert
wahrscheinlich bis... Also da gibt es nichts mehr, was noch läuft,
was irgendwie älter ist.
Das funktioniert wirklich überall.
Aber was halt auch blöd ist, ist,
es geht zwar auch, dass man da Methoden dranhängt,
aber das ist auch voll umständlich.
Da muss man halt auch erstmal Informationen anzeugen.
Und dann muss man das Ding irgendwie da dranhängen.
Und es geht alles, klar, aber
es ist halt schon so, wenn das als Methode dransteht, ist das schon
leichter verständlich, wie das passiert.
Ja, da kann man ganz viel hässliche Magie mitmachen.
Ich glaube, wenn man so Code-Call spielt oder sowas, dann ist das eine Disziplin,
die man so spielen kann. Und wenn man Leute
verwirren will oder so ein bisschen Offuscation...
Nee, nee, nee, das ist nicht gut.
Nee, dann gehen wir wieder zur Typing-Name-Tupel,
weil Typing-Name-Tupel hat nämlich Klassensyntax.
Und die ist tatsächlich...
Ich finde die sehr schön.
Es wird
gleich noch ein Problem beschrieben werden,
was ich auch tatsächlich sehe,
weil ich glaube, dass das nicht so gut ist.
Ja.
Ja.
Aber es ist so ein bisschen so, wie man es sich vorstellt.
Wenn man aus einer anderen Sprache kommt,
dann sagt man, ich möchte eine Klasse haben und diese folgende Attribute haben.
Und das ist hier genauso, weil die Klassensyntax
halt so ist, dass ich sage, Klass,
dann den Klassennamen, abgeleitet von Name-Tupel,
was aber so ein bisschen
nicht ganz richtig ist.
Weil die MRO da gar nicht drin ist,
weil das nur eine Meta-Klasse ist,
weil da nämlich gar nicht tatsächlich Name-Tupel ist.
Die machen halt so ein richtiges Tupel.
Genau. Und dann innerhalb von der Klasse
gebe ich einfach die
Attribute, die ich da habe,
Attribute, an die ich haben möchte, mit ihrem Typen.
Also hier in dem Fall beispielsweise Latitude,
Doppelpunkt Float und Longitude,
Doppelpunkt Float. Und das bedeutet,
dass diese Klasse automatisch einen Konstruktor
bekommt, der
eben diese zwei Attribute nimmt,
entweder Named oder Unnamed.
Das war so der Hauptanwendung.
Du möchtest jetzt nicht irgendwie eine Klasse schreiben, wo du reinschreibst
in Init, nimm folgende Argumente,
Latitude und Längitude und dann machst du safe,
Init, Lot, gleich, lang und da.
Genau. Kannst du alles selber machen, aber es wird dir
alles abgenommen, wenn du das hier machst. Genau.
Durch Metaklassenmagie.
Und im Endeffekt...
Jetzt ist schon das zweite Mal, dass ich jetzt wieder das Trinkspiel mache,
was wir letztes Mal angefangen haben.
Ja, ich weiß. Das ist mein
Wort, was zu oft kommt.
Wir sagen das jetzt nicht nochmal.
Bei Dataclasses ist ja
im Grunde genommen das Gleiche, dass
so eine gewisse... Du sagst, welche
Klassennamen du haben möchtest, welche Attribute du haben
möchtest, welchen Typen du haben möchtest.
Und da ist natürlich leicht, weitere
Methoden hinzuzufügen. Die schreibst du einfach in den Klassener.
Ja.
Das mache ich auch relativ häufig.
Aber ich mache das tatsächlich relativ häufig,
dass wenn irgendwie aufhält, ich hätte noch gerne K und doch das Maximum
und die Summe berechnet von irgendwas.
Das war schon super praktisch.
Ja, natürlich.
Das ist ja dann das, was hier
der Anke Bob würde sagen,
das ist gut, bist du auf dem richtigen Weg.
Das implementet der Klassener.
Genau. Es ist interessant, weil
da ist ja so ein bisschen Triggery
drin hier. Dieses Name-Tupel, dieses Typing-Name-Tupel.
Das ist ja gar keine normale Klasse,
sondern es ist ja eine Meta-Klasse.
Ja.
Was ist denn jetzt so eine Meta-Klasse?
Eine Meta-Klasse?
Welches Kapitel ist das?
Das ist weiter, glaube ich.
Da brauchen wir noch ein bisschen.
Dynamic Attribute and Property.
Wir verschieben das.
Das ist Kapitel 24.
Ja, also Kapitel 24.
Also nur noch 19 weitere Episoden
und schon sind wir über das Buch.
Ja.
Ja.
Dazwischen natürlich noch die anderen.
Ja.
Okay, aber dann, dieses Kapitel macht
jetzt hier eine total interessante Biege,
weil das nächste ist ja jetzt...
Ah, übrigens, wir müssen Typings machen.
Wir müssen noch ein bisschen über Typing sprechen.
Ja, ja, ja.
Und das fand ich interessant, als ich es gelesen habe,
weil das war so ein Twist, den ich nicht erwartet hatte.
Er hat deswegen darüber gesprochen,
weil er gesagt hat,
dass es total cool ist,
wenn man jetzt Matchcase benutzt.
Und das liegt auch daran, dass das...
Ja, aber das ist dann der dritte. Das ist der nächste Twist.
Ach so.
Das wurde ja gerade erst eingeführt, als das Buch rauskam.
Ich glaube, deswegen ist da so die Emphasis so ein bisschen...
Ja, vielleicht war es auch nicht genügend für ein...
Ups, jetzt geht hier mein Aufnahmekomputer gerade aus.
Vielleicht ist es auch noch nicht groß genug
für ein eigenes Kapitel,
aber ich finde es interessant,
dass hier so Type Hints
oder Type Annotations
so in einem
ganz anderen Kapitel
versteckt wird.
Und auch nicht so,
dass man es jetzt...
Also ich habe mir ja die Inhaltsangabe
hier die Sachen durchgelesen alle,
aber da habe ich damit gerechnet,
dass das jetzt hier
so eine Abbiegung macht und dann sagt,
ach so, übrigens, hier,
lassen Sie über Typen sprechen.
Also kommt natürlich
nachher nochmal, aber
ja.
Ja, ist natürlich schon auch so ein bisschen naheliegend,
weil man muss halt jetzt dann irgendwie,
wenn man schon erklärt, wie das
da bei diesen Klassbildern funktioniert,
dass man halt,
wenn man über die
Typ-Annotationen im Grunde
halt, ja,
schon sagt, was das dann sein soll,
dann muss man ja auch erklären, wie das funktioniert.
Und dann kann man ja, da muss man ja irgendwie
andere Annotations irgendwie erwähnen
und dann ist man ja mittendrin in den Typ-Annotationen.
Ja, das...
Man muss da so ein bisschen in den Wald reinlaufen
und sich da so ein bisschen drin verlaufen, ja.
Also ich verstehe es schon, aber es war irgendwie...
Ja, das war unerwartet.
Ja.
Und da kommt auch das eine Problem raus mit den Data Class.
Also wenn ich so eine Data Class schreibe,
dann habe ich ja diesen Dekorator vorne dran,
Data Class,
Data Class ist der Data Class,
dann schreibe ich Class den Klassennamen,
also in dem Fall jetzt hier Class Coordinate
und im Klassenkörper schreibe ich dann die Attribute,
die die Instanzen haben sollen.
Und das wird hier
in dem Kapitel sehr deutlich gemacht
und das finde ich auch sehr richtig und sehr gut,
weil das ja tatsächlich eigentlich
eine Abwendung ist von dem,
was Python normalerweise macht.
Weil wenn ich normalerweise hier
ein Attribut reinschreibe,
also wenn ich Latitude gleich X reinschreibe
und Longitude gleich Y,
dann ist es ja erstmal ein Klassenattribut.
Und hier in dem Fall,
wenn ich jetzt aber Latitude
Doppelpunkt Float, also Latitude
getypt mit dem
Float-Typ hinschreibe,
dann ist es auf einmal ein Instanzattribut.
Und
dieser Unterschied wird hier
in einer gewissen Länge diskutiert,
weil der wirklich,
sehr wichtig ist, weil es sehr leicht ist,
diesen Unterschied zu machen.
Diese beiden Sachen sind sehr nah aneinander
und die sehen sehr gleich aus,
machen aber dann andere Dinge
und sind eigentlich anders als das,
was in Python so normal ist.
Das heißt, da muss man schon besondere Vorsicht...
Du musst nochmal bitte den Unterschied genau erklären
zwischen diesem Instanzattribut
und dem Klassenattribut.
Ich habe nämlich schon mehrfach Menschen gesehen,
die das so gewohnt waren,
dass das halt dann immer ein Instanzattribut ist,
was man da direkt unter die Klasse schreibt,
dass sich das erst später festgestellt hat.
In anderen Sprachen ist es ja auch so.
Wenn du in Java oder C oder sonst wo bist,
dann ist es genau so.
Dann sagst du, die Klasse soll folgende Instanzattribute enthalten.
Und in Python ist es aber anders.
In Python sagst du,
die Klasse soll folgende Klassenattribute enthalten.
Der Hauptunterschied zwischen
Klassenattributen und Instanz ist halt,
dass ein Klassenattribut ist halt für alle Instanzen
der Klasse gleich.
Und das ist halt wahrscheinlich überraschender.
Diese Eigenschaft ist mir auch schon mehrfach
blöd auf die Füße gefallen.
Aber so ist es halt.
Genau.
Da muss man vorsichtig sein.
Das heißt, wenn du das setzt,
irgendwo an einer existierenden Entität,
dann wäre das für alle gesetzt?
Ja, also wenn das eine Klasse ist,
dann sagst du halt jetzt,
schaffst du es irgendwie,
dass tatsächlich irgendwie ein Klassenattribut
defaultmäßig zum Beispiel eine Liste ist.
Also indem du das auf Ecke Klammer auf
Klammer zusetzt oder so.
Oh, das ist jetzt aber ganz hässlich.
Und du überschreibst das nicht nachher
nochmal irgendwie in einem Konstruktor oder so,
was ja dann oft passiert.
Dann ist es kein Problem mehr,
weil in dem Moment, wo man es neu setzt oder so,
ist es dann ein Instanzattribut
und nicht mehr ein Klassenattribut.
Merkt man auch nichts von,
ist vielleicht ein bisschen gefährlich.
Aber wenn das nicht passiert,
dann passieren plötzlich wilde Dinge,
weil dann ist das halt für alle Instanzen gleich.
Und es funktioniert zwar,
dass man da Sachen appendet,
aber da sind dann halt nicht nur die Sachen,
die man selber appendet hat drin,
sondern alle anderen auch.
Deswegen ist es eine Konvention,
wie man das macht.
Und zwar kann man das nennen
Cache unter Strich irgendwas.
Dann hast du einen Cache.
Dafür kann man es verwenden.
Für alle Instanzen dieser Klasse.
Dann kannst du damit merken,
alle Errors, die aufgetreten sind,
oder sowas.
Ja, also das hat durchaus Gründe,
warum man sowas haben will.
Ja, klar.
Das ist ganz gut.
Aber damit kann man sich hart in den Fuß stehen.
Also tatsächlich,
das hatten wir, glaube ich,
auch schon ein paar Mal gesagt,
dieses Instanzieren von leeren Dicts oder Listen
ist in Python generell sehr gefährlich.
Wenn man das als Default-Argument macht,
sollte man nicht.
Ja, ganz, ganz gefährlich.
Ja, und generell Klassen.
Also ich mache oft Programme,
Programmierkurse.
Und das ist wirklich schwierig zu verstehen,
was eine Klasse ist
und was eine Instanz von einer Klasse ist.
Und wie die zusammenhängen
und was die zusammen tun
und warum die das so tun.
Und das ist echt, echt schwierig.
Und jetzt gibt es hier eben genau
diesen subtilen Unterschied hier.
Das eine, das sieht genauso aus wie das andere.
Aber wenn du nicht Doppelpunkt int
hinterschreibst,
dann ist es auf einmal eine Klasseninstanz.
Hahaha.
Ja.
Und das ist schon,
das ist wirklich was sehr Subtiles,
vieles.
Und,
und das geht eben weg von dem,
was Python normalerweise macht.
Normalerweise schreibst du in die Klasse
die Klasseninstanzen rein
und hier schreibst du auf einmal,
wie in anderen Programmiersprachen,
wo es sich natürlich anfühlt,
schreibst du die Instanz-Eigenschaften rein,
die Instanz-Aboote.
Wobei, wobei dann natürlich zum Beispiel
Data Classes schon auch auf die Finger haut,
wenn du da irgendwie einfach eine Liste
hinschreibst oder so,
dann sagt dir das so,
nee, nee, das kannst du aber nicht machen.
Du musst ja irgendwie dann Default,
wie heißt das Ding,
äh,
Field,
ja, eine Factory musst du angeben.
Factory, äh,
angeben, genau.
Ähm,
aber da kommt es natürlich rum.
Ja.
Es gibt ja viele,
viele Mutable Classes
oder viele Dinge,
die du da reintun kannst,
die eben nicht,
das ist nur jetzt für Liste
und für Dictionary
und für Set ist,
äh,
Special Cased,
weil die so häufig vorkommen.
Genau.
Ja, also das ist gefährlich,
das stimmt.
Das ist,
äh,
ich weiß auch nicht,
wie,
wie ihr das so macht.
Äh,
also,
ähm,
normalerweise,
also sicher,
äh,
also auch wenn man jetzt Konstrukturen hat
von,
von normalen Klassen,
da ist es ja auch gefährlich,
wenn man da irgendwie,
äh,
zum Beispiel sagt,
annotiert das jetzt in Liste
und dann sagt man gleich
und dann Ecke Klammer auf,
Klammer zu
und so.
Viele Leute denken sich wahrscheinlich nichts dabei,
wenn sie das tun,
aber das ist halt auch schon brutal gefährlich.
Äh,
also ich mach immer Liste und None gleich None.
Ja,
aber,
aber dann,
das ist das Pattern,
das muss man sich einfach merken.
Ja.
Ein doofes Pattern,
aber man muss es sich einfach merken.
Aber,
aber das ist ja auch,
äh,
nicht so schön,
weil einmal ist dann deine Typ-Annotation halt
so ein bisschen,
äh,
also einmal ist sie halt hässlich,
würde ich jetzt mal so sagen,
mit diesem
Pipe None,
das ist halt schon so,
uh,
ja.
Es gibt doch,
es gibt doch diesen schönen,
ähm,
Unknown-Type-Tint.
Ja,
das ist auch optional,
dem ist auch hässlich,
aber,
äh,
unknown gibt's da noch dazu?
Ja,
aber unknown,
uh,
da ist ja schon,
wer,
wer kennt denn das?
Annie.
Ja,
uh,
oder Annie.
Ja,
vielleicht,
ich hab noch einen dritten Type-Tint,
der dann so ein bisschen spezieller war,
dass das klar ist,
dass das irgendwann
nicht bestellen könnte.
Also,
das,
aber,
also ich find auch,
ich find auch,
das funktioniert nicht richtig.
Wenn man jetzt den,
den statischen Type-Checker sagt,
das kann jetzt auch None sein,
dann hat man damit so einen riesen,
dann hat man sich einen,
einen riesen Haufen Würmer.
dann sagt der immer dann,
äh,
tatsächlich irgendwann im Code sagt der immer,
hey,
du hast ja nicht auf None geprüft,
und dann lintet der das alles,
weil du musst vorher mal so ein Assert-as-not-None machen.
Ja,
oder,
oder noch schlimmer,
also wenn's dann halt nur nervt,
ist ja,
ist ja noch,
was noch schlimmer ist,
ist halt,
das Bugs dann halt irgendwie unerkannt,
dass halt,
du kannst plötzlich,
äh,
Illegal-State repräsentieren,
und normalerweise sagt man immer so,
ja,
also,
äh,
make Illegal-State unrepresentable,
ja,
das sollte gar nicht passieren dürfen,
da sollte der Type-Checker,
sollte dir sagen so,
nee,
das darf nicht None sein,
und du hast dieses None ja nur benutzt,
damit du's initialisieren konntest,
das ist ja,
hat ja gar nicht,
wenn in deiner Logik nicht None vorkommen darf,
was ja dann oft bei diesen Initialisierungsgeschichten gar nicht so ist,
dann darf das da nicht drinstehen,
und,
äh,
wenn du's trotzdem möglich machst,
dass es drinsteht,
dann machst du halt ne Büchse,
äh,
Backwürmer auf,
äh,
die dich irgendwann beißen werden,
und,
äh,
die Frage ist halt nur,
äh,
warum ist das,
oder,
und was machst du?
Umgekehrt,
ja,
umgekehrt,
du,
äh,
machst wie in Java,
wo jeder Typ optional ist,
und hast dann auf einmal an,
in jeder Scheißfunktion,
in die du reingehst,
musst du acht Variablen auf Null überprüfen.
Ja,
das ist natürlich auch,
genau,
das ist auch hässlich,
also insofern,
genauso schlecht,
nee,
also,
ich würde sagen,
aus der Perspektive betrachtet,
musst du eigentlich sagen,
nee,
die man so hat,
die sind nicht optional,
optional,
also du würdest sagen,
das ist eine leere Liste,
und wenn da eine leere Liste reinkommt,
musst du es neu initialisieren.
Das kannst du,
das kann,
ja,
ja,
das war da auch wieder verwirrend,
wie,
kannst du ja auch nicht gut machen,
nee,
was,
was ich an der Stelle mache,
ist,
ich nehme ein,
äh,
das ist ein Trick von,
eine Sentinel,
eine Sentinel,
ja,
genau,
von Luke,
Luke Plant,
da hat das,
da habe ich das her,
ja,
äh,
und zwar definiere ich mir einen Typ namens Auto,
und der ist,
äh,
äh,
definiert über eine Klasse,
unterstrich Auto,
und das Ding,
es macht nichts,
außer,
dass es nach,
äh,
Falls evaluiert,
und,
ähm,
äh,
in,
in,
in Boolean-Kontext,
in Kindern dann,
Auto,
Auto,
Auto,
Auto,
Auto,
Auto,
und,
und den Typ Any hat,
und dann musst du nicht,
oder irgendwas sagen,
sondern Any geht halt überall durch,
das heißt,
wenn du mal eine Auto hinschreibst,
dann kann man die Typ-Annotation richtig lassen,
und Auto geht halt trotzdem durch.
Aber Any,
geht überall durch,
das ist doch falsch.
Ne,
das ist,
aber das ist so.
Also,
dass,
dass das Auto Any hat,
ist,
ist,
ist,
ist egal,
welche Typ-Annotation du vorderan geschrieben hast,
ist es richtig.
Das ist übrigens Pep 696,
oder?
Und,
oh,
das weiß ich nicht,
ich kenne die nicht auswendig,
aber,
äh,
Wie,
du kennst nicht alle Peps auswendig?
Ja,
Entschuldigung.
Schwer enttäuscht.
Äh,
und dann,
und dann kannst du halt im,
in der,
in dem Konstrukte zum Beispiel dann halt sagen,
if das Ding,
oder,
if not das Ding,
dann,
äh,
machst du,
das kannst du ja mit none auch nicht machen,
weil none musst du dann korrekterweise immer sagen,
if das da ist,
äh,
ist none,
dann setzt es neu.
Äh,
und,
äh,
ja,
also.
Ja,
okay,
aber wie würdest du das mit dem Auto machen?
Das habe ich jetzt nicht verstanden.
Da das,
äh,
eine eigene Klasse Auto.
Es ist halt Auto.
Ja.
Äh,
und,
also das importiere ich dann irgendwo her,
und,
also der Default-Wert ist Auto,
die Annotation ist so,
wie sie halt sein soll,
also zum Beispiel.
okay,
okay,
und dann?
Und dann sage ich,
if das Ding,
äh,
if not das Ding,
ja,
okay.
Dann setzt es neu.
Okay,
aber wenn jemand eine leere Liste reingeben würde,
würde es dann auch neu sein.
Also,
der Unterschied ist tatsächlich,
äh,
nur,
dass er halt none,
äh,
aber,
aber,
aber dann würde ja,
wenn das,
wenn das halt nicht okay wäre,
dann würde ja der Type-Checker nicht mehr kommen.
Also,
nee,
aber,
du hast jetzt gerade,
nee,
du hast einen semantischen,
einen semantischen Unterschied eingeführt.
Ja,
if not,
schreibst halt nicht,
if not foo,
äh,
dann,
also,
ne,
du schreibst if not foo,
dann foo neu setzen,
oder,
ne,
weil das halt Auto ist immer forward,
sagst nicht,
foo ist none,
weil du sparst dir halt einfach das none,
sondern,
genau,
ich spare mir das none,
und ich,
äh,
ich spare mir die is-Geschichte,
und,
äh,
ich mache es halt so,
wie es Leute mit none machen,
aber,
wobei die is-Geschichte,
du könntest das ja,
du könntest ja immer noch,
ist,
ist Auto machen.
Das könnte ich auch machen,
ja.
Ich würde tatsächlich sogar sagen,
du musst es machen,
weil,
nehmen wir mal an,
ich rufe diese Funktion,
die du mir gerade eben gesagt hast,
oder diesen Konstruktor,
rufe ich auf mit nem,
mit dem Parameter,
und der Parameter ist ne leere Liste.
Mhm.
Und ich behalte die aber außen vor,
und benutze die an einer anderen Stelle nochmal.
Das heißt,
ja,
ich pende da Sachen rein,
ja,
das hast du jetzt,
genau den Use Case,
ja,
den Python so gefährlich macht,
den hast du jetzt kaputt gemacht.
Und jetzt,
ja,
überlassen wir jetzt,
wir,
wir starten jetzt ne Umfrage,
schreiben sie uns an
hallo at python-podcast.de,
ob das gut oder schlecht ist.
Schlecht.
Hä?
Ja,
genau,
also ich war,
ich bin auch noch nicht endgültig zufrieden,
ich will nur sagen,
also,
damit die Hörer das sagen.
Okay,
aber,
also ich will,
ich mach es halt jetzt gerade so,
ich leide dann auch mal ein bisschen drunter,
dass zum Beispiel LLMs,
die halt das gewohnt sind,
dass Leute da nan oder nan schreiben,
denn die sind immer total verwirrt,
so,
was will der denn da jetzt,
und dann sagt der mir schon wieder,
ich soll dieses Auto verwenden,
hä,
ich verstehe nur Bahnhof,
äh,
machen sie irgendwie komische Sachen,
und ja,
gut,
ich schreibe das dann auch immer in die entsprechenden Rules mit rein,
aber es hilft ja auch nur so begrenzt,
äh,
es ist ein Kreuz,
ich weiß auch nicht.
Der Code ist einfach zu wenig standardkonform,
der ist zu wenig gewöhnlich.
Kann man den ja noch lesen,
wenn er über ein Auto steht,
weiß der jeder,
was gemeint ist?
Nee,
das wissen Leute dann halt dummerweise auch nicht,
das wäre auch schon passiert.
Wenn er das in LLM schon nicht weiß.
Ja,
genau,
LLMs wissen das nicht.
Kontrollklick drauf,
und dann,
ja.
Okay,
aber,
äh,
das Kapitel macht ja jetzt noch eine zweite Abbiegung,
der Dominik hat es ja schon erwähnt,
und zwar Richtung Pattern Matching Class Instances.
Auf einmal kommt hier in dem Kapitel noch Pattern Matching.
Hooray.
Was?
Ist doch schön,
der Matching,
oder?
Das ist der zweite Twist in the end.
Ja.
Da war ich ja,
überhaupt gar nicht drauf vorbereitet.
Dominik,
warum magst du Pattern Matching?
Erklär mal.
Ähm,
weil ich damit relativ verschiedene,
na,
das ist erst blöd,
weil das mag man eigentlich nicht.
Also ich kann verschiedene Objekte entgegennehmen,
und die,
äh,
checken,
und dann gucken,
Und wie geht das?
Erklär mal,
wie das geht.
Du machst dein Match und dein Case auf,
matchst dann deine Variable,
die du hast,
und gibst dann verschiedene Cases.
Also du hättest gerne,
ähm,
irgendwas ist,
äh,
schwieriges Beispiel,
so eine Koordinate.
Dann gibst du rein,
dass das eine Koordinate sein könnte,
und dann hat der tatsächlich den Pfad,
okay,
hier ist eine Koordinate.
Und wenn du danach zum Beispiel sagst,
es ist eine Straßenadresse,
dann guckt der,
okay,
hier ist eine Straßenadresse,
passt da rein,
und gehst weiter.
Und du kannst da bestimmte Attribute omitten,
indem du die einfach auf,
äh,
dann setzt,
weil das verständlich ausgerichtet ist.
Und kannst damit relativ schön Cases abfangen,
und hast dann irgendwann einen Standardcase.
Also so ein bisschen so,
if,
äh,
then,
ne,
if,
edif,
edif,
edif,
in,
gut lesbar finde ich.
Also ich mag das sehr gerne.
Ja.
Du kannst auch Types machen,
und kannst Guards machen,
und sowas.
Ja,
man kann ja sehr viele Sachen machen.
Ja.
Das verdient fast eine eigene Episode.
Ja.
Da muss man eine eigene Episode zu machen,
haben wir auch noch nicht gemacht,
haben wir auch schon häufiger geplant,
aber ja.
Ja,
genau,
das müssen wir mal machen.
Man kann auch da,
ich finde,
ja,
also es ist super mächtig,
ich brauche es ehrlich gesagt nicht so oft.
Ja,
das ist,
äh,
ich bin ein großer Fan davon,
ich finde es großartig,
das ist eines der besten Language Features,
was es gibt,
aber ich habe es noch nie verwendet.
Ja.
Ganz komisch.
Ähm,
also ich meine,
ich glaube,
das ist halt auch für Leute,
die jetzt oft Parser für irgendwelche Sachen schreiben,
oder so,
ne,
oder halt so,
äh,
Domain Specific Languages für irgendwas haben,
also für die,
die brauchen,
die brauchen,
die brauchen das wahrscheinlich oft,
aber das macht man halt nicht so oft,
also,
ja.
Also ich,
also das erste Mal habe ich Pattern Matching gesehen,
da war ich noch ein junger Mann,
damals,
und das war in Erlang.
Ah,
ja,
ja,
ja,
gut,
ja,
okay.
Und da ist es,
da ist es ja ein Core Language Feature,
ja,
da ist es ja so ein,
ja,
hier,
da hast du eine Funktion,
und natürlich,
das erste,
was die Funktion macht,
ist immer erst mal Pattern Matching.
Mhm.
Und die benutzen das für alles,
ja,
wenn du hier ein None reinkriegst,
ja,
klar,
dann geht die Funktion,
wenn das Pattern hier ein None ist,
dann musst du erst mal hier,
das ist ein Bassen jedes Mal.
Und da ist es ja nicht,
da geht es nicht so sehr um Pause,
sondern da geht es ja schon irgendwie,
auch um Schnittstellen und um Datenaustausch,
und ich habe in meinem Kopf schon immer den Gedanken,
dass man,
wenn ich eine Schnittstelle schreibe,
dass ich da irgendwie so ein Pattern Matching reinmachen könnte.
Mhm.
Also irgendwie hat es noch nie so richtig gut gepasst.
Ja.
Weiß auch nicht.
Ich weiß,
ich weiß auch nicht,
ich weiß auch nicht,
kann man schon Exception Types gucken,
oder,
ja.
Ja,
aber die fange ich doch in dem Accept,
in den Accept Blocks schon ab,
die verschiedenen Exception Types.
Da gibt es doch so einen Syntax für.
Und für die verschiedenen Instanztypen,
die muss ich eher irgendwie in Funktionen rein verzweigen.
Und,
ach,
ich weiß irgendwie nicht,
ich würde es gerne mehr benutzen.
Ich weiß nicht,
ob das ein Problem an mir ist,
oder ob das ein Problem an...
Also ein Problem war eine ganze Zeit lang auch,
also jedenfalls,
als das Feature total frisch war,
für mich jedenfalls auch,
dass ich mir gesagt habe,
ach,
ich muss ein bisschen vorsichtig sein,
dass ich das jetzt nicht irgendwie,
mich zu sehr darauf verlasse,
dass es das gibt,
weil es ist ja noch ganz neu,
und viele verwenden halt noch ältere Python-Versionen.
Und vermutlich super langsam.
Ja,
genau,
aber,
aber das ist ja jetzt inzwischen,
ist ja so,
3.10 ist jetzt schon die älteste Version,
die man so,
mit der man normalerweise zu tun hat.
Nee,
3.10,
3.10,
also 3.10 meinst du nicht?
Ja,
genau,
und eine 3.10 ist es,
genau,
nicht 3.10,
meinte ich nicht,
nee,
3.10,
genau.
Ja,
und da ist es ja dazugekommen,
also insofern würde ich sagen,
jetzt ist sicher,
dass man es eigentlich immer verwenden kann,
insofern,
ja,
muss man mal gucken,
ob es da nicht doch mehr Use Cases gibt,
als man so denkt,
aber es ist auch,
auch fiese Syntax,
also ich habe mir dazu auch schon ein paar Vorträge angeschaut,
und man kann sich auch da wieder leicht in den Fuß schieben.
Ja,
was nicht so ganz intuitiv ist,
dass wenn man so die Bild in Typen nimmt,
ne,
so man sagt irgendwie,
match unknown,
und dann machst du eine Case List,
or Tuple,
und wenn man die dann nicht instanziiert,
mit den Klammern,
dann,
kacke,
weil es always true ist,
weil,
ja,
der Funktion guckt nicht,
guckt auf so eine List,
oder ein Tuple,
das,
genau,
na,
kann man sich auch mit den Fuß schießen,
ja,
ja,
und das mit dem Default,
Default Fall,
auch immer irgendwie,
wenn nichts anderes gefunden wird,
ist auch irgendwie etwas,
was halt in anderen Sprachen anders ist,
und,
ja,
es gibt ja schon so ein paar Falschstricke,
also,
naja,
oder dass man den am besten immer handeln sollte,
genau,
in Python,
dass man,
ja,
aber das ist doch auch nervig,
ja,
gut,
aber nicht,
das,
das,
das ist klassische Programmierung,
dass man immer das else,
für alles,
was man nicht erwartet,
schreibt,
na,
wenn man das else weglassen kann,
dann lässt man es weg,
tja,
ja,
je mehr man weglassen kann,
umso mehr kann man weglassen,
ist dafür besser,
ja,
eigentlich schon,
ja,
und dann,
äh,
ist das Kapitel auch schon vorbei,
dann kommt nur noch hier so ein bisschen,
also else makes the universe explode,
mhm,
also immer,
wenn der else Case einschickt,
dann alles abreißen,
alles vernichten,
mhm,
ne,
gut,
ist das,
ist das der Quantumsort,
ja,
kennt ihr den,
kennt ihr den Quantumsort-Algorithmus,
der ist ein O von 1 Sortier-Algorithmus,
aha,
du machst eine zufällige Permutation von deinem Input,
und wenn sie nicht sortiert ist,
zerstörst du das Universum,
ja,
und das in dem Universum,
in dem sortiert ist,
das bist du immer,
überlebst du immer,
ähm,
Schneller?
Geht nicht mehr.
Also dieses Kapitel macht mehrere interessante
Wendungen und
es schneidet einige
Sachen an, die
interessant sind, die aber so ein bisschen
über Data Classes
hinausgehen.
Ich muss ja sagen...
Macht ihr denn lieber einen Data Class oder lieber einen M2P?
Lieber Data Class.
Ja, ich auch. Lieber Data Class.
Ich weiß jetzt gar nicht so genau, warum.
Ja, weil das ist
gutes Marketing hat.
Man steht auch hier
im Abschnitt Further Reading,
da sind natürlich viele Verweise dann drin
und da steht auch drin hier
bei der PyCon US 2018,
da gibt es einen Talk von Raymond Hettinger,
den auch wir alle schon
gesehen haben und ich gehe davon aus,
dass die Hörer den auch alle gesehen haben, der heißt
Data Classes, the Code Generator to End All
Code Generators.
Und das hört sich ja schon sehr hochdrabend an.
Und ich muss sagen,
ich habe mir den Talk angeguckt
und ich habe danach Data Classes verwendet und das war
gar nicht so beeindruckend.
Ja.
Es ist irgendwie gar nicht so viel,
was einem das macht, was einem das gibt.
Ja, ja.
Deswegen auch direkt...
Man darf da gar nicht so viel
drauf geben.
Da werden viele Worte
darüber gesagt und es wird viel darüber gesprochen,
aber es ist eigentlich was total Simples
und was total Kleines und Nettes
und Einfaches und das, ja,
ja, also es gibt halt so
Anwendungsfälle, da verwende ich es halt sehr gerne für.
Also zum Beispiel eben in so
für, also wenn man jetzt halt so
Event-Driven-Architecture hat, dann
für die Events und Commands, da
sind Data Classes halt super.
Genau. Für
alle Arten von Value-Objects, wo man halt
nichts drauf gibt, was
das denn konkret für ein Objekt ist, wo einem nur der Wert
von irgendwelchen Dingen interessiert,
da ist das total super. Und
für alles andere nehme ich normale Klassen.
Also genau, das ist so mein
Daumenregel für
diesen Kram. Und ja, ich glaube, in allen
Fällen, wo ich Data Class verwende, könnte ich wahrscheinlich auch
einen Tupel verwenden, aber
Ja, aber es ist schon bequemer,
dass man die Namen schreiben kann, das ist schon
das ist schon cool.
Das kannst du bei einem Tupel auch.
Ja, genau, aber dann kannst du nicht ein normales Tupel nehmen.
Nee, nee, aber ein Nehmtupel ist doch schon
Also ich benutze fast keine
Ich würde, glaube ich, fast nie ein normales Tupel nehmen.
Sondern statt einem
normalen Tupel immer ein Nehmtupel, weil
ich gerne den Namen verwende und ich mag Indizesen.
Nicht so. Ja,
ja, okay, ich verwende Tupel sehr häufig.
Ja, ich würde
so implizit
Beim Zurückgeben von irgendwelchen Sachen
ist es halt ja automatisch so.
Aber da benutzt du ja auch den Index nicht, da benutzt du ja Unpacking.
Und dann ist ja schon dieses Tupel so ein bisschen
Da willst du ja dann nicht ein Nehmtupel
verwenden, ja. Ja doch, warum nicht?
Als Returnwert ein Nehmtupel, dann hast du schon Type Annotation
und kannst danach auf die Attribute des Dings wieder
Zugang zu Namen. Ach, viel zu viel Arbeit.
Viel zu viel Arbeit. Einfach zwei Werte
zurückgeben, zack.
Takt, zack, dies und jenes.
Dies und jenes oder vielleicht auch das.
Und dafür wäre ein Match Case wieder gut.
Ja, sorry.
Ja. Ich glaube, wir haben das
besprochen, oder? Dann müssen wir mal Beispiele sehen.
Wollt ihr noch was erzählen? Also, genau.
Was wir noch tun könnten ist irgendwie, wir machen
noch Picks und
ich weiß nicht, ob irgendjemand anders anfangen
möchte? Ja, ja, mach mal.
Okay, also. Das ist doch was Gutes.
Ja, also was ich gerne picken würde
und ja, ich weiß nicht, ob die
so viele Hater haben wir gar nicht,
aber das wäre ein guter Hook
für die Hater. Wir hätten erst einmal einen,
wenn ich mich aktiv verändere.
Und zwar, was mir momentan tatsächlich
richtig viel... Nachts um halb drei mit dem Turnier,
da war ich auch schon vor. Ja, aber
was mir tatsächlich momentan richtig viel Spaß
macht, ist ein Tool von
Anthropic und zwar
heißt das Cloud Code
und das ist quasi so
ein LLM-basierter
Kommandozeilen
Dings-Helferlein.
Ja, genau.
Was ist ein Agent?
Schwierig, aber...
Was ist ein Agent?
Ja, also das Ding ist einfach nur,
es ist halt ein LLM und es
läuft in einer Schleife und macht halt Dinge.
Und das
funktioniert, also ich will jetzt gar nicht
so definieren, was das ist. Und hast du Cluster
einen Rutschgriff auf deinem Rechner gegeben?
Das mache ich nicht, aber
in Projekten, wo ich weiß, wenn das committed ist
oder gepusht, dann kann das halt auch
weggelöscht werden, ist nicht so schlimm.
Ja, gibt ja auch mal ein, zwei Server, da kann es sich austoben.
Ein bisschen Budget dafür.
Ich habe mal gefragt,
also auch Cloud, ob
der ist jetzt eigentlich
mich ersetzt oder ist das,
was ist das so für eine Beziehung?
Muss ich Angst haben
oder augmentiert mich das eher oder sowas?
Und Cloud meinte dann so, hey, ist eher so eine Bromance.
Ja, okay.
Das glaube ich bei dir,
Dominik, das glaube ich bei dir.
I agree.
Die Bromance zwischen dir
und KI.
Aber also,
man kann das nicht gut beschreiben.
Man muss das mal ausprobieren.
Und da ist das eigentlich schon sehr cool.
Also ich benutze das jetzt in letzter Zeit super häufig.
Und das hat mir schon echt viel...
Super häufig ist es untertrieben,
meistens bei Jochen beim Arbeiten zu gucken.
Das ist natürlich so recht die ganze Zeit gut.
Nö, ja, doch, vielleicht.
Och, mach nochmal so.
Ja, aber das ist auch schon wichtig.
Also ich gucke schon drauf drauf.
Also das heißt, das Draufgucken ist das,
was sich von Vibe unterscheidet?
Ist das dann...
Ja, ja, nee, das ist nicht Vibe-Coding.
Also ich nenne das manchmal bosnacherweise Vibe-Coding,
um die Leute zu ärgern, die...
Keine Sorge, aber das ist nicht Vibe-Coding.
Das machst du nicht.
Ja, es gibt ja zwei Menschen,
die sich mit dem Begriff Vibe-Coding so ein bisschen
schwer tun.
Simon zum Beispiel sagt, das wäre gar nicht gut,
weil der Begriff total blöd ist,
weil er davon abdenkt, dass das total anstrengend ist.
Das war mal gut definiert.
Und zwar als Vibe-Coding ist halt dann,
wenn das Ergebnis und der Code egal sind.
Und du halt nur sozusagen
bei...
basierend auf dem Vibe...
Ja, okay, das habe ich abgelesen,
dass der Simon Wilson das nicht mag,
weil jemand anders sein Wort verwendet hat,
was nicht so ist, wie er es haben möchte.
Ist doch auch Old Man, der ist halt Cloud.
Ja, aber er hat schon recht.
Also das war ursprünglich mal so definiert.
Und jetzt benutzen es halt alle irgendwie anders.
Und das ist natürlich schon ein bisschen doof.
Egal, jedes Wort ist halt anders definiert.
Ja, aber es gibt in dem Bereich halt schon so viele Worte,
die halt ihre Bedeutung verloren haben.
Das ist jetzt so...
Ja, okay. Na gut.
Ist auch wurscht, kann man auch nicht mehr zurückholen.
Ja, meinetwegen ist es auch Vibe-Coding.
Aber es ist tatsächlich so,
dass ich damit halt
viele Dinge irgendwie jetzt so machen kann,
die vorher mühselig waren
und jetzt sind sie halt nicht mehr so mühselig.
Und auch quasi das
über Copy-Paste
oder halt über Cursor
oder sonst wie Copilot kann man das ja auch machen.
Das hat auch schon alles ganz gut funktioniert,
aber Cloud-Code ist tatsächlich für mich
nochmal eine deutliche Verbesserung.
Also das macht alles nochmal deutlich angenehmer.
Das ist schon mega gut.
Aber da...
Das möchte ich tatsächlich für alle,
die es noch nicht kennen,
die meisten kennen es wahrscheinlich,
mein Pick machen.
Und zwar ist das tatsächlich,
wie in meinem Ausschuss weiß ich nicht,
N8N.
Ich finde normalerweise so Logo-Sachen
ziemlich schlecht und schwachsinnig und scheiße,
aber das Ding ist erschreckend gut.
In Business-Prozessen direkt anbinden,
an der Postgres, an SAP,
an was auch immer du gerade brauchst.
Und du kannst es hier so zusammenklicken.
Du machst deinen Telegram-Channel dazu
und deinen Discord.
Du hast einen Bot
und ziehst da so zwei Lines irgendwie zusammen
und machst dann noch einen Prompt dahin
und setzt dann da noch eine Nachfrage
für das Ergebnis vom Prompt,
passt das dann in JSON,
kannst einen kleinen Python-Schnippchen reinbauen.
Ja.
Also wenn ich Low-Code mir überlegen würde,
würde ich das wahrscheinlich auch so machen.
Also ich würde sagen,
das ist sehr gefährlich für unsere Profession auch.
Also weil ich kann jetzt jeder Marketier hinsetzen
und sagen, hey, ich bin Coder
und mache dann so einen Business-Prozess,
wo man vorher halt gut bezahlte,
Software-Ingenieure gebraucht hat.
Das ist schon so ein bisschen,
schon nicht schlecht.
Also da sind wir wieder bei dem Pick,
den ich eben schon gespoilert habe,
den der Johannes verraten wollte.
Nee, das ist nicht mein Pick.
Gut, dass das nicht dein Pick war.
Aber das macht es ja schon so ein bisschen.
Das ist, ja,
erzeugt halt viel Zeugs,
viel Code,
den man halt kaputt machen kann
oder halt auch nicht.
Oder ist der kaputt?
Wen braucht man dafür?
Die richtigen Ingenieure?
Wie?
Ohne?
Um das hier zu reparieren?
Oder schafft das dann Cloud Code?
Naja, also für den Anwendungsfall,
dass du halt überhaupt erstmal
irgendwie rausfinden willst,
ob das etwas ist,
was du gebrauchen kannst oder nicht.
Dafür ist das wahrscheinlich nicht so schlecht.
Nein, aber das ist ein Irrtum.
Es geht nicht nur darum,
rauszufinden, was das ist, was du willst.
Weil das ist genau das,
was die, ich sag mal,
mediocre Devs immer schon verkauft haben.
Irgendein Scheiß,
der gerade so aussieht,
als würde er funktionieren,
und nach zweimal Gegenpusten zusammenbricht.
Und das ist kein Unterschied mehr zu dem,
was du dir einfach da viben kannst.
Und das ist das,
mit dem die meisten Leute irgendwie in der Branche
irgendwie ihren Umsatz gemacht haben.
Und das ist jetzt einfach quasi obsolet.
Oder was war ein,
der das so gespürt hat?
Ah, obsolet.
Weiß ich nicht.
Du bist ja immer noch dann abhängig auch da
von dem Service und so.
Also, naja.
Also,
Business Leaders,
unfucketei.
How did you find us?
My therapist recommended you.
Are you very sorry?
Yes, no, fuck you.
Genau.
Ja, also ich muss,
ich stelle mir zu,
dass das halt von den ganzen Dingern,
die es da draußen gibt,
halt tatsächlich irgendwie gut gemacht ist.
Ich persönlich,
für mich hat das nicht so Appeal,
weil ich denke mir so,
ja gut, ich schreibe halt Python.
Das macht für mich jetzt mehr Aufwand.
Kannst du programmieren.
Kannst du programmieren,
ich brauche das nicht.
Sehr gut,
aber so eine Postgres-Schnittstelle
mit zwei Klicks, ne?
Ja, aber,
also,
ist für mich jetzt nicht so ein Aufwand.
ja,
gut,
wir werden sehen.
Vielleicht,
naja,
keine Ahnung.
Mein Pick geht in eine ganz andere Richtung.
Turning Caffeine into Code?
Ich,
ich picke Unregistry.
Ich bin ja ein Docker-Anhänger
und ein Problem,
was man aber hat mit Docker-Containern,
ist,
dass wenn man die lokal gebaut hat,
auf seine Entwicklungsmaschine,
dann muss man die irgendwo hin tun,
damit die deploybar werden.
Also wenn ich die auf meinem Produktionsserver
dann ausrollen möchte,
dann müssen die irgendwo sein.
Docker Hub.
Dieses irgendwo heißt normalerweise Registry.
Ja.
Ja, Docker Hub,
kannst du nehmen,
wenn du Open Source machst
und wenn du keine Geheimnisse,
wenn der alle,
der,
der,
der Sachen offenlegen willst auf der Welt.
Ansonsten ist es eine Artifactory oder so.
Das ist echt scheißvoll.
Artifactory,
Nexus
oder in die Amazon,
in so eine private Registry für Amazon.
Aber,
jetzt gibt es hier ein Projekt,
das heißt Unregistry
und damit kann ich direkt von meiner Maschine
auf die Servermaschine
ein,
ein,
ein Image pushen,
ohne über eine Registry zu gehen.
Aha.
Aha.
Der Trick ist,
also das geht natürlich manuell auch,
ja,
ich kann natürlich manuell diese,
ja,
Docker-Image exportieren
und kann es tippen
und dann per SCP rüberkopieren
und so weiter.
Aber das ist zum einen nervig
und es ist auch langsam,
weil jedes Mal die,
das komplette Image übertragen werden muss
und nicht nur die Schichten,
die man,
die man braucht.
Und das macht Unregistry einfach alles im Hintergrund.
Das heißt,
der Trick ist,
das tut so,
als ob es eine Registry wäre
und wenn du sagst,
hier,
push mal auf den Server,
dann macht es dort einfach kurz eine Registry auf,
dann pushst du da hin
und dann ist es bei dem Server,
dann ist es bei dem Server,
bei dem Produktionsserver
einfach im lokalen,
in den lokalen Images drin.
Und das ist großartig,
weil das macht viele Deployment-Prozesse
einfach super viel einfacher.
Du kannst,
musst dann aber nicht,
History und sowas ist dann halt weg, ne?
Wie meinst du History?
Hast du bei Docker-Containern nie.
Na doch.
Das zu,
hast du die,
jeder Tag,
den du pushst,
ist dort.
Also du hast keine,
kein zentrales Repo mehr.
Ja,
und das ist genau das,
was du möchtest.
Okay.
Wenn du,
wenn du die Sachen aufbewahren möchtest,
dann brauchst du eine Registry,
ja.
Ja,
achso,
achso,
wenn du,
achso,
meinst du History von Images?
Ja.
Ja,
okay,
das,
ja.
Ne,
das ist ja eben unregistered.
Ja,
das hast du jetzt nicht mehr.
Und das will ich auch in ganz vielen Fällen einfach nicht haben.
Ja,
es ist eben meistens so ein Müll im Ballast,
der Strom.
Ich habe immer nur Latest.
Es gibt nur Latest.
Aber wenn du was kaputt gemacht hast,
da musst du ja dann wieder zurück,
ganz schön,
dass du vorwärts gehst.
Ja,
gut,
aber das habe ich dann noch lokal.
Na gut.
YOLO,
YOLO Driven Development.
YOLO Vibe.
Ja,
danke fürs Zuhören.
Das war jetzt das ganze.
Komm zum Hörer-Treffen vorbei
und wir freuen uns auf euch hier.
Wann war das gleich noch?
Ja,
Ende August,
Ende September.
We are discussing that in another episode.
Okay,
okay.
Und machen wir es dann.
Bleibt uns gewogen.
Hallo at peisenpodcast.de.
Dankeschön und bis bald.
Jo.
Macht's gut.
Ciao, ciao.
Ciao, ciao.