Transcript: Platonismus und Python - Data Class Builders
Full episode transcript. Timestamps refer to the audio playback.
Hallo, liebe Hörerinnen und Hörer, willkommen im Python-Podcast, Episode 66.
Heute quatschen wir über das nächste Kapitel im Fluent Python-Buch,
falls euch das interessiert, über Dataclasses und warum das riecht oder nicht,
oder was Cooles 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 die gesagt, wir sollten ein bisschen mehr Struktur 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.
Die haben ja vielleicht auch Erfahrung und so.
Weil wir unseren Podcast an anderen Podcasts machen, als die 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 gar nicht so schlecht.
Ja, das geht schon, aber
ich meine, wir machen das ja nicht so richtig professionell.
Ich wollte gerade sagen, Jochen, möchtest du das jetzt professionell?
Nein, nein, das auch nicht, aber
also zum Beispiel irgendwie ein Ratschlag
war halt so, ja, sagt doch vorher, wenn ihr euch vorstellt,
irgendwie einmal macht das
immer gleich quasi.
Es wäre auch so eine Intro-Melodie
oder so, wäre nicht so schlecht, dann dachte ich schon so,
Gott, Gott, 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,
ob der Ratschlag runtergeht.
Wenn man sich die Kurve anguckt, ist halt so
in allem einen eigenen Jingle.
Immer 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
Akapulco, 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. 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
nochmal 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,
September,
was ist mit August?
Geht nicht gut. Wie gesagt, das ist ein Schulferien.
Wir diskutieren das später aus.
Wir haben auf jeden Fall das Hörer-Entreffen.
Sagt gerne Bescheid, wenn ihr vorbeikommen wollt.
Es ist hier in der Gegend, also hier heißt Rheinland-Düsseldorf.
Wir können ja schon mal sammeln.
Also wenn ihr uns irgendwas an hallo-at-python-podcast.de
schreibt, dann notifizieren wir euch,
sobald wir genaueres wissen.
Und es wird wahrscheinlich draußen
irgendwie...
Draußen gibt es vielleicht was zu essen.
Irgendwie so Dinge.
Ja, okay.
Genau.
Zur anderen Struktur, Jochen.
Wir machen immer News.
Ja, wir machen News. Cool, dann machen wir doch gerade ein bisschen News.
Aber vorgestellt hat sich jetzt keiner, oder?
Der Jochen wollte so schön hinfahren
und jetzt ist keiner eingestiegen.
Jochen, wer bist du denn?
Ihr seid 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 ist vorbei.
Also meine drei Hashtags sind
Python, Eurorack und
Agentic
Vibe-Coding, ja.
Vibe-Coding, genau.
Okay, ihr müsst jetzt alle guten
Hashtags schon weg, meins wären
Python,
Python Podcast,
Ja, Ukulele, Ukulele ist auch
sehr gut, genau.
Ich habe auch noch ein paar andere Instrumente, aber ja.
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 anderen Typen da kenne.
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.
und ihr seid so traurig und beregnet.
Ja, richtig.
Die kennst du übrigens alle aus dem Chaos-Umfeld
so ein bisschen mehr oder weniger auch, oder?
Ja, den Jochen habe ich im Computer-Club kennengelernt.
Also, ja, mich auch.
Meine Hashtags.
Django, Mathematik
und Spiele.
Spiele, richtig.
Absolut korrekt.
Hört man schon am Namen.
Ja.
Nomen est omen.
Ja.
Okay, na gut, dann können wir ja jetzt nahtlos mit den
News einsteigen.
Perfekte Struktur. Sehr gut, sehr gut.
Ich konnte nicht so viel sammeln,
weil ich momentan total im Stress bin.
Also ich bin im Privatstress.
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
an hier Working Draft zum Beispiel
auch ein Podcast aus
nicht nur Düsseldorf. Ich habe auch gehört, also gute Tipps waren
wir sollten mal wieder mehr zusammen
eine Episode aufnehmen. Ja, ich habe gehört.
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
genau, ist bisher noch
nicht so richtig zustande gekommen, aber wir sind
auf jeden Fall da auch noch dran.
Das war so ein Tipp. Besucht euch
auch einfach gegenseitig. Auch ein guter Tipp
war halt, schaut nicht
nur nach so totalen Berühmtheiten
oder so, auch wenn das
auf dem Papier oder so erstmal, wenn man drüber nachdenkt,
gut aussieht.
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.
In der deutschsprachigen Welt gibt es Paltenmenschen.
Genau.
es gibt eigentlich auch genug.
Du sprichst immerhin schon Dutch.
Aber das Problem ist halt
bei Leuten, die zu
bekannt sind, auch, dass man die dann halt
oft schon gehört hat.
Ich weiß nicht,
das ist ja jeder Podcast mit Guido.
Ja, genau.
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.
Nix on the Plane?
Äh, nee.
Ja, den gab's schon, aber...
Ja, das war ein Python-Film.
Nee, das ist so ein...
Python D-Story, irgendwie, ich weiß es nicht, hab ich vergessen.
Irgendwelche Leute machen das immer
und über Even You haben sie zum Beispiel
ein Ding gemacht, das war ziemlich gut, das hab ich gesehen.
Und über andere Leute...
Der Typ wird VJS und
jetzt Rolldown, hab ich gelesen.
Und genau,
das gibt's jetzt auch über Python und
soll wohl auch, also der Trailer
sah auch gut aus und ja, wir wollen mal schauen, wie das so wird.
Genau.
Ja, genau, 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 weil
man kann die ganzen Räumlichkeiten auch für alles mögliche verwenden,
man muss es nur irgendwie anmelden. Und jedes Mal, wenn man
vorbeilief und gerade auf dem Gang, wie man es bei so
Konferenzen macht, kurze Gespräche, kam er vorbei mit
Pssst.
Ja, das soll aber eigentlich nicht so sein, weil
eigentlich hat man dieses
irgendwie, 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
und man sagt, also ich hab dann so
eine Führung damit gemacht und die sagt, naja, nee, 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 Laserentfernungsmesser und 3D-Drucker und VR-Brillen und ein Podcaststudio und ein Ding, wo man Super-8-Filme digitalisieren kann und auch alte Vias digitalisieren kann.
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.
Ich beklage dich gleich!
Ja, gut, hätte man auch
vorher drauf kommen können, aber das muss da wohl
irgendwie erstmal eskalieren und jetzt darf man da nicht mehr singen.
Eigentlich schade, naja.
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. Ja, also wirklich
Geburtstagskids für alle möglichen
Geburtstagspartys und so.
Also wirklich, wirklich. Und man kann
da halt sich hinsetzen und arbeiten. Es sind 600
Arbeitsplätze in dem Ding. Das ist halt auch irgendwie
echt groß. Es ist 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 den 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
und dann...
Tja, das weiß ich,
also 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
oft. Aber ob ich da jetzt
meine Kinder hinlassen würde, ich weiß es nicht so genau.
Ja.
Es ist, ja, egal.
Aber, also, wie gesagt, ich wusste gar nicht, dass es so einen Ort gibt
und dass man da so coole Sachen machen kann.
Da gibt es auch Bücher über Peißen, Jochen.
Ja, da gibt es Bücher.
Ja, da werde ich mir nicht...
Aber es gibt eine Fernleihe, über die man halt
eine Menge kriegt. 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.
Wir gehen auch mal zu unserer Stadtteilbibliothek.
Und man kann die Bücher auch überall zurückgeben und so.
Also ich war überrascht.
Oder Tonis ausleihen.
Das auch, ja.
Ja, genau.
Da hat das Ganze irgendwie stattgefunden.
Wir haben ein paar tolle Tipps bekommen
für Marketing und was man nicht alles machen soll.
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 hab's 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
muss das schon irgendwie machen.
Ja, man gewinnt halt
einen Hörerkreis auf YouTube, oder? Also
die Leute, die YouTube gucken, die
Ja, und gar nicht mal
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 oder auf der Website gucken.
Das ist halt total steil, Johannes.
Und da stehen die Fans hinterher auch vor deiner Tür
und klopfen heimlich.
Die Groupies.
Ja, also,
oder was mich auch... 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 Podcasts, aber
wir wollten auch bald nochmal wieder bei
so Data Science-Kram reden und dann auch nochmal
über
die ganzen neuen KI-Sachen. Darf ich
KI sagen? Ich weiß nicht. MCPs und so.
Ja, ich glaube, man darf was schon sagen. KI, musst du sagen.
KI, oh.
Achso, 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 Jet 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.
Es ist jetzt kein repräsentativer
Querschnitt durch die Gesellschaft.
Aber
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 es sich nicht von einem LLM vorkauen lässt.
Ja gut, das ist ja 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, benutzt.
Wenn man nicht diese KI-Zusammenfassung benutzt,
ist die Retention wohl deutlich besser.
Und das Interessante ist eigentlich,
dass diese Studie so durch die Neuigkeit geht.
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 es doch nicht so gut für uns.
Ja, aber ist das nicht immer eine Neuigkeit?
Ich meine, 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 dem Kissen und Kulturpessimismus kommt halt immer gut an.
Das ist halt immer eine Schlagzeile. Ja, aber Jochen, wir sind jetzt
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.
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.
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.
Dieses Vertrauen ist da halt schon sehr groß.
Ich habe heute zweimal gehört, ich habe
Chat-Spotty gefragt, mir dann meine Schule ausgesucht
und ja, das wird da als
Suchersatz benutzt. Also ganz klassisch
so. Ja, finde ich ganz toll. Also 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üfen musste.
Gut, das mit der Medienkompetenz ist
halt ein Problem, aber das war auch schon immer ein Problem.
Ich meine, ich erinnere mich noch, als Internet und Google
neu waren. Hast du nicht dem Marksteiger geglaubt,
dass er gerufen hat? Oder das Fernsehen, genau.
Als das Fernsehen neu war, auch
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,
also es ist ein
wiederkehrendes Muster.
Bei Plato gibt es das schon, der wettert
gegen die Schrift. Und der Schaffal der Jugend, sowieso.
Ja, also
ich würde mal einfach sagen,
wenn man kann, so, Plato
hat nicht recht gehabt.
Und das mit der Schrift war schon Fortschritt.
Und das wird ihn jetzt aber ganz schön atzen.
Ja, aber ich glaube, du bist ein Fan,
Jochen. Ja, auf der anderen
Seite natürlich schon, bin auch irgendwo
ein Plato-Fanboy, das ist richtig, ja.
Ja, das können wir in der MCP-Folge noch mal
genauer auslassen. Ja, wobei, du hattest ja ein Hashtag
Mathematik, da habe ich 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, 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 und... Ja, man schreibt schon
Code, aber hinterher sagt er einem dann das.
Genau, kann der Compiler, der Compiler zählt nicht zu den beiden Readers,
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 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
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 checken, ob das halt so halbwegs 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 Lemmas, 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 das, was es gibt so an Mathematik
einmal komplett
durchformalisiert zu haben
und dass man es halt auch noch suchen kann, dass man mal sagen kann,
okay, ich habe jetzt dieses Problem, welche
Lemmas könnten mir da helfen oder welche Tricks
gibt es, siehst du denn in den Dingen, die
alle bewiesen sind, die man jetzt verwenden könnte und dann
kann einem auch ein LLM da vielleicht helfen.
Ja, also fand ich
auf jeden Fall. Ja, gewusst wie, aber man muss ja eigentlich
on top von den Dingen stehen oder nicht
nach neuer Information suchen,
sondern auch 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.
Ja, aber
es ist 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 und das
Wo ist so ein Paper? Das gab es ja
sonst so in der Physik mit tausend Autoren
und in der Mathematik eigentlich nicht.
Ja, ist spannend.
Kennt ihr das Chicken Paper?
Nee, was ist das?
Chicken, Chicken, Chicken, Chicken, Duck Tonka.
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.
Habe ich am Montag gehört. Danke, Sascha.
Ja, jedenfalls, genau.
In dem Podcast habe ich auch, also ich bin ja auch
so ein... Das ist ein offiziell
peer-reviewtes Paper.
Da kommen ziemlich viele
Hühner drin vor. Ja, genau.
Eigentlich nur Hühner.
Ja, alles Ding.
Ist auf jeden Fall
eine sehr spitze Zielgruppe.
Genau, also was
der, also ich würde ja sagen,
Also bisher war ich immer in dem, es gibt ja im Grunde zwei Lager, was Theorie der Mathematik angeht.
Es gibt halt so die Platoniker irgendwie, also das ist eine der wenigen Gebiete, wo halt 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 alle checken kann, aber
checkt, ob da irgendwas interessant, äh, ob das
wahr ist erstmal, ob das richtig ist und dann,
ob irgendwas Interessantes dabei rausgekommen ist und dann manchmal
fällt da irgendwas Interessantes dabei 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's 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
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?
Jetzt musst du das auch richtig zusammenkriegen.
Jetzt muss ich es zusammenkriegen, verdammt.
Mathematik war besonders
einfach.
Genau, achso, ja richtig,
das ging ungefähr so, der sagte halt,
naja, also es gibt ja so Zahlen wie Pi, wir hatten es glaube ich auch
mal im 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
wirklich zufällig ist oder nicht, oder ob nicht doch irgendeine
Conspiracy da drin,
Verschwörung ist, die halt
doch nicht zufällig sein lässt
oder so, das weiß halt keiner und man hat auch keine Idee,
wenn man das rauskriegen kann. Aber er sagt,
eigentlich ist es ja ganz einfach, also natürlich
wahrscheinlich, was man erwarten würde, ist, dass es
zufällig ist, weil
man kann relativ einfach
beweisen, dass
quasi die allermeisten realen 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. Aber das ist was ganz Schlimmes.
Das ist ein ganz schlimmes Argument, Jochen, weil
jetzt kommst du
auf einen ganz schlimmen Punkt in der Mathematik.
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, das sind so
völlig doofe Zahlen wie Pi. Und das sind
die allermeisten und wir kennen vielleicht
drei davon.
Aber es sind die allermeisten.
Ja, und das finde ich
sehr unangenehm. Genau.
Und Vorstellung. Da gibt es ja dann dieses
Bild von den, das hat ja bestimmt auch schon jeder mal gehört,
von den, diese
Infinite Monkeys, so relativ viele Affen,
wenn die nur lange genug irgendwie auf ihre
Schreibmaschinen eindreschen, dann
kommt dabei auch mal Shakespeare raus oder so.
Jede von diesen Zahlen muss alle Werke von
Shakespeare in der richtigen Reihenfolge
und so enthalten werden. Alle urheberrechtlich geschützt.
Wenn die 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 die...
Ja gut, aber das geht ja weg, Johan.
Da musst du nur sagen, das Universum ist quantifiziert
und schon existieren diese Zahlen nicht mehr.
Ja, aber das, gut, okay,
Universum, sehr weit gefasst jetzt nicht
als physikalisches Universum,
Mathematisches Universum eingeschlossen,
wo alle mathematischen Objekte auch drin sind,
inklusive Pi und so.
Aber jetzt ist es doch jetzt zirkulär.
Zirkulär?
Aber jetzt ist es zirkulär.
Ja.
Du sagst, es existiert, weil wir annehmen,
dass das Universum, in dem wir drin sind,
das Universum ist, in dem die existieren.
Nee, nee, ich würde sagen,
ich meine jetzt nicht das physikalische Universum,
sondern ganz weit gefasst,
Also auch
die Welt, in der halt auch
mathematische Objekte existieren,
da ist halt alle, 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 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
da sitzt 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.
Überall gibt es sowas wie Gravitation.
Brauchst du nicht mal. 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. Ist aber Mathematik
keine Gravitation? Weil Geometrie immer gleich ist.
Nee, brauchst du nicht.
Nee, das hat nichts mit Physik zu tun.
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.
Ach so, okay. Die gibt es nur,
weil wir so denken.
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? Dieses Zitat,
die natürlichen Zahlen
sind von Gott gegeben.
Menschenwerke, ja.
Aber da gibt es eine Grenze.
Sind die komplexen Zahlen, sind die schon ausgedacht?
Ja, ne.
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?
Wobei die Monstergruppe
ein schlechtes Beispiel ist.
Jetzt musst du kurz erklären, was denn die Monstergruppe ist, also wenn du nicht uns drei
meinst.
Es gibt so eine Klassifizierung von Gruppen
und in vielen Bereichen
der Mathematik ist es so, dass du fünf
sehr schöne Beispiele findest.
Da gibt es die natürlichen
Zahlen und die
ganzen Zahlen und dann
die könntest 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.
Das ist ein schlechtes Beispiel, weil die fällt halt aus diesen Klassifizierungen raus. Aber ganz viele von diesen Dingen, finde ich, sind schon eindeutig ausgedacht. Die sind so, weil wir die Definitionen so gewählt haben und daraus fallen die Sachen raus. Aber ja, das ist eine schwierige Frage.
Ja, aber ich würde auch eben, wenn man sagt, 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 Werk hat 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, aber ich finde das halt schon irgendwie, damit könnte man schon was 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, was.
Zeit vielleicht?
Ich komme halt nicht, kann sein, dass es es gibt, aber ich komme halt nicht dran.
Aber wenn das mit Zeit nützen kann,
könnte das ja vielleicht gehen, weil in der Zeit könnte es ja noch eine andere
Dimension versteckt haben, die dann
nicht nur linear in der Architektur geht.
Ja, aber das bringt nichts, weil das ist ja nicht unendlich.
Stipsen 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 Meta-Abkürzung.
Ja, keine Ahnung.
Müssen wir vielleicht auch irgendjemanden fragen, der da mal...
Keine Ahnung, das waren so meine Gedanken.
Ja, vielleicht finden wir ja einen
Mathematiker, der
was weiß.
Ja, das ist auch
vielleicht eher in der Mathematik esoterisch.
Ja,
nee, aber solche Diskussionen sind in der Mathematik
schon,
die kommen immer wieder, gerade in den
früheren Semestern. Sobald man mal ins
Grundstudium abgeschlossen
hat, dann, ja,
hat man es akzeptiert. Das ist
die Mathematik, die gibt es halt.
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 du musst
alles untersuchen. Warum
untersuchst du das hier nicht? Und dann habe ich ihm bewiesen,
wenn ich das untersuche oder wenn ich diese Annahme
treffe, dann führt das zu Paradoxa.
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 das aber eine Sinneserfahrung
ist und du musst alle Sinneserfahrungen
versuchen, als Wissenschaftler
musst du alles akzeptieren.
Das ist aber nicht so, sondern
als Mathematiker geht man da pragmatischer vor
und sagt, ja, aber 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
in die Glocke, in die Mitte gesetzt wird.
Ja, Mathematik und Sinneserfahrung.
Ja, das hat keine riesige
Überschneidungsmenge.
Genau, der Versuch quasi von den Sinneserfahrungen
zu abstrahieren.
Mit den eigenen Sinnen.
Was natürlich schwierig ist, klar.
Ja, sagen wir mal zu den
praktischen Dingen.
Ich habe auch ein News-Ding.
Ja, genau.
Jetzt können wir das sagen, jetzt haben wir die ganzen
Leute vergrault irgendwie mit
unseren letzten
drei Zuhörern.
Trauen wir das jetzt auch noch zu?
Du wolltest doch nicht irgendwas sagen, du hast
ein Learnings vom Barcamp, was man nicht machen soll.
Achso, jetzt ist der Film wieder eingeweiht.
Wir machen es aber gnadenlos egal.
Und zwar, wir machen gleich noch was über MCP.
Oder ich kann dazu was erzählen?
Nein.
Machen wir nicht?
Nein.
Ey!
Wir machen eine eigene Folge zu MCP.
Wir machen eine eigene Folge zu MCP?
Ja.
Okay, na gut.
Also ich finde ja, MCP ist das Master Control Program.
Genau, das fand ich auch.
Ich habe da Vortragsvorteile.
Oder Metoclub Ramit, je nachdem, wie man möchte.
Na gut, dann machen wir das heute eben nicht.
Aber das müssen wir echt dann bald machen,
sonst weiß ich das alles nicht mehr, ich weiß das jetzt gerade.
Mit dem Jochen unter den Nägeln.
Ja, Mathematical Compute.
Liebe Hörer, schreibt uns an hello
at python-podcast.de, ob ihr
diese Folge dringend hören wollt oder nicht.
Ja, okay.
Meinst du, jetzt hört noch jemand zu?
Aber 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 ursprüngliche Entwickler von ChatGPG ist halt auch dabei,
John Schulmann und ein paar andere Größen.
Also ich meine, die ganzen ursprünglichen Leute
sind ja alle nicht mehr bei OpenAI.
Und na ja, also das ist halt völlig irre.
Die haben kein Produkt, nichts und kriegen halt so viel Geld.
Das ist echt Wahnsinn.
Aber wenn man sich für MCP interessiert,
der aktuell beste Podcast, den man hören kann,
eine Podcast-Episode, ist tatsächlich irgendwie von einem Partner
auch von diesem Venture Capital Fonds
von einer Partnerin
mit Interview mit
David Soria Parra
oder ich weiß gar nicht, wie man das ausspricht.
Einer der beiden ist, die sich das
ausgedacht haben und das ist irgendwie echt ganz nett.
Ja, also
aber dieser ganze Bereich ist momentan völlig
irre. Das erinnert mich echt sehr stark
an diese ganze DotCamp
Bubble Ende der 90er
und es ist irre.
Ja, naja.
Genau.
Aber dann machen wir das nochmal in einer anderen Episode.
Okay.
Ja, dann ist es endgültig
Zeit für den
Unfucked.ai.
Jetzt kommt aber ein radikaler Wechsel. Achtung, jetzt kommt ein radikaler Bruch.
Data Class Builders.
Ah, okay.
Weil wir ja bei Unfucked.ai sind, das wollte ich noch einmal kurz
erwähnt haben, das hat Johannes eben geschickt.
Das war schön.
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 es sehr gemischt beim Lesen.
Ich fand, es ist so ein bisschen, es meandert so ein bisschen
und bringt dann so ein paar Themen einfach noch so mit rein.
Sollen wir erst über das Ende reden, warum das ein Kurzmeld ist
oder warum das keiner ist?
Ja, ich stimme dem überhaupt gar nicht zu.
Was ist denn das Argument?
Warum sollte das denn ein Kurzmeld sein?
Sag du doch mal, Dominik, du findest, das ist ein Kurzmeld.
Das habe ich nicht gesagt.
Also vielleicht geht es erstmal um, was es im Kapitel
geht. Es geht darum, wie man
Datenobjekte
einfach,
welche Instanz hier ist vielleicht falsch,
deklariert.
Also mit Data Class oder Named Tuple.
Eine Klasse, die nur Daten hält und keine Funktionen hat.
Wie so ein Named Tuple?
Ja, zum Beispiel. Das ist eine, also gleich auf der
ersten Seite sind drei Mechanismen
genannt. Oder auch wie ein TypeDict Johannes.
Named Tuple. Ne,
das nicht. Kommt direkt auf der zweiten
Seite, steht direkt drauf, das nicht.
Also es gibt Collections.NameTupel, das ist schon lange in der Python-Schneider-Bibliothek seit 2.6, haben sicherlich viele schon mal gesehen, können wir gleich noch erklären, was das ist. Dann gibt es eine neue Variante davon, Typing.NameTupel und der heißeste Scheiß ist natürlich DataClasses.DataClass, ein Dekorator, der diese ganzen Sachen mitnehmen soll.
Am Ende geht es 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 in sehr großen Anführungszeichen, dieses Wort Einzige, das Einzige, was man gewinnt, ist, dass das Programm besser verständlich wird.
Ruff lintet zum Beispiel
vom Typing-Import-Name-Tupel
und sagt, naja, es ist Collections-Name-Tupel, bitte.
Darfst du nicht.
Ja, sagen die das?
Ich bin so ein bisschen, ich bin nicht
ganz hundertprozentig mal einverstanden mit den
Sachen, die Ruff sagt. Und ich habe heute auch einen Ruff-Cycle
gefunden.
Wo ich einen Hinweis
gekriegt habe von Ruff, der gesagt hat,
der Generator ist unwichtig,
ist nicht wichtig, mach bitte eine Dict-Comprehension
draus. Dann habe ich eine Dict-Comprehension draus gemacht.
Dann hat er gesagt, ah, das ist eine unnütze Dict-Comprehension,
mach bitte einen Dikt-Aufruf mit Generator drin draus.
Sehr amüsiert.
Wie man es macht, ist falsch.
Ruff ist ja schon so ein bisschen opinionated.
Also nicht alles, was da von Ruff kommt, ist ganz richtig.
Und es gibt schon einen wichtigen Unterschied
zwischen Named Tuple und Named Tuple,
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 an diesem Kapitel mehrmals darauf hingewiesen,
dass namhafte Personen
Data Classes durchaus als Code Smell 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 drin stehen.
Weil es nur
ein Vehikel ist und das wäre blöd?
Weil du
mit Daten halt irgendwas machen musst.
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.
Das hört sich
für mich sehr nach, also
ich meine diese Namen, die immer da
gesagt bekommt, Martin, Fowler und Kent Beck,
es hört sich für mich sehr nach
Kingdom of the Nouns an, es hört sich für mich
sehr nach Java an, es hört sich für mich sehr an nach
der Code ist wichtiger als
die Daten. Und das stimmt halt 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 in ganz vielen
Anwendungsfällen, zumindest in denen, die mir so
begegnen, viel wichtiger als
dann, dass die
Funktion direkt dabei steht und dass
du die direkt dazu packst.
Das ist der eine Aspekt.
Du gibst der Funktionalität
mehr Gewicht als den Daten und das
ist oft nicht der Fall.
Da könnte man dann, mir fällt das Zitat
jetzt nicht ein, aber da gibt es eines von
Linus Torvalds, wo er sagt, naja, 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 sollen
und dann ist das 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 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 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
genau, aber
wenn es halt State hat und
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 zweiten
Aspekt, der mir
da fehlt in
dieser Argumentation.
Der geht so ein bisschen in das, was du eben gesagt hast, die Leute, die
sich noch nicht gesehen haben.
Wenn man über Klassen
nachdenkt und
die sieht als
eine Anzahl von
Funktionen und ein paar Daten dazu,
dann ist das ein anderer Blick auf das, was man tut.
Es ist ein anderer Blick auf das Programm
und was ein Programm kann.
Und zwar ist es ein Blick auf einzelne Objekte.
Weil wenn ich so eine Klasse schreibe,
also in Python gibt es den Self-Parameter,
in anderen Sprachen heißt der This-Parameter,
dann gibt es 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 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 dann ist auf einmal gar nicht mehr das Einzelobjekt wichtig, sondern dann ist auf einmal die Gesamtheit der Objekte wichtig.
Was ist denn, wenn ich eine Million von diesen Geldbeträgen bekomme, was kann ich denn dann damit machen? Und diese Art zu denken oder auch diese Art zu modellieren ist 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 hast du diesen Blick auf die eine Instanz. Und 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 Codesmell ist, weil du
nur diesen einen Blick auf Programmierung
haben darfst.
Und deshalb, ich bin
da sehr skeptisch, 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,
dann zu Pedantic überzugehen,
was ja fast sowas ist wie eine Dataklasse,
mit sowas wie
Validierung dran dann noch
oder so. Ja, aber auch
das ist noch, Pedantic
sind natürlich, ja, sind schon
Dataklasses 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 aktueller, also das Buch ist ja relativ aktuell, aber gerade so der auf, sozusagen das, Pydentic, ja genau, beschränkt sich mehr so auf die Standard, aber wobei ja auch das Vorbild von Dataclasses in der Standardlib ist Atris, ist halt auch nicht, ja, Hynix sollte man vielleicht mal fragen.
Es wird auch ein Band am Ende, aber mehr so als Further Reading.
Ja, genau, aber sozusagen Pydentic ist ja danach erst so richtig populär geworden, würde ich sagen, oder jetzt auch noch neuer Message-Spec, gibt's ja auch, ist ja vielleicht noch mal schneller und keine Ahnung, aber da muss man vorsichtig sein, also ich glaube, da vermischt man dann, also Pydentic, es ist natürlich auch praktisch, aber es vermischt halt zwei so Sachen, einmal diese Klassenbilder-Geschichte mit den Adnotationen, damit man halt sozusagen, ja, das halt kompakt hinschreiben kann, was man da für Attribute dran hat.
Das ist bei Pydentic ja genauso.
Und dann gibt es halt diesen Validierungsteil,
der ist aber irgendwie anders,
weil das hast du halt in Dataclasses
und halt bei NameTupel oder so eigentlich nicht.
Auch mal bei Typing.NameTupel 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
Der Vortrag heißt Design Pressure
Aber ist das nicht
Hinek Schlaback? Genau
Der ist doch auch Deutscher, oder?
Ja, genau, den sollte man auch echt mal fragen, weil
der hat immer tolle
Artikel zu diesen ganzen
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 abfallen.
Wer weiß. Mal schauen.
Ja, genau. Und
ja, eigentlich ist das ein Vortrag über Software-Architektur.
Der hat ja, 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 Software-Architektur gehalten.
Und das ist auch wieder so einer.
Und der startet mit dem
Hot-Take irgendwie so Dinge wie
Identik oder irgendwie diese Geschichten
Data-Validation-Dinger,
das macht eure Architektur
von eurem Programm kaputt.
Ihr Trottel!
So, und 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.
You want to believe what happens next. Genau, genau.
Und wenn man das halt schafft, dann ist gut und wenn man
es nicht schafft, ist halt doof, aber mal schauen.
Und ja,
also da
und ich, aber ich würde sagen, im Grunde
hat er da ganz recht, ja, also ich meine, wenn man
jetzt das so macht, dass man
ein paar Identik-Modelle
verwendet, halt als
Data-Classes-Ersatz und die dann
halt quasi benutzt, um die eigene
Domain, ich weiß 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 modifiziert, 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 Pidentic, also
ist auch ein sehr cooles Projekt, aber
man muss halt echt aufpassen, dass man da
nicht, also
wenn man damit auf
irgendein Problem zielt, dann hat
der Pidentic-Lauf auch immer so die Tendenz,
so weich zu werden und so auf den eigenen Fuß runter
zu neigen und
wenn man 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 anstelle einer Dataclass halt ein Pidentic-Modell verwendest.
Warum ist das blöd?
Naja, weil du dann zum Beispiel Pidentic importierst in deiner Business-Logik.
Und dann bist du davon abhängig?
Ja, genau. Du hast halt dann diese Konzerns irgendwie miteinander vermischt.
Und dann kriegst du alle möglichen Arten von üblen Design-Problemen, Architektur-Problemen.
Ähm, genau.
Ja. Welche?
Naja, äh, also
zum Beispiel, wenn das dann halt jetzt nicht
äh, schnell genug ist
und du willst jetzt was anderes, eine schnellere Art
irgendwie die Sachen zu, weil du hast das
jetzt gekoppelt an, du spreifst das als JSON
raus und liest JSON rein und so,
was ja Pidentic auch ganz gut kann,
und jetzt stellst du halt fest so, oh,
oder gibst das über eine API raus,
und jetzt stellst du halt fest so, 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 da 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
man hält von den Django,
Models Model erbt, 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 gegen ein Win.
Sollen wir mal zurückkommen zum Buch?
Ich glaube, da sind tatsächlich noch ein paar interessante Sachen drin.
Diese, es werden ja hier
drei Alternativen genannt.
Also Collections.NameTupel,
TypingNameTupel und DataClass.
Und warum nicht
TypeDict?
Ja, das ist tatsächlich hier,
da lese ich, ich zitiere,
TypeDict may seem like another DataClass-Builder.
Ja, das ist es nicht. However, TypeDict does not
build concrete classes that you can instantiate.
Genau, es ist in Kapitel 25
oder sowas, geht ja nochmal drauf ein.
Genau, also das macht nicht solche
Klassen, wie wir sie hier brauchen, sondern
das ist nur... TypeAnnotations für Dicts
aber es funktioniert anders.
Genau, und es ist eine böse Falle.
Ich weiß nicht, wie oft ich das schon gesehen habe,
dass Leute denken, dass sie dann sicher werden,
aber nie MyPy oder sowas ausführen.
Und dann, wenn man es dann mal ausführt,
kriegt man halt gesagt,
das, was du da machst mit den Type-Ticks,
das ist bei 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 getyped hinted? Ja,
entweder getypt oder auch nicht getypt. Musst du ja 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 ein Tuple wäre jetzt immutable,
dann muss ich ein Frozen machen bei der Data-Klasse.
Genau, aber das hat mit den Types nichts zu tun.
Du kannst auch, also auch das Typing.name-Tuple
kann ja andere Sachen nehmen.
Das ist ja erst mal nur eine Absichtserklärung.
Ich beabsichtige, dass dieses Attribut nur ein Int sein kann,
aber da hält dich niemand davon ab.
Kannst auch eine Letzte reinmachen.
Das ist ja 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 Name-Tupel kommt,
wo man halt sagt, ich möchte einen Name-Tupel haben
und dann rufe ich die Funktion oder rufe ich den Konstruktor Name-Tupel
als Konstruktor auf und sage eben, diese Datenklasse soll den Namen,
hier haben Sie das Beispiel Coordinate 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 und 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 Tupel.
Und das ist nicht,
und die verbrauchen auch nicht mehr Speicher. Also diese
Namen werden nicht bei jeder Instanz
dazu gespeichert. Das ist nicht wie bei einem
Dictionary, sondern es ist eben ein
Tupel. Und im Endeffekt ist es ein Tupel mit
so einem 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 tatsächlich.
Also lange Zeit war NameTupel
auch irgendwie deutlich schneller, also wobei
nichts ist so schnell wie tatsächlich einfach
quasi, wenn man eine Klasse
instanziiert, aber NameTupel 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
NameTupel natürlich schneller.
Also irgendwas, Instance, Punkt,
irgendein Attribut, weil
Tupel-Index.
Und inzwischen macht er aber Dataclasses
und auch, glaube ich,
nennt Tupel, wenn man davon erbt, per Default
irgendwie Slots. Aber vielleicht erzähle ich jetzt auch Unsinn.
Das müsste, muss man irgendjemand 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
Jagdnig-Fall. Das ist so eine Angst,
die ich in meinem Kopf habe, die aber eigentlich
in dem Moment noch nicht berechtigt ist.
Eine große API-Response
ist, oder wo du Zeugs
reinkriegst, weil da kann das schon
so bei, wenn du so halt irgendwie 10.000
Dinger in Objekte verwandelst und
dann ist halt dein Objekt erzeugt gemeinsam.
Wenn da Jason reinkommt, hast du ja eh schon verloren.
Ja, aber es gibt ja schnelle Jason-Parser, aber
du musst es ja nochmal zu Objekten machen.
Aber du kriegst ja auch 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 ein Name-Tupel 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
falsch, ein Name-Tupel zu machen.
Ja, aber was meinst du, es 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,
nur dass du nicht jetzt Data-Klassen importierst.
Genau, das kannst du machen. Das sieht auch normal aus.
Das ist auch was, was ich empfehlen würde.
Das
das Ganze machen, aber dieser Konstruktor,
der Named-Tubel-Konstruktor, also das ist
tatsächlich alles klein geschrieben und dann musst du da
Strings reingeben.
Ja, das ist schon...
Was daran auch komisch ist halt,
also einmal, ich finde es auch ehrlich gesagt ein bisschen hässlich,
ich meine, 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
Interpreterversionen rumguckt, aber
genau, das funktioniert wahrscheinlich bis,
also da gibt es nichts mehr, was noch läuft, was irgendwie
älter ist. Das funktioniert wirklich
überall, aber also was halt auch
blöd ist, ist, dass es halt, es geht zwar auch,
dass man da Methoden dranhängt, aber das ist auch voll umständlich.
Da muss man halt auch erstmal
die Funktionen anzeugen und dann muss man
das Ding irgendwie da dranhängen und so. 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 Codecoil
spielt oder sowas, dann ist das eine Disziplin, die man so spielen kann.
Und wer Leute verwirren will oder
so ein bisschen Obfuscation, ne?
Nee, nee, nee, das ist nicht gut.
Nee, dann gehen wir über zu Typing-Name-Tupel,
weil Typing-Name-Tupel hat nämlich Klassen-Syntax.
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, jetzt, wo ich es gelesen habe.
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 die soll folgende Attribute haben.
Und das ist hier genauso, weil die Klassen-Syntax halt so ist,
dass ich sage, Class, dann den Klassennamen,
abgeleitet von Name-Touple,
was aber so ein bisschen
nicht ganz
richtig ist. Weil die MRO da gar nicht
drin ist, weil das nur in Meta-Klasse ist, weil da
nämlich gar nicht tatsächlich Name-Touple entsteht, sondern
ein richtiges Toupe. Genau. Und dann
innerhalb von der Klasse gebe ich einfach
die 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 Hauptanwendungsbereich.
Du möchtest jetzt nicht irgendwie eine Klasse schreiben,
wo du reinschreibst in init, nimm folgende
Argumente, latitude und longitude und dann machst du
save, 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 Meta-Klassen-Magie.
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 Delta Classes
ist ja im Grunde genommen
das Gleiche, dass du so eine gewisse
du sagst, welche Klassennamen du
haben möchtest, welche Attribute du haben möchtest, welchen Typ
du haben möchtest. Und da ist natürlich
leicht, weitere Methoden hinzuzufügen.
Die schreibst du einfach in den Klassenkörper rein.
Ja, das mache ich auch.
Das geht ja eigentlich schon häufig im Delta Class.
Aber ich mache das tatsächlich relativ häufig, dass wenn irgendwie
auffällt, ah, ich hätte noch gerne keinen und doch das Maximum
und die Summe berechnet von irgendwas.
Das war schon super praktisch.
Ja, natürlich, das ist auch wichtig.
Das ist ja dann das, was hier
der Onkel Bob würde sagen,
das ist gut, bist du auf dem richtigen Weg.
I just implemented that last night.
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 das ist ja eine Meta-Klasse.
Ja.
Was ist denn jetzt so eine Meta-Klasse?
Eine Meta-Klasse?
Welches Kapitel ist das?
Das ist weiter hinten, glaube ich.
Da machen wir noch ein bisschen.
Es sind Komplimente von Dynamic, Attribute
and Property. Wir verschieben das.
Das Metaprogramm ist Kapitel 24.
Ja, also Kapitel 24.
Also nur noch 19 weitere
Episoden und schon sind wir über das Buch
Fluren passen.
Dazwischen natürlich noch die
anderen. Okay, aber
dann, dieses Kapitel macht ja jetzt
hier eine total interessante Biege,
weil das nächste
ist ja jetzt, ah übrigens, wir müssen
Type-Ins 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 hatte ich,
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 Match-Case benutzt. Und das liegt auch daran,
dass das... Ja, aber das ist dann der dritte,
das ist der nächste Twist. Achso.
Ja, das wurde ja gerade erst eingeführt, als das Buch rauskam.
Ich glaube, deswegen ist da so die Emphasis so ein bisschen
tiefer. Ja, vielleicht war es
auch nicht genügend für ein, ups, jetzt geht hier
mein Aufnahmekomputer geht gerade aus,
die,
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,
das, das, habe mir ja die Inhaltsangabe
hier die Sachen durchgelesen,
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 noch mal,
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
Class-Bildern funktioniert, dass man halt
über die
Typ-Annotation 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,
dann muss man ja irgendwie andere
Annotations irgendwie erwähnen und dann
ist man ja mittendrin in den Annotationen.
Ja, das
man muss da so ein bisschen in den Wald reinlaufen
und sich so ein bisschen drin verlaufen, ja. Also
ich verstehe es schon, aber es war irgendwie
was, hatte ich nicht erwartet.
Und da kommt
auch das eine Problem raus mit den Data Classes.
Also wenn ich so eine Data Class schreibe, dann
habe ich ja diesen Dekorator vorne dran, Data Class.
Dataclass ist dort Dataclass, dann
schreibe ich Class den Klassennamen, also
in dem Fall jetzt hier ClassCoordinate
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 da 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 erst mal
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, dass das
In anderen Sprachen ist das 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. Also 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
Gesetz?
Ja, also wenn das eine Klasse ist, zum Beispiel
sagst 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,
dann... Oh, das ist jetzt aber
ganz hässlich, was du jetzt machst.
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
oder, ne? Dann hast du
einen Cache für alle Instanzen
dieser Klasse. Dann kannst du damit merken, alle
Errors, die aufgetreten sind, ever oder sowas.
Ja, also das hat durchaus Gründe,
weshalb man sowas haben will.
Ist ganz gut, aber damit kann man sich
hart infusieren. 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. Ja, und
Und generell Klassen, also ich mache oft 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.
Ja, und das ist schon, das ist wirklich was sehr Subtiles 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 Instanzeigenschaften rein, die Instanzattribute.
Wobei dir 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, das kannst du aber nicht machen, du musst ja irgendwie
dann Default
wie heißt das Ding?
Field? Ja, eine Factory musst du rein.
Factory angeben, genau.
Aber da kommt es natürlich rum.
Es gibt 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 es
Special Cased, weil
die so häufig vorkommen.
Genau. Ja, also das ist gefährlich, das
stimmt. Das ist,
ich weiß auch nicht, wie ihr das so macht.
normalerweise, also sicher,
auch wenn man jetzt Konstrukturen hat von
normalen Klassen, da ist es ja auch
gefährlich, wenn man da irgendwie
zum Beispiel sagt, annotiert, das ist
jetzt eine 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.
Also ich mache immer listor none
gleich none.
Das ist das Pattern, das muss man sich einfach
merken. Das ist ein doofes Pattern, aber man muss es sich
einfach merken. Aber das ist ja auch
nicht so schön, weil einmal
ist dann deine Typ-Annotation halt
so ein bisschen, also einmal ist sie halt hässlich,
würde ich jetzt mal so sagen, mit diesem
pipe none, das ist halt
schon so, uh.
Es gibt doch diesen schönen unknown-typed
hin. Der kannst du auch optional nehmen, ist auch hässlich.
Unknown gibt es da noch
dazu? Ja, aber Anna und
U, da ist ja schon, wer kennt denn das?
Annie. Ja, U.
Oder Annie. Es gab noch
einen dritten Type, der da so ein bisschen spezieller war,
dass das klar ist, dass das irgendwann in der Liste hängen könnte.
Also, was ich an der Stelle mache,
also mir gefällt das alles nicht. Also,
okay, Leute machen das, aber ich finde auch,
es funktioniert nicht richtig. Wenn man jetzt
dem statischen Typchecker sagt,
das kann jetzt auch None sein, dann hat man damit
so einen riesen, dann hat man sich
einen riesen Haufen Würmer.
Dann sagt er immer, tatsächlich, irgendwann im Kotakt
immer, hey, du hast ja nicht auf None geprüft
und dann lintet dir das alles, weil du
musst vorher mal so ein Assert-as-not-none machen.
Oder noch schlimmer, also wenn es dann halt nur
nervt, ist ja noch, was noch schlimmer
ist, ist halt, dass Bugs dann halt
irgendwie unerkannt, dass halt, du kannst
plötzlich
Illegal-State repräsentieren. Und normalerweise sagt man
immer so, also, make
Illegal-State unrepresentable. Ja, das
sollte gar nicht passieren dürfen. Da sollte der
Type-Checker dir sagen, nee, das darf nicht None sein.
Und du hast dieses None ja nur
benutzt, damit du es initialisieren konntest.
Das 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 wenn
du es trotzdem möglich machst, dass es drinsteht,
dann machst du halt eine Büchse
Backwürmer auf, die dich irgendwann
beißen werden. Und die Frage ist halt
nur,
warum ist das?
Oder umgekehrt, du
machst es wie in Java,
wo jeder Typ optional ist und hast dann auf einmal
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.
Genauso schlecht.
Also ich würde sagen, aus der Perspektive betrachtet
musst du eigentlich sagen, nee, das darf
nicht Null sein dürfen und nicht Optional
sein dürfen. Die allermeisten Sachen, die man
so hat, die sind nicht Optional.
Also du würdest sagen, es ist eine leere Liste
und wenn da eine leere Liste reinkommt, musst du es
neu initialisieren.
Ja, das war da auch wieder verwirrend.
Das kannst du ja auch nicht gut machen.
Ne, was ich an der Stelle mache, ist, ich nehme
einen Trick von... Oh, eine Sentinel.
Eine Sentinel. Ja, genau. Von
Luke Plant, da habe ich das her.
Ja. Und zwar
definiere ich mir einen Typ namens
Auto und
der ist definiert
über eine Klasse unterstrich Auto
und das Ding, es macht
nichts, außer, dass es nach
Falls evaluiert
und
in
In Kindern dann.
Auto, Auto, Auto, Auto, Auto.
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.
Nee, aber das ist so.
Aber das ist falsch.
Dadurch, dass Auto Any hat,
ist es egal, welche Typ-Annotation du vorher dran geschrieben hast,
ist es richtig.
Das ist übrigens PEP 696, oder?
Das weiß ich nicht. Ich kenne die nicht auswendig.
Wie, du kennst nicht alle
PEPs auswendig?
Entschuldigung.
Und dann kannst du halt
in dem Kurzdruck zum Beispiel dann halt
sagen, if das Ding
oder if not das Ding,
dann machst du, das kannst du ja mit none auch
nicht machen, weil none musst du in Cocktailweise immer sagen,
if das da ist none,
dann setzt es neu.
Und ja, also.
Ja, okay, aber wie würdest du das mit dem Auto machen?
Das habe ich jetzt nicht verstanden.
Eine eigene Klasse Auto.
Es ist halt Auto.
Also das importiere ich dann irgendwo her.
Also der Default-Wert ist Auto.
Die Annotation ist so, wie sie halt sein soll.
Und dann?
Und dann sage ich, if not das Ding, dann setze ich es neu.
Okay, aber wenn jemand eine leere Liste reingeben würde,
würdest du es dann auch neu setzen?
Der Unterschied ist tatsächlich nur,
dass da halt ein None
sparen kann.
Aber dann würde ja, wenn das halt nicht
okay wäre, dann würde ja der Type-Checker meckern.
Also du hast halt nicht
dieses If-Ding, das ist None.
Du hast einen semantischen Unterschied
eingeführt.
Schreibst halt nicht If-Not-Fu,
also du schreibst If-Not-Fu,
dann Foo neu setzen,
weil das halt Auto ist immer fault,
sagst nicht Foo ist None, weil dann sparst du halt
einfach das None, sondern... Genau, ich spare mir das None
und ich spare mir die Is-Geschichte
und ich mache es halt so, wie es
Leute miteinander machen. Wobei die X-Geschichte,
du könntest ja immer noch
X-Is-Auto machen. Das könnte ich auch machen, ja.
Ich würde tatsächlich sogar sagen, du musst
das machen, weil
nehmen wir mal an, ich rufe diese
Funktion, die du mir gerade eben gesagt hast,
oder diesen Konstruktor, rufe ich auf mit
dem Parameter
und der Parameter ist eine leere Liste.
Und ich behalte
die aber außen vor und benutze die an einer anderen Stelle
nochmal. Das heißt, ich pende da Sachen rein
Das hast du jetzt genau den Use Case,
den Python so gefährlich macht,
den hast du jetzt kaputt gemacht.
Und jetzt überlassen wir jetzt,
wir starten jetzt eine Umfrage.
Schreiben Sie uns an hallo.python-podcast.de,
ob das gut oder schlecht ist.
Schlecht?
Ja, genau.
Also ich bin auch noch nicht endgültig zufrieden.
Ich halte mich zurück, damit die Hörer was sagen können.
Aber ich mache es halt jetzt gerade so.
Ich leide dann auch mal ein bisschen darunter,
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 er mir schon wieder,
ich soll dieses Auto verwenden.
Hä?
Ich verstehe nur Bahnhof.
Hast du deine Instruktionen nicht im Griff?
Machen sie irgendwie komische Sachen.
Und ja, ja, gut.
Ich schreibe das dann auch immer
in die entsprechenden Rules mit rein.
Aber es hilft ja auch nur so begrenzt.
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ß ja jeder, was gemeint ist.
Nee, das wissen Leute dann halt dummerweise auch nicht,
das wäre auch schon passiert.
Wenn er das in NLM schaut, ich weiß.
Ja, genau.
Kontrollklick drauf.
Okay, aber
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.
Zweiter Twist in the end.
Ja.
Da war ich ja
überhaupt gar nicht drauf vorbereitet.
Dominik, warum magst du Pattern-Matching? Erklär mal.
Weil ich damit relativ
verschiedene,
das ist erst blöd, weil das mag man eigentlich
nicht. Also ich kann verschiedene Objekte entgegennehmen
und die checken und dann gucken.
Und wie geht das? Erklär mal, wie das geht.
Du machst ein Match und ein Case auf,
matchst dann deine Variable, die du hast
und gibst dann verschiedene Cases. Also da hättest du gerne
irgendwas ist
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 geht weiter.
Und du kannst da bestimmte Attribute
omitten, indem du die einfach auf dann
setzt, falls das verständlich
ausgerückt ist. Und kannst
damit relativ schön Cases abfangen und
hast dann irgendwann einen Standardcase. Also so ein bisschen
so if, then,
if, elif, elif, elif,
in, gut lesbar finde ich.
Also ich mag das sehr gerne.
Du kannst auch Types machen
und kannst Guards machen
und sowas. Ja, man kann ja sehr viele
Sachen machen. Ich glaube, das verdient
fast eine eigene Episode. Da muss man eine eigene Episode
zu machen, haben wir noch nicht gemacht, haben wir auch schon häufiger
geplant, aber ja, genau, das müssen wir mal machen.
Man kann auch da, ich finde, ja,
es ist super mächtig. Ich brauche es ehrlich gesagt
nicht so oft. Ja, das ist
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.
Das ist ganz komisch.
Also ich meine,
ich glaube, das ist halt auch für Leute,
die jetzt oft Parser für irgendwelche
Sachen schreiben oder so,
oder halt so Domain-Specific
Languages für irgendwas haben,
die brauchen das wahrscheinlich oft.
Aber das mache ich halt nicht so oft.
Also ich, also
das erste Mal habe ich Pattern Matching gesehen,
da war ich noch ein junger Mann
damals und das war
ein Erlang. Ah, ja, ja, ja, gut.
Und 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.
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 diesen, das
jedes Mal.
Und da ist es ja nicht, da geht es nicht so sehr um Parse,
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.
Aber irgendwie hat es noch nie so
richtig gut gepasst.
Ja.
Weiß auch nicht. Ich weiß auch nicht.
Kann man verschiedene Exception-Types
gucken oder...
Ja, aber die fange ich doch in den
Accept-Blocks schon ab, die verschiedenen
Exception-Types. Da gibt es doch schon Syntax für.
Und für die verschiedenen Instanz-Typen
muss ich eher irgendwie
in Funktionen reinverzweigen.
Und ich weiß irgendwie,
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, ah, 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
das ist ja jetzt inzwischen, ist ja
so 3.10 ist ja jetzt schon die
älteste Version, die man so, mit der man normalerweise
so zu tun hat.
Nee, 3.10, also
3.10 meinst du nicht? Ja, genau, und in 3.10 ist es
genau, nicht 3.10, meinte ich nicht, nee,
3.10, genau. Ja, 3.10, ja, das ist,
würde ich sagen, ja. Und da ist es ja
dazugekommen, also insofern würde ich sozusagen, 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
Vortrag angeschaut und man kann sich
auch da wieder leicht in den Fuß schießen.
Ja, was nicht so ganz so interessant ist, ist, dass wenn man so die
Bild in Typen nimmt, also man sagt
irgendwie Match Unknown und dann machst du
eine Case List oder
Tupel und wenn man die dann
nicht instanziiert mit den Klammern,
dann ist es Kacke, weil es always
true ist, weil der auch die Funktion
guckt und nicht guckt, ob es eine List oder ein Tupel ist.
Genau.
Dann kann man sich auch mit den Fuß schießen.
Ja, und das ist der Default
Fall auch immer irgendwie,
wenn nichts anderes gefunden wird, ist es auch irgendwie etwas,
was halt in anderen Sprachen anders ist.
Und es gibt ja schon so ein paar
Falschstricke.
Naja. Und dass man den
am besten immer handeln sollte, genau.
In Python. Ja, aber das ist
doch auch nervig. Ja gut, aber
das ist ja klassische Programmierung, dass man immer
das else für alles, was man
nicht erwartet, schreibt.
Wenn man das else weglassen kann,
dann lässt man es weg.
Tja.
Je mehr man weglassen kann, umso mehr
kann man weglassen. Das ist doch viel besser.
Eigentlich schon.
Ja, und dann ist das Kapitel auch schon vorbei.
Dann kommt nur noch hier so ein bisschen...
Also Else makes the universe explode.
Also immer, wenn der Else-Case einschickt, dann alles abreißen.
Alles vernichten.
Ist das
Quantum-Sort, ja?
Kennt ihr den Quantum-Sort-Algorithmus?
Der ist ein O-von-1-Sortier-Algorithmus.
du machst
eine zufällige Permutation
von deinem Input
und guckst, ob sie sortiert ist.
Und wenn sie nicht sortiert ist, zerstörst du das Universum.
Ja.
Und das in dem Universum,
in dem sortiert ist,
da überlebst du immer.
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
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 hochtrabend 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.
Deswegen auch Dreck neben Tupel, ist ein Tupel.
Ja, 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-Classes verwende, könnte ich wahrscheinlich auch einen Topfel
verwenden, aber
Ja, aber es ist schon
bequemer, dass man die Namen schreiben kann.
Das ist schon cool.
Das kannst du bei NameTupel auch.
Ja, genau. Aber dann kannst du nicht ein normales
Tupel nehmen. Nee, nee, aber NameTupel ist
doch schon... Also ich benutze fast
kein... Ich würde, glaube ich, fast nie
ein normales Tupel nehmen.
Sondern statt einem normalen Tupel immer ein NameTupel,
weil ich gerne die Namen verwende und ich mag
Indizes nicht so. Ja.
Ja, okay. Ich verwende
Tupel sehr häufig.
Ja, ich würde so implizit...
Genau, 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 diese Tupel, ist dieses Tupel
so ein bisschen... Da willst du ja dann nicht
ein Name-Tupel verwenden, ja. Ja doch, also warum nicht?
Als Return-Wert ein Name-Tupel, dann hast du schon
Type-Annotation und kannst danach auf die Attribute des Dings
wieder zugreifen. Ach, viel zu viel Arbeit.
Viel zu viel Arbeit.
Einfach zwei Werte zurückgeben, zack.
Zack, zack, dies und jenes.
Dies und jenes wird
vielleicht auch das und dafür wird ein Match-Case wieder gut.
Ja, sorry.
Ja. Ich glaube, wir haben das
Kapitel besprochen, oder? Wir müssen 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 doch mal.
Völlig? Ja. 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.
Ja. Wenn ich mich aktiv verändere.
Und zwar, was mir
momentan tatsächlich... Nachts um halb drei mit dem
Tunnel, 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
Claude Coote. Und
das ist quasi so ein
LLM-basierter
Kommando-Teil.
Dein neuer
Agent, oder? Ja.
Genau. Was ist ein Agent?
Ja, schwierig.
Was ist ein Agent?
Und 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 Clues schon einen Rutschgriff auf deinen Rechner gegeben?
Das mache ich nicht, aber in Projekten, wo ich weiß, wenn das committed ist oder gepusht, dann kann das halt auch weglöschen, ist nicht so schlimm.
Ja, gib dir doch mal ein, zwei Server, da kannst du dich austoben.
Ein bisschen Budget dafür.
Ja. Ich hab mal gefragt,
also auch Claude, 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 Claude meinte dann so, hey, ist eher so eine Bromance.
Ja, okay.
Das glaube ich bei dir,
Dominik, das glaube ich bei dir.
Ja.
I agree.
Die Bromance zwischen dir und KI.
Aber
also ich würde es einfach mal,
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, weißt du, wenn du jochen beim Arbeiten
zu guckst, dann schlägst du die ganze
Zeit nur drauf und dann so, nö,
ja, doch, vielleicht, ach, mach noch mal
so. Ja, aber
das ist auch schon wichtig, also ich gucke schon noch drauf
und ich... Also das heißt, das
draufgucken ist das, was dich von Vibe unterscheidet?
Ist das dann... Ja, ja, nee, das ist nicht Vibe-Coding.
Also ich nenne das manchmal
bosnacherweise Vibe-Coding. Nein, nein, das ist nicht Vibe-Coding.
Um die Leute zu ärgern,
die... Keine Sorge,
das ist nicht Vibe-Coding.
Ja, es gibt ja zwei Menschen, glaube ich, 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
in der das Ergebnis und der Code
egal sind und du halt nur
sozusagen basierend auf dem
Vibe
sozusagen den Kram baust.
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
in der Z-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, aber
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, dass jetzt so, dass
ja, okay, naja gut,
ist auch wurscht, kann man auch nicht mehr zurückholen.
Meinetwegen ist es auch
Vibe-Coding, aber, also 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 und, 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 ist halt,
macht alles nochmal deutlich angenehmer.
Das ist schon mega gut, aber da
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 der Manns Ausschuss,
weiß ich nicht, NITN?
Ah, mhm.
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 dir so zusammenklicken.
Du machst da einen Telegram-Channel dazu und dein Discord
und 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-Schnipsel reinbauen.
Also wenn ich
Low-Code mir überlegen würde, würde ich das wahrscheinlich auch so
machen.
Ich würde sagen, das ist sehr gefährlich für
unsere Profession auch.
Also ich kann jetzt jeder Marketier hinsetzen und sagen, hey, ich bin Coder und macht sich miteinander so einen Business-Prozess, wo man vorher halt gut bezahlte Software-Ingenieure für braucht. 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 uns, um das wieder zu reparieren?
Oder schafft das dann Cloud Code selber?
Naja, also ich meine, 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 schon nicht so schlecht. Nein, aber das ist
ein Irrtum. Es geht nicht nur darum, rauszufinden,
was ist das, 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.
Ah, obsolet, weiß ich nicht.
Du bist ja immer noch dann abhängig auch da von dem Service
und so. Also, naja.
For business leaders,
unfuckete I. How did you find us?
My therapist recommended you.
Are you very sorry? Yes, no, fuck you.
Genau.
Ja, also ich muss, ich
stimme 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 macht für mich jetzt
mehr Aufwand. Ich kann schon 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, aber
ja, gut.
Wir werden sehen. Vielleicht, ja, keine Ahnung.
Mein Pick geht in eine
ganz andere Richtung.
Turning Caffeine into Code?
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.
Das heißt, wenn ich die auf meinem
Produktionsserver dann ausrollen möchte, dann müssen die
irgendwo sein. Und dieses irgendwo heißt normalerweise
RetroG. Ja, Docker Hub
kannst du nehmen, wenn du Open Source machst
und wenn du keine Geheimnisse, wenn du alle
deine Sachen
offenlegen willst auf der Welt.
Ansonsten ist es eine Artifactory.
to Factory 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 Server-Maschine
ein
Image pushen,
ohne über eine Registry zu gehen.
Der Trick ist,
also das geht natürlich manuell auch,
ich kann natürlich manuell dieses
Docker-Image exportieren und kann es zippen,
und dann per SCP rüber kopieren
und so weiter. Aber das ist zum einen
nervig und es ist auch langsam, weil jedes Mal
das komplette Image übertragen werden muss und nicht nur
die Schichten, die man neu braucht.
Und das macht Unregistry
einfach alles im Hintergrund. Das heißt, der Trick ist,
das tut so, als ob es ein Registry wäre
und wenn du sagst, hier,
push mal auf den Server, dann macht es dort einfach kurz
ein Registry auf, dann pushst du dahin
und 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 musst dann aber nicht
History und so was
hast du dann halt weg, ne?
Wie meinst du History? Hast du bei Docker-Containern
nie. Na doch.
Das zu, hast
die, jeder Tag, den du
pushst, ist dort. Also
du hast kein zentrales
Repo mehr und das ist genau das, was du möchtest.
Okay. Wenn du
die Sachen aufbewahren möchtest, dann brauchst du
eine Registrierung.
Ach so, mein History von
Images.
Nee, das ist ja eben
unregistered. Das hast du jetzt nicht mehr.
Und das will ich auch in ganz vielen Fällen einfach
nicht haben. Ja, ist eben meistens noch ein Müll im Ballast.
Ich habe immer nur Latest. Es gibt nur Latest.
Aber wenn du was kaputt gemacht hast,
da musst du ja dann wieder zurück, anstatt 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 etwas ganz anderes.
Kommt 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. Und machen wir es.
Ja, dann bleibt uns gewogen. Hallo at peisenpodcast.de
Dankeschön und bis bald.
Jo, macht's gut.