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 hast du 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.
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.
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, oh Gott, oh Gott, oh Gott.
Aber ja, ich habe gehört, es gibt Leute hier unter uns.
Ich kann ja meinen eigenen Jingle schreiben, dann mache ich den auf meinen Style.
Und dann können wir ja gucken, wie das dann runtergeht.
Wenn man sich die Kurve anguckt, ist halt so, in allem meinen eigenen Jingle.
Immer wenn ich dabei bin, muss der am Anfang eingespielt werden.
Das ist eigentlich eine coole Idee.
Ja, ja, okay, dann sieht die, wie viele Leute hören noch zu Kurve wahrscheinlich aus,
wie so Akapulco, Klippenspringer, irgendwie ins Nichts.
Das 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, Jochen.
Also erstens kennen uns ja 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 peisenpodcast.de.
Also wir machen irgendwas mit Peisen.
Das hat man vielleicht schon mal.
Das hat man 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 noch mal kurz unsere Kalender übereinanderlegen.
Also ich glaube, tatsächlich wird es eher Ende August,
bis Anfang Juli.
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, 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.
Okay, geil, dann wir diskutieren das später aus.
Wir haben auf jeden Fall das Thema.
Sagt gerne Bescheid, wenn ihr vorbeikommen wollt.
Es ist hier in der Gegend.
Also hier heißt Rheinland-Düsseldorf.
Ja, wir können ja schon mal sammeln.
Also wenn ihr uns irgendwas an hallo-at-python-podcast.de schreibt,
dann notifizieren wir euch, sobald wir genaueres wissen.
Genau.
Und es wird wahrscheinlich draußen irgendwie ...
Draußen gibt es vielleicht was zu essen.
Irgendwie so.
Ja, ja.
Irgendwie Dinge.
Ja, okay.
Genau.
Ja.
Das zur anderen Struktur, Jochen.
Ja.
Wir machen immer News.
Ja, wir machen News.
Das ist cool.
Dann machen wir doch gerade ein bisschen News.
Ja.
Aber vorgestellt hat sich jetzt keiner, oder?
Ach, Mist.
Jetzt doch haben wir schon ...
Der Jochen wollte so schön hinfahren und jetzt ist keiner eingestiegen.
Ich bin der Dominik.
Jochen, wer bist du denn?
Ja.
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 ...
Siehst du, er fällt ihm schon nichts ein.
Ja, der Techniker Dominik.
So, wir essen das eigentlich.
Schon ist es vorbei.
Also meine drei Hashtags sind Python, Eurorack und ...
Agentic ...
Vibe-Coding, ja.
Vibe-Coding.
Ja, ja.
Vibe-Coding, ja, genau.
Okay, Mist, jetzt sind alle guten Hashtags schon weg.
Meins wären irgendwie, ja, Python ...
Kannst du mal peißen?
Podcast Ukulele.
Ja, Ukulele.
Ukulele ist auch sehr gut, genau.
Das klingt ganz schön, ja.
Ja.
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.
Ja.
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.
Tja.
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, wenn ihr seid so traurig und beregnet.
Du bist auch ein richtiger Tausendsassa, die bei Johannes.
Ja, richtig.
Also meine ...
Die kennst du übrigens alle aus dem Chaos-Umfeld so ein bisschen mehr oder weniger.
Ja, den Jochen auch, oder?
So können wir das schon sagen.
Ja, den Jochen habe ich im Computer-Club kennengelernt.
Ja, genau.
Also, ja, mich auch.
Meine Hashtags.
Django, Mathematik und ...
Spiele.
Spiele, richtig.
Ja.
Absolut korrekt.
Ah, cool.
Hört man schon am Namen.
Ja.
So, Nomen, Esto, Omen.
Ja.
Okay, na gut, dann können wir ja jetzt nahtlos mit den News einsteigen.
Ich habe nicht ...
Perfekte Struktur.
Sehr gut, sehr gut.
Ich konnte ...
Ich konnte nicht so viel sammeln, weil ich momentan total im Stress bin.
Also, ich ...
Ja, dann erzählen wir doch ganz kurz nochmal vielleicht über das Barcamp.
Also, das ist jetzt vielleicht nicht so interessant für alle Peißenleute,
aber für alle Leute, die Podcasts mögen schon.
Es gab da nämlich eine tolle Veranstaltung, wo man ...
Also, Barcamps kennt ihr ja vielleicht aus dem Software-Umfeld,
wo man ganz viele nette Podcast-Menschen kennengelernt hat.
Ich möchte nochmal Danke sagen für die tollen Kontakte,
die ich da getroffen und kennengelernt haben durfte.
Ja, Grüße an hier Working Draft zum Beispiel.
Ja.
Auch ein Podcast aus ...
Ich habe auch ...
Nicht nur Düsseldorf, aber ...
Also, gute Tipps waren ...
Von der ...
Wir sollten ja mehr zusammen eine Episode aufnehmen.
Ja, ich habe gehört.
Ja, mit Working Draft, das wäre doch mal wieder eine Idee.
Und wir haben auch schon konkret geplant,
was zusammen mit WoWirSind 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.
Ja, das war so ein Tipp.
Irgendwie besucht euch auch einfach gegenseitig.
Auch ein guter Tipp war halt, ja, schaut nicht nur nach
so irgendwie totalen Berühmtheiten oder so,
auch wenn das auf dem Papier oder so,
erst mal, wenn man drüber nachdenkt, gut aussieht, aber ...
Meinst du, Guido ...
Ich wollte immer schon mal Guido haben.
Ja, aber das ist halt mit Englisch vielleicht ein Problem.
Mit Sarah war das jetzt mal eine Ausnahme.
Aber da gibt es ja schon Leute, also ich meine ...
Ja, gibt es auch, auf jeden Fall.
Auch in der deutschsprachigen Welt gibt es Paltenmenschen.
Genau, gibt eigentlich auch genug.
Guido spricht 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, ne?
Und wenn man dann nicht, weiß nicht, das ...
Ja, hast du wieder einen Podcast mit Guido.
Ja, genau.
Ach, na ja.
Es gibt doch jetzt demnächst eine tolle 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.
Snakes on a Plane?
Äh, nee.
Ja, den gab es schon, aber ...
Ja, das ist schon ein Python-Film.
Nee, das ist schon ...
Da gab es auch ...
Heißt die Story irgendwie, ich weiß nicht, hab ich vergessen.
Ja, ja, irgendwelche Leute machen das immer.
Und über Even You haben sie zum Beispiel ein Ding gemacht,
das war ziemlich gut, das habe ich gesehen.
Und über andere Leute ...
Ja, hast du noch mal Even You.
Der Typ für Vue.js und jetzt Rulldown, habe ich gelesen.
Und genau, das gibt es jetzt auch über Python.
Und soll wohl auch ...
Also, der Trailer sah auch gut aus.
Und ja, wir wollen mal schauen, wie das so wird.
Genau.
Ja, 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 ein total cooles Ding ist irgendwie.
Und man kann die ganzen Räumlichkeiten
auch für alles mögliche verwenden.
Man muss es nur irgendwie anmelden.
Und jedes Mal, wenn man da vorbeilief und gerade auf dem Gang,
wie man es bei so Konferenzen macht,
kurze Gespräche, dann kam er vorbei mit ...
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, ich habe dann so eine Führung damit gemacht.
Und die sagt, na ja, 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,
weiß ich nicht, so Laser-Entfernungsmesser
und 3D-Drucker und VR-Brillen und ein Podcast-Studio
und ein Ding, wo man ...
Wo man irgendwie Super-8-Filme digitalisieren kann
und auch alte Vias digitalisieren kann.
Und Videorekorder.
Und ein Musikstudio, wo man leider aber nicht drin laut sein darf.
Da darf man nur digitale Instrumente drin verwenden.
Weil daneben diese 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.
Das, ja, gut, hätte man auch vorher drauf kommen können.
Ja.
Aber das muss da wohl irgendwie erst mal eskalieren.
Und jetzt darf man da nicht mehr singen.
Eigentlich schade.
Naja.
Ja, schade.
Gibt's auch Backformen.
Ich hab das einmal gesehen.
Das ist Bücherei für Backformen.
Genau.
So Bücherei der Dinge nennen die das.
Da gibt's 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 einen Raum für den und den Zweck.
Und dann überlegen die und dann sagen sie einem,
nee, du stinkst oder ja, kannst du haben.
In der alten Zentralbibliothek, da war ich vielleicht zwölf oder so was,
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.
Ja.
Das war ... also da gibt's auch eine Menge ...
Ich bin nämlich nach der Schule früher,
bin ich immer in die Bibliothek gefahren.
Ja, das hab ich auch.
Ich hab ...
nicht nur nach der Schule.
Ja, 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's auch Bücher über Peißen, Jochen.
Ja, da gibt's ...
Gibt's da Flunenpeißen?
Bücher gibt's da auch.
Ja, und ja, da werde ich mir nicht ...
Aber es gibt eine Fernleihe, über die man halt eine Menge kriegt.
Weil, 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.
Und dann ...
Genau, also wir gehen auch mal zu unserer Stadtteilbibliothek.
Ja, und man kann die Bücher auch überall zurückgeben und so.
Also es ist wirklich ...
Also ich war überrascht.
Es war toll.
Oder Tonis ausleihen.
Das auch, ja.
Ja, genau, genau.
Also da hat das Ganze irgendwie stattgefunden.
Und ja, war ...
Also wir haben ein paar tolle Tipps bekommen für Marketing
und was man nicht alles machen soll.
Das heißt, wir machen jetzt ganz viel Marketing.
Viel Spaß damit.
Für uns bestimmt gut.
Für euch, ja.
Ihr müsst halt damit leben.
Ja, nee.
Wir haben tatsächlich überlegt,
ob wir ein Video mal aufnehmen wollen.
Genau, ob wir ein bisschen mehr Video machen.
Also ich 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.
Man 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 unbedingt die Podcasts
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 da war.
Das geht 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 ...
Was ich auch total cool fand, war, wie Leute darüber gesprochen
haben, wie sie halt ihre Workflows halt so ein bisschen
automatisieren mit
ähm ...
mit so diversen Tools und
was man da alles machen kann an
Automatisierungen von irgendwie,
ja, was man ... Oder, oder, ja.
Oh, jetzt sind wir bei einer anderen geplanten Folge
übrigens mit, aber nicht bei Podcasts, aber
wir wollten auch bald nochmal wieder bei so
Data Science-Kram reden und dann auch nochmal über
äh ...
die ganzen neuen KI-Sachen. Darf ich KI sagen?
Ich weiß nicht. MCPs und so.
Ja, ich glaub, man darf was schon sagen. KI, musst du sagen.
KI, oh.
Ach so, äh, Entschuldigung. Du hast eben so einen
tollen Link geschickt, der dazu passt.
Ja, ich hab auch tatsächlich noch News, ähm,
weil, äh, es gibt
eine interessante Veröffentlichung vom
MIT Media Lab mit dem Titel
Your Brain on Chat GPT, die gerade
so ein bisschen durch die News gegangen
ist, wo
sie untersuchen, was das denn für Auswirkungen
hat. Also, ich mein, es ist natürlich sehr reißerisch
und, äh, die Studie
hat 54 Teilnehmer, also
es ist jetzt nicht kein repräsentativer
Querschnitt durch die Gesellschaft.
Aber
äh, es gab wohl signifikante Unterschiede
zwischen Menschen, die, äh,
LLMs benutzen oder nur eine
Search Engine oder Brain Only
in Klammern No Tools.
Äh,
das finde ich eine sehr schöne Bezeichnung.
Und was war besser? Für was?
Ähm, es ist,
man kann sich Sachen besser merken, wenn man sie
nicht von einem LLM erzeugen lässt oder wenn man sie
es 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 Such,
auch Suchmaschine, also auch wenn du normal
bei, bei Google oder bei irgendwas
anderem eintippst und nicht diese KI,
ähm, Kagi, ich benutze
Kagi, äh, benutzt,
ähm, wenn man
nicht diese KI-Zusammenfassung benutzt,
ist, ist die Retention wohl deutlich
besser. Und das Interessante
ist eigentlich, dass diese Studie so durch
die Neuigkeit...
Bitte, ich hab's 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, äh, eine Neuigkeit?
Ich meine, äh... Ja, ja, natürlich.
Die meisten, äh, also
viele Leute sind halt so, doch eher so
im Modus, äh, meckernder... News-Technology
is bad for you. Genau.
Meckernder Rentner im Fenster mit
einem Kissen und, äh, Kulturpessimismus
kommt halt immer gut an. Das ist halt immer eine Schlagzeile. Ja, aber Jochen,
wir sind jetzt so langsam in so einem Alter.
Ach so, ja.
Genau, und hast du gesehen, jetzt haben wir für zwei
Straßen weit, haben sie die Straße gelb gestrichen.
Das hab ich nicht gesehen. Was? Das ist ja
unmöglich. Unglaublich. Also, was die
jungen Leute heute machen, das hätt's bei uns früher nicht
gegeben. Ja, das waren nicht die jungen Leute. Das haben sie richtig mit, äh,
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. Ja. Also,
der Dominik ist auch in dem Alter, wie ihr gehört.
Genau. Äh, ja.
Also, ich, ich verstehe, wie diese
medialen Mechanismen funktionieren,
die halt dazu führen, dass das halt immer
Schlagzeilen und Neuigkeiten sind. Aber ich hab's
große Zweifel, dass das, äh,
äh, äh, quasi ein repräsentatives
äh, äh,
äh, das Bild davon zeichnet,
was irgendwie so passiert. Insofern. Ist es sicherlich
nicht. Aber, ähm,
die Anzeichen davon, dass Leute auf
diese Dinge vertrauen. Ja, klar.
Äh, und dann, äh, auf solche Fakten reinfallen.
Ja, natürlich. Oder auf solche ausgedachten
Sachen. Ja, dass man, dass Ungarn auch
Holland genannt wird. Äh,
ja.
Ja, das, äh,
dieses Vertrauen ist da
halt schon sehr groß. Ja, also, ich hab heute
zweimal gehört, ich hab Chat-Spotty gefragt, mir dann
meine Schule ausgesucht und, ja.
Das wird da als Suchersatz benutzt, ne?
Also, ganz klassisch so. Ja, find ich ganz
toll. Also, da bin ich zu alt dafür. Das find ich ganz
komisch. Ja, ja. Also, Leute
denken, das ist, aber, 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. Ja, gut, gelogen. 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
Marksteier geglaubt, was der gerufen hat?
Ja, oder das Fernsehen, genau. Als das Fernsehen neu war,
auch, als das Radio neu war,
irgendwie,
War of the Worlds, ne, war auch ein großes
Medienkompetenz. Damals, als man den Propheten noch
wirklich glauben konnte. Ja,
ja. Also,
es ist ein wiederkehrendes
Muster, ja, oder eben, bei Plato
gibt's das schon, der Wetterter gegen die Schrift. Und der
Verfall der Jugend, sowieso. Ja, ja.
Also, ich würde mal
einfach sagen, einfach, wenn man kann, so,
Plato hat nicht recht gehabt.
Ja. Und das mit der Schrift war schon
Fortschritt. Und alle anderen danach. Und das wird ihn jetzt aber
ganz schön atzen. Ja, aber
ich glaube, du bist ein Fanboy, Jochen.
Ja, na, auf der anderen Seite,
andererseits natürlich schon, bin auch irgendwo ein Plato-Fanboy.
Das ist richtig, ja. Ja, das können wir in der
MCP-Folge nochmal genauer auslassen. Ja, wobei,
du hattest ja den Hashtag Mathematik, da hab ich ja einen Haken,
um da mich rein... Ich hab 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 Linen,
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
Binary, sondern der gibt einem ein Zertifikat,
dass das, was man halt hingeschrieben hat,
folgerichtig war. Und wenn man, wenn das
ein Beweis war, dann ist es halt dann bewiesen.
Genau.
Und das,
ja, macht es halt auch zugänglicher. Das macht es halt auch
möglich, dass mehrere Leute miteinander
irgendwie kollaborieren, weil das Problem an
der bisherigen Mathe-Notation, auch die
ist natürlich ein riesen Fortschritt gegenüber früher,
aber die ist halt so, wenn man jetzt so ein
aktuelles Mathe-Paper nimmt, dann
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 halt das, was es gibt, so an Mathematik
einmal komplett
durchformalisiert zu haben.
Und dass man es halt auch noch suchen kann, dass man immer
sagen kann, okay, ich habe jetzt dieses Problem, welche
Lemmas könnten mir denn da helfen oder welche Tricks
siehst du denn in den Dingen, die alle
bewiesen sind, die man jetzt verwenden könnte und dann
kann einem auch ein 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 und 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 Wette genannt hat.
Ja, aber
auf jeden Fall, Mathematik ändert sich auch noch
immer und mehr Leute können
an Dingen, die hatten dann jetzt auch so ein Paper
dazu und da waren halt dann 50
Autoren drauf oder so 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?
Nein, was ist das?
Chicken, 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.
Ja, 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-reviewedes Paper.
Ah, da kommen ziemlich
viele Hühner drin vor. Ja, genau.
Eigentlich nur Hühner.
Ja, alles Chicken. Ja, ja.
Ist auf jeden Fall
eine sehr spitze Zielgruppe dann.
Ja.
Genau, also was
der, also ich würde ja sagen,
also bisher war ich immer in dem, es gibt ja im Grunde
zwei Lager in der, was Theorie
der Mathematik angeht. Es gibt halt so die
Platoniker
irgendwie, also das ist
eine der wenigen Gebiete,
wo halt, 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 alles
checken kann, aber checkt, ob da
irgendwas interessant, äh, ob das wahr ist erstmal,
ob das richtig ist und dann, ob irgendwas Interessantes
rausgekommen ist und dann manchmal fällt da irgendwas Interessantes
bei 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 Platon, äh,
Platon, äh, äh, mathematischer Platonismus
ist eigentlich schon so die richtige Geschichte und dann,
genau, Intuitionisten seit, 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 hab ich eher so für Quatsch gehalten.
Und der hatte jetzt aber ein super Argument
für den, äh, mathematischen
Intuitionismus und zwar,
ähm, äh,
ähm, wie waren das noch?
Ja, jetzt musst du das auch richtig zusammenkriegen.
Jetzt muss ich das zusammenkriegen, verdammt.
Das ist ein gutes Argument gewesen.
Mathematik war besonders, äh, einfach.
Äh, äh, genau, ach so, ja, richtig, das ging
ungefähr so, der sagte halt, naja, also
es gibt ja so Zahlen wie Pi, wir hatten das, glaub ich, auch mal im Podcast
schon mal irgendwann davor, als wir über Pi geredet haben.
Naja, das ist halt, äh, völlig
unklar, zum Beispiel, also es sieht, es
ist Pi, die Dezimalprobenentwicklung von Pi
besteht jeden Test für Zufälligkeit
und, äh,
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.
Ja, ja. Aber es sind die
allermeisten.
Ja, und das finde ich sehr unangenehm.
Genau. Und da gibt's
halt dann dieses Bild von den, das hat ja bestimmt auch schon
jeder mal gehört, von den,
diese Infinite Monkeys, ja, so
natürlich 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 Laken
von Shakespeare in der richtigen
Reihenfolge und so enthalten werden.
Wenn sie urheberrechtlich geschützt sind.
Wenn die echt zufällig sind. Das kann nicht
anders sein, das muss so sein. Und jetzt
ist halt natürlich die Frage so,
also wenn jede einzelne von diesen
blöden Zahlen im Grunde das ganze Universum irgendwie
enthält, weil, naja, also
egal wie man das Universum beschreibt,
diese Beschreibung muss da auch drin vorkommen, irgendwo.
Wie kann das denn sein, dass das
schon vorher existiert
da draußen und wir es nur entdecken?
Oder ist es dann nicht so, dass man
ja, wenn man das
jetzt erzeugen wollte, zum Beispiel über Pi...
Ja gut, aber das geht ja weg, Jochen. Da musst du nur sagen,
das Universum ist quantifiziert und schon existieren
diese Zahlen nicht mehr.
Ja, aber das, gut, okay.
Das Universum, sehr weit gefasst, jetzt nicht als physikalisches
Universum, mathematisches Universum
eingeschlossen, wo alle mathematischen Objekte auch drin sind.
Inklusive Pi und so.
Und wenn man sagt, man könnte ja als Platoniker würde sagen,
es existiert.
Zirkulär?
Ja, du sagst, es existiert, weil wir annehmen,
dass das Universum, in dem die, dass das
Universum, in dem wir drin sind, das Universum
ist, in dem die existieren.
Nee, nee, ich würde sagen, also es gibt
ich meine jetzt nicht das physikalische Universum, sondern
ganz weit gefasst, also
auch das
die Welt, in der halt auch
mathematische Objekte existieren, da ist halt
also als Platoniker würde ich davon ausgehen,
eben sowas wie Pi, das existiert da draußen halt
nicht in unserem Universum natürlich
im physikalischen Sinne, sondern
quasi als 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 gesinnt 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.
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.
Mhm. Ach so, okay.
Die gibt es nur, weil wir...
Da kannst du einfach fliegen gehen.
Und die Frage ist, wo ist die Grenze?
Wo sind die Sachen von Gott gegeben,
wie man so sagt? 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, nee.
Die haben ja schon eine Entsprechung in anderen Dingen drin
und die findest du überall in der Physik und so weiter.
Aber dann gehst du weiter.
Denn, keine Ahnung, ist die Monstergruppe
ausgedacht oder nicht?
Ja, ja.
Wobei die Monstergruppe ein schlechtes Beispiel ist.
Jetzt musst du kurz erklären, was denn die Monstergruppe ist,
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 ganz nahe, die natürlichen Zahlen
und die ganzen Zahlen
und dann, die kannst du so erweitern
und da gibt es irgendwie fünf verschiedene Kategorien
und dann gibt es noch drei,
die sind ausgedacht.
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
und hast deinen 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.
Die ist ein schlechtes Beispiel,
weil die fällt halt aus diesen Klassifizierungen raus.
Aber ganz viele von diesen Dingen sind,
finde ich, sind schon eindeutig ausgedacht.
Die sind 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 ausrichtet,
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...
Ja, also die Frage ist...
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,
dann ist das ja vielleicht,
weil in der Zeit könnte es ja noch
eine andere Dimension versteckt haben,
die dann nicht nur linear...
Ja, viele, aber das bringt nichts.
Doch, das ist ja nicht unendlich.
Stipseln 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.
Ich glaube, da müssen wir mal eine separate...
Müssen wir mal eine separate...
Müssen wir vielleicht auch irgendjemand fragen,
der da mal...
Keine Ahnung,
das waren so meine Gedanken bei dem Hören von...
Ja, vielleicht finden wir ja einen Mathematiker,
der was weiß.
Ja, das ist auch vielleicht eher in der Mathematik esoterisch.
Weiß nicht, ob es sowas gibt.
Ja, nee, aber solche Diskussionen
sind in der Mathematik schon...
Die kommen immer wieder,
gerade in den früheren Semestern.
Sobald man mal ins...
Sobald man das Grundstudium abgeschlossen hat,
dann 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 Studenten,
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,
ja, 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.
Das hat keine riesige Überschneidungsmenge.
Das ist ja genau der Versuch,
quasi von den Sinneserfahrungen zu abstrahieren.
Aber ja, was natürlich schwierig ist.
Ja, sagen wir mal zu den tatsächlich praktischen Dingen.
Ich habe auch ein News-Ding.
Und eins hat er noch.
Ja, genau.
Weil das können wir vielleicht jetzt 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.
Ach so, jetzt ist es wieder eingeweiht.
Ja gut, dann machen wir 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 zur MCP.
Dann machen wir eine eigene Folge zur MCP?
Ja.
Okay, na gut.
Also ich finde ja, MCP ist das Master Control Program.
Genau, das fand ich auch.
Ich habe da Vortragsvorgaben.
Oder Metoklopramid, je nachdem, wie man möchte.
Na gut, dann machen wir das heute eben nicht.
Aber das müssen wir echt dann bald machen,
weil sonst weiß ich das alles nicht mehr.
Ich weiß das jetzt gerade.
Mit dem Jochen unter den Nägeln.
Ja, Mathematical Compute.
Die Behörde schreibt uns an hello at python-podcast.de
auf YouTube.
Ich weiß nicht, ob ihr diese Folge dringend hören wollt oder nicht.
Ja, okay.
Meinst du, jetzt hört noch jemand zu?
Ja, 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
naja, 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
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, der stellt sich jetzt
endgültig Zeit für...
Dann machen wir jetzt, was machen wir jetzt?
Es kommt aber ein radikaler Wechsel. Achtung, jetzt kommt ein radikaler Wechsel.
Der Unterbruch. Data Class Builders.
Ah, okay.
Bei Unfucked.ai sind, das wollte ich noch einmal
kurz erwähnt haben, das hat der Johannes eben geschickt.
Das war schön.
Link in den Show Notes.
Genau, für Business Leaders oder für Senior Developers.
Wichtig.
Ja, Kapitel 5.
Ist ein etwas kürzeres Kapitel
und ich fand's 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.
Und...
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 um Kapitel geht.
Es geht darum, wie man
Datenobjekte
einfach...
Instanziert ist vielleicht falsch.
Deklariert.
Also, mit Data Class oder Name Tuples.
Eine Klasse, die nur...
die nur Daten hält und keine Funktionen hat.
Wie so ein Name Tuple?
Ja, zum Beispiel. Das ist eine... Also, gleich auf der ersten Seite
sind drei Mechanismen genannt.
Oder auch wie ein Type-Tick, Johannes.
Named Tuple. Nee, das nicht.
Kommt direkt auf der zweiten Seite, steht direkt drauf.
Das nicht.
Also, es gibt Collections.NamedTuple.
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's eine neue Variante davon.
Typing.NamedTuple.
Und der heißeste Scheiß
ist natürlich Dataclasses.Dataclass.
Ein Dekorator, der diese ganzen Sachen
mitnehmen soll. Am Ende geht's
immer darum, Klassen zu machen, die
nur Attribute haben.
Und im Endeffekt
ist das auch alles nur so ein bisschen Zucker
obendrauf gestreut, weil man könnte prinzipiell
diese ganzen Sachen alle mit Dicks machen oder sogar
mit Tuples, wenn man möchte.
Das heißt, das Einzige, was man gewinnt
und das Einzige ist hier 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-NamedTuple
und sagt,
es ist Collections-NamedTuple, bitte.
Darfst du nicht.
Ja, sagen die das? Okay.
Ich bin nicht ganz 100%
immer einverstanden mit den Sachen, die Ruff sagt.
Und ich hab heute auch einen Ruff-Cycle gefunden.
Wo ich
einen Hinweis gekriegt hab von Ruff,
der gesagt hat, du musst das, der Generator,
ist unwichtig, ist nicht wichtig,
mach bitte eine Dict-Comprehension draus.
Dann hab ich eine Dict-Comprehension draus gemacht.
Dann hat er gesagt, ah, das ist eine unnütze Dict-Comprehension,
mach bitte einen Dict-Aufruf mit Generator drin draus.
Da war ich sehr amüsiert.
Wie man's macht, ist falsch.
Naja, Ruff hat ja auch so ein bisschen,
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
NamedTuple und NamedTuple,
was auch in dem Kapitel erklärt wird.
Also die sind schon,
sind schon unterschiedlich.
Aber jetzt, wo wir wissen, was eine Dataclass 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
Dataclasses durchaus als Code-Smell sehen
oder als Einstiegspunkt und als
das ist noch nicht fertig.
Und das Hauptargument, so wie ich es verstehe,
ist, dass wenn du eine Dataclass hast,
dann bedeutet das, dass du eine Klasse hast,
die nur Daten enthält und keine Funktionen hat.
Und du musst ja aber trotzdem was mit den Daten machen.
Und das bedeutet, dass die eigentlich schon Funktionen hat,
nur dass die irgendwo anders drinstehen.
Weil es nur ein Vehikel ist und das wäre blöd?
Weil, weil du, wenn, ja, weil du mit Daten halt irgendwas machen musst.
Und, und eigentlich bedeutet Dataclass 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, das, das hört sich für mich sehr nach,
also ich meine diese Namen, die immer da gesagt bekommt,
Martin Fowler und Kent Becks,
das hört sich für mich sehr nach Kingdom,
of the Nouns an.
Das hört sich für mich sehr nach Java an.
Das hört sich für mich sehr an nach,
der Code ist wichtiger als die Daten.
Und das stimmt halt in den, in ganz vielen Fällen nicht.
In ganz vielen Fällen sind die Daten viel wichtiger als der Code.
Was du da drin hast, welche Felder du hast,
wie du drankommst, ist, ist in ganz vielen Anwendungsfällen,
zumindest in denen, die mir so begegnen,
viel wichtiger als dann, als dann,
dass, dass die Funktionen direkt dabei steht
und dass du die direkt dazu packst.
Das ist die eine, der eine Aspekt.
Du gibst der Funktionalität mehr Gewicht als den Daten.
Und das ist oft nicht der Fall.
Das, da, da könnte man dann, mir fällt das Zitat jetzt nicht ein,
aber da, da gibt's eines von Linus Torvalds, wo er sagt,
na ja, so, das ist halt quasi oft ein Fehler von Leuten,
die quasi das Licht noch nicht so richtig gesehen haben,
dass sie halt Wert auf Algorithmen oder 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 den,
mit der mit den mit der Funktionalität ist dann ganz klar und einfach.
Hoffen, hoffentlich.
Und ja, aber ich würde, ich würde auch denken, dass genau, also für mich,
mich erinnert das auch total an irgendwie objekte orientierte Programmierung.
Ende der 90er ist halt irgendwie das Heilmittel für alles.
Und aber inzwischen wird man ja sagen, so na ja,
das aktuelle Heilmittel für alles ist halt Domain Driven Design.
Und aus der Perspektive ist es halt gibt's 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 es ist genau.
Und aber wenn das halt State hat und man dann braucht man halt vielleicht schon Methoden und so.
Also ich würde auch denken, also das ist differenzierter.
Ja, es gibt noch einen.
Es gibt noch einen zweiten Aspekt, der mir, der mir da fehlt.
In dieser Argumentation geht es ein bisschen in das, was du eben gesagt hast.
Die Leute, die sich noch nicht gesehen haben, wenn, wenn man, wenn man über Klassen nachdenkt
und die sieht als, als eine Anzahl von Funktionen und ein paar Daten dazu,
dann ist es ein anderer Blick auf, auf das, was man tut.
Es ist ein anderer Blick auf das Programm und was ein Programm kann.
Und und zwar ist es ein Blick auf einzelne Objekte.
Weil, weil wenn, wenn ich so eine Klasse schreibe, dann also in Python gibt's den Self-Parameter.
In anderen Sprachen heißt der This-Parameter, dann ist es immer.
Es gibt immer ein Objekt, was irgendwie hervorgehoben ist.
Es ist nämlich das Objekt, an dem ich gerade dran bin, in dem ich gerade drin bin.
Wenn ich aber den Blick habe auf eine Data-Class, dann geht es mir oft gar nicht so sehr um eine einzelne Instanz
oder ein einzelnes Attribut von dieser Data-Class, sondern dann, dann verändert sich mein Denken hinzu.
Was ist denn, wenn ich 1000 davon in der Hand habe?
Was ist denn, wenn ich eine Tabelle von diesen Objekten in der Hand habe?
Und und dann ist auf einmal gar nicht mehr das Einzelobjekt wichtig,
sondern dann ist auf einmal die Gesamtheit der Objekte wichtig.
Was ist denn, was ist denn, wenn ich, wenn ich, wenn ich eine Million,
von diesen Geldbeträgen bekomme, was kann ich denn dann damit machen?
Und und diese Art zu denken oder auch diese Art zu modellieren ist in der in der klassischen OOP nicht naheliegend,
weil im klassischen OOP denkt man eben oft über einzelne Objekte nach,
weil du eben eine Klasse schreibst, die eine Instanz hat.
Und für diese eine Instanz hast du diese Funktion dran.
Und wenn du die Funktion auf der einen Instanz aufrufst, dann, dann hast du diesen Blick auf die eine Instanz.
Und das ist was, was, das ist schwer zu greifen.
Und schwer zu erklären, aber das verändert das Denken über Programmstrukturen.
Und das verändert das Denken über die Inhalte von einem Programm.
Und das ist was ganz Gefährliches zu sagen, meiner Meinung nach, dass das ein Codesmail ist,
weil du nur diesen einen Blick auf Programmierung haben darfst.
Ja.
Und deshalb, ich bin da sehr skeptisch, wenn, wenn Leute sagen, Data Classes, ja, das ist schon okay.
Aber hier, das fängt direkt an, Data Classes are like children, they are okay.
The 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, 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, ich weiß nicht, dann zu Pedantic überzugehen,
was ja fast so was ist wie eine Dataklasse, mit so was wie Validierung.
Dann noch oder so.
Ja, aber auch das ist noch, Pedantic ist, sind natürlich, ja, sind schon Data Classes auch, oder?
Ja, ich würde, das sind halt, da gibt's dann eben, genau, das ist ein bisschen, das kommt jetzt in dem Buch nicht so vor,
weil das halt auch teilweise aktuelle, also das Buch ist ja relativ aktuell.
Aber gerade so der auf, sozusagen das, Pedantic, ja, genau, beschränkt sich mehr so auf die Standard.
Aber wobei ja auch das Vorbild von Data Classes in der Standardlib ist Atos, ist halt auch nicht, ja.
Es wird auch ein paar Bands am Ende, aber mehr so als Further Reading.
Ja, genau, aber sozusagen Pedantic 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 ich, da muss man vorsichtig sein, also ich glaube, da vermischt man dann, also Pedantic,
es ist natürlich auch praktisch, aber es vermischt halt zwei so Sachen.
Das ist einmal diese Klassenbilder-Geschichte mit den, den Annotationen, damit man halt sozusagen, ja, das halt,
kompakt hinschreiben kann, was man da für Attribute dran hat.
Das ist bei Pedantic ja genauso.
Und dann gibt's halt diesen Validierungsteil, der ist aber irgendwie anders, weil das hast du halt in Data Classes
und halt bei Name Tuple oder so eigentlich nicht.
Nicht mal bei Typing.NameTuple hast du Validierung.
Nee, gar nicht, genau.
Und da muss man halt extrem vorsichtig sein.
Also ja, 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,
schönen Vortrag von der letzten PyCon US, wo jetzt auch die Vorträge rausgekommen sind.
Und der heißt, glaube ich, "Design Pressure".
Der Entwickler heißt "Design Pressure"?
Nee, der Vortrag heißt "Design Pressure".
Aber ist das nicht, ist das nicht der, ist das nicht Hinek Schlaback?
Genau, ja.
Der ist doch auch Deutscher, oder?
Ja, ja, genau, den sollte man auch echt mal fragen, weil der hat immer tolle, tolle Artikel zu diesen ganzen,
er hat tolle Software geschrieben, tolle Artikel geschrieben, macht tolle Videos, toller Typ.
Müssen wir mal fragen.
Wenn du ihm diese Episode zeigst, möchte ich auch auf den Podcast kommen.
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, 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 Pydentic
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
einen guten deutschen Begriff gibt oder so, dass
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 Pidentik, 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 Pidentik-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
von, also
anstelle einer Dataclass halt ein
Pidentik-Modell verwendest.
Warum ist das blöd? Naja, weil du
dann zum Beispiel Pidentik importierst in deiner Business-Logik.
Und dann bist du davon
abhängig. Ja, und
genau, du hast halt
dann
diese Konzerns irgendwie miteinander vermischt
und dann kriegst du alle möglichen Arten von
üblen Design-Problemen, Architektur-Problemen,
ä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 Pidentik auch ganz
gut kann, und jetzt stellst du halt fest so, oh,
jetzt, äh, 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
Pidentik.
Pidentik. Und jetzt stellst du halt fest so, okay,
hm, irgendwie Pidentik ist zu langsam für mich.
Du wirst Pidentik niemals
austauschen können. Da kannst du dein Ding neu schreiben.
Das ist halt, äh, kannst du einfach völlig vergessen.
Und,
äh, ja,
das ist halt, wenn man, wenn man das
halt quasi nicht so, die,
nicht so gebaut hat, dass man halt Pidentik
austauschen kann, dann hat man halt, so ähnlich wie
bei, man hält von den Django,
wenn man Models Model erbt, ne, also
oft kann das ja auch okay sein und bei Pidentik kann das ja
auch oft okay sein, aber wenn du halt ein Großprojekt hast,
und dann, äh,
hast du halt irgendwann, willst du
Dinge anders machen, äh, dann kann es
gut sein, dass das nicht mehr geht.
Ja, okay, klar, natürlich.
Äh,
ja,
hm, fand das jetzt nicht so, dass, äh,
Kinder gegen ein Win.
Sollen wir, sollen wir mal zurückkommen zum
Buch? Ich glaube, da sind tatsächlich noch ein paar interessante
Sachen drin. Ähm,
diese, es werden
hier drei Alternativen, äh,
äh, genannt, also Collections.name,
tuple, typing, name, tuple und, äh, data
class. Und warum nicht
typedict?
Äh, typedict. Ja, das ist tatsächlich hier, äh,
äh, da lese ich, äh,
ich zitiere, typedict may seem like another
data class builder. Ja, ist es nicht. Genau.
Typedict does not build concrete classes that you
can instantiate. Genau, es ist ein, äh,
macht keine Klassen. 25 oder so was, kommt, geht ja noch mal drauf ein.
Ja. Genau, also das, äh,
das macht nicht solche Klassen, wie wir sie hier
brauchen, sondern das ist nur, wir brauchen...
Type annotations für Dicts, aber es funktioniert anders.
Genau, und es ist eine böse Falle, also,
ich hab, weiß nicht, wie oft ich das schon gesehen hab, dass
Leute denken, dass sie dann sicher werden
und, äh, aber nie MyPy oder
sowas ausführen und dann,
wenn man's dann mal ausführt, äh, kriegt man halt
gesagt so, ja, also das, was du da machst mit
dem typedict, das ist bei uns alles falsch.
Nie einer gemerkt.
Hat dir das Claude erzählt?
Nee, das, äh, mir begegnet
sowas ständig, also... Hat sich jemand ausgedacht.
Ja. Okay,
ähm, aber im Endeffekt funktionieren doch
diese drei, ähm, diese drei Verfahren
alle irgendwie gleich. Du hast, du musst irgendwie eine
Definition schreiben und du sagst, ich möchte jetzt eine Klasse
haben, die soll einen, 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, kannst du ja immer noch...
Selbst wenn du deine Dataclass schön mit
Types versehen hast, äh, kannst
du ja immer noch reintun, was du möchtest.
Also, ein Tupe wäre jetzt immutable, dann muss ich ein Frozen
machen bei der Dataclass, ne? Ja.
Genau, aber das hat mit, auch das hat mit
den Types nichts zu tun, äh, du kannst auch,
also, äh, auch das Typing.Name
Tupe kann ja, äh, andere
Sachen nehmen. Das ist ja erstmal nur eine Absichtserklärung.
Ich beabsichtige,
dass dieses Attribut nur ein Int sein
kann, aber da hält dich niemand davon ab.
Hm, kannst auch eine Liste reinmachen.
Das ist ja generell bei Python so.
Okay, ähm, aber ich find's interessant,
weil, ähm, im Wesentlichen
gibt's da zwei verschiedene
Syntax-Möglichkeiten.
Und die eine, das ist die von
NameTupel kommt, wo man halt sagt, ich möchte
einen NameTupel haben und dann ruf ich die Funktion
oder ruf ich den, den Konstruktor
NameTupel als Konstruktor auf und sag eben,
die, 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 krieg ich da
eine Klasse raus. Oder besser gesagt,
ich krieg nur einen Konstruktor raus für eine Klasse. Ich krieg ja
nicht meine ganze Klasse raus, sondern ich krieg nur den Konstruktor
raus. Ähm,
und, und das ist so ein bisschen irgendwie so eine
textuelle Beschreibung. Und ich hab 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ßenrum
geht und, und um
den, um den Interpreter außenrum
geht und dass man irgendwelche
langsamen, magischen Sachen macht.
Aber ich glaube tatsächlich,
man muss da weg davon und muss sagen, okay, dieses,
dieses Herstellen der Klasse, das ist langsam,
aber das ist, 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 das, die
verbrauchen auch nicht mehr Speicher. Also diese Namen
werden nicht bei jedem, bei jeder Instanz dazu gespeichert.
Ist nicht wie bei einem Dictionary.
Ja. 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. Ja. Und das
bedeutet dann Index 0 und Index 1. Ja, das sieht
viel schneller aus tatsächlich. Also, also lange Zeit
war, war ein Tupel auch irgendwie deutlich
schneller. Also, wobei nichts ist so schnell
wie tatsächlich einfach, äh, quasi
wenn man eine Klasse instanziiert.
Aber Name-Tupel war dann halt die schnellste Alternative.
Ähm, äh,
und wenn man jetzt, früher war das
halt oft so, oder,
wenn man halt, äh,
Attribut-Lookup macht, äh,
dann ist das bei Name-Tupel natürlich schneller.
Äh, also irgendwas
Punkt Instanz, Punkt irgendein Attribut.
Äh, weil Tupel Index.
Genau, genau. Und inzwischen
macht aber Dataclasses und auch,
äh, glaube ich, Name-Tupel, wenn man
davon erbt, per Default irgendwie Slots.
Vielleicht erzähle ich jetzt auch Unsinn. Das müsste,
muss man irgendjemand nachgucken, ne? Aber ich glaube,
das ist tatsächlich so. Das Fazit ist,
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 Daten-
Objekten zu langsam gewesen wäre.
Das heißt, es ist auch wieder so ein Jagdnifal. Das ist so eine,
so eine Angst, die ich mal im Kopf
hab, die aber eigentlich in dem Moment noch
nicht berechtigt ist.
Große API-Responses, oder,
oder, oder wo du Zeugs reinkriegst, weil da
kann das schon, so bei, so
wenn du halt irgendwie 10.000 Dinger,
in Objekte verwandelst und dann ist halt
deine Objekte erzeugt. Ja, aber gut, wenn da Jason reinkommt,
hast du ja eh schon verloren. Ja, aber es gibt ja
schnelle Jason-Parser, aber wenn du, du musst es ja
nochmal zu Objekten machen. Aber du kriegst ja auch einen Dikt.
Krass.
Ja. Wie auch immer,
für mich der Takeaway ist,
ich hab da immer so ein bisschen Hemmungen, ich hab 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, 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, das sieht anders aus? Also ich finde, wenn du das jetzt
in dieser, vom Typing oder
vom Collections importierst, dann kannst du ja Klasse schreiben.
Sieht ja fast aus wie eine Dataklasse.
Ja, genau, das kannste
machen. Das sieht auch normal aus.
Das ist auch was, was ich empfehlen würde.
Das
kannst du machen, aber dieser Konstruktor,
der Name-Tupel-Konstruktor, also das ist tatsächlich
alles klein geschrieben und dann musst du da Strings
reingeben.
Ja, das ist schon hässlich.
Was daran auch komisch ist halt,
also einmal, ich find's auch ehrlich gesagt ein bisschen hässlich,
weil das ist uralt, ja, das gibt's schon ewig.
Das ist super praktisch.
Das ist natürlich manchmal super praktisch, wenn man halt
irgendwie auf alten
Interpreter-Versionen rumguckt, aber
genau, das funktioniert wahrscheinlich bis,
also da gibt's 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 wenn man Leute verwirren will oder
so ein bisschen Obfuscation, ne?
Nee, nee, nee, das ist nicht gut.
Nee, dann gehen wir über zur Typing-Name-Tupel, weil Typing-Name-Tupel
hat nämlich Klassen-Syntax.
Und die ist tatsächlich, ich find die sehr
schön.
Es wird gleich noch
ein Problem beschrieben werden, was ich auch tatsächlich
sehe, jetzt, wo ich's gelesen hab.
Aber es ist so ein bisschen
so, wie man sich's 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 sag, Class, dann den Klassennamen
abgeleitet von Name-Tupel.
Was aber so ein bisschen
nicht ganz
richtig ist. Weil die MRO
da gar nicht drin ist, weil das nur eine Meta-Klasse ist,
weil da nämlich gar nicht tatsächlich ein Name-Tupel drin ist,
sondern ein richtiges Tupel. Genau.
Und dann innerhalb von der Klasse
geb ich einfach die Attribute an, die ich
haben möchte mit ihrem Typen. Also hier in dem Fall
Beispiel
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 Hauptanweis. 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 es schon das
zweite Mal, dass ich jetzt wieder das Trinkspiel mache, was wir
letztes Mal angefangen haben, Johannes. Ja, ich
weiß, das ist mein Wort, was
zu oft kommt. Wir sagen das jetzt nicht
nochmal.
Bei
Data-Klassen ist es 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 ran.
Ja, das mache ich auch.
Ich gehe eigentlich schon raus aus dem Data-Klass.
Aber ich mache das tatsächlich relativ häufig, dass man irgendwie auffällt,
ich hätte noch gerne kann und doch das Maximum und die Summe
berechnen von irgendwas. Ja.
Das war schon super praktisch. Ja, ja, natürlich.
Das ist auch richtig. Genau.
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.
Dynamic Attribute and Property.
Wir verschieben das.
Das Meta-Programm ist Kapitel 24.
Kapitel 24, also
nur noch 19 weitere Episoden
und schon sind wir über das Buch Fluren passen.
Ja.
Dazwischen natürlich noch die anderen.
Okay, aber dann
dieses Kapitel macht ja jetzt hier eine totale,
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.
Und das fand ich interessant, als ich es gelesen
habe, weil das war so
ein Twist, den ich nicht erwartet hatte.
Er hat deswegen
darüber gesprochen, weil er gesagt hat, dass es
total cool ist, wenn man jetzt Match-Case
benutzt. Und das liegt auch daran, dass das
Ja, aber das ist dann der dritte, das ist der nächste Twist.
Ach so. Ja, das wurde ja
gerade erst eingeführt, als das Buch rauskam. Ich glaube, deswegen ist da so
die Emphasis auch so ein bisschen
tiefer. Ja, vielleicht war es auch nicht genügend
für ein, ups, jetzt geht hier mein
Aufnahmekomputer gerade aus.
Vielleicht ist es auch noch nicht groß genug
für ein eigenes Kapitel, aber ich finde es interessant,
dass hier so Type-Ins
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,
ich habe mir ja die Inhaltsangabe
hier die Sachen durchgelesen alle, aber
da habe ich da mitgerechnet,
dass das jetzt hier so eine Abbiegung
macht und dann sagt, ach so, übrigens, hier
lassen Sie über Typen sprechen.
Also kommt natürlich nachher nochmal, aber
ja.
Ja, ist natürlich schon auch so ein bisschen naheliegend,
weil man muss halt jetzt dann irgendwie,
wenn man schon erklärt, wie das
da bei diesen 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, da muss man ja irgendwie
andere Annotations
irgendwie erwähnen und dann, ah, dann ist man ja
mittendrin in den Typ-Annotationen irgendwie.
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, das
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,
Data-Class ist doch Data-Class,
dann schreibe ich Class den
Klassennamen, also in dem Fall jetzt hier Class-Coordinate
und im
Klassenkörper schreibe ich dann die Attribute, die
die Instanzen haben sollen. Und
das, 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 erstmal ein Klassenattribut.
Und hier in dem Fall,
wenn ich jetzt aber Latitude
Doppelpunkt Float, also Latitude
getypt mit dem
Float-Typ hinschreibe, dann ist es
auf einmal ein Instanzattribut.
Und
dieser Unterschied wird hier
in einer gewissen Länge diskutiert,
weil der wirklich sehr wichtig ist, weil es sehr
leicht ist, diesen Unterschied zu machen, diese beiden
Sachen sind sehr nah aneinander und die sehen sehr gleich
aus, machen aber dann andere Dinge
und sind eigentlich anders als
das, was in Python so
normal ist. Das heißt, da muss man schon
besondere Vorsicht.
Du musst nochmal bitte den Unterschied genau erklären
zwischen diesem Instanzattribut und dem
Klassenattribut. Ich habe nämlich schon mehrfach Menschen
gesehen, die das so gewohnt waren,
dass das halt dann immer ein Instanzattribut
ist, was man da direkt unter die Klasse
schreibt, dass sich das erst später
festgestellt hat. In anderen Sprachen ist 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.
Gerade 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,
sagst du halt jetzt, schaffst
es irgendwie, dass tatsächlich irgendwie
ein Klassenattribut
defaultmäßig zum Beispiel eine Liste ist.
Also indem du das auf Ecke Klammer auf
Klammer zu setzt oder
so, dann... Oh, das ist jetzt
aber ganz hässlich. Und du
überschreibst das nicht nachher noch mal
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. Und das ist halt... Deswegen ist das eine Konvention,
wie man das macht. Und zwar kann man das nennen
Cache-irgendwas
oder... 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.
Das ist ganz gut, aber damit kann man
sich hart infuschen. 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
gefährlich, ja. Ja, und
generell Klassen, also ich mache ja 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
zusammentun 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
Dataclasses schon auch auf die Finger haut, wenn du
da irgendwie einfach eine Liste
hinschreibst oder so, dann sagt dir das
so, nee, nee, das kannst du aber nicht machen. Du musst ja
irgendwie dann Default,
wie heißt das Ding,
Field, Factory
angeben, genau.
Aber da kommt es natürlich rum.
Es gibt ja 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.
Ich weiß auch nicht, wie
ihr das so macht. Also
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 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 Liste und dann
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-Type
hin. Der kannst du auch optional nehmen, ist auch hässlich.
Unknown gibt es da noch
dazu? Ja, aber Unknown, uh,
da ist ja schon, wer kennt denn das? Annie.
Ja, uh.
Oder Annie. Es gab noch
einen dritten Type-Hint, 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 Typ-Checker 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 dann, tatsächlich irgendwann im Code
sagt er immer, hey, du hast ja nicht auf None geprüft
und dann lintet dir das alles, weil du musst
vorher mal so ein Assert-is-not-None machen.
Ja, 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.
Der Typ-Checker sollte dir sagen, so, nee, das darf nicht None
sein. Und du hast dieses None ja
nur benutzt, damit du es initialisieren
konntest. Das ist ja, hat ja gar nicht,
wenn in deiner Logik nicht None
vorkommen darf, was ja dann oft bei diesen
Initialisierungsgeschichten gar nicht so ist,
dann darf das da nicht drinstehen.
Und 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?
Und was machst du? Oder umgekehrt,
umgekehrt, du
machst es wie in Java, wo jeder Typ optional ist
und hast dann auf einmal an, in jeder
Scheißfunktion, in die du reingehst, musst du acht
Variablen auf Null überprüfen. Ja, das ist
natürlich auch, genau, das ist auch hässlich. Also insofern wird es dann,
nee, also ich würde sagen,
aus der Perspektive betrachtet, musst du eigentlich
sagen, nee, das darf nicht None 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.
Das kannst du, das kann, ja,
ja, das war da auch wieder verwirrend.
Nee, kannst du ja auch
nicht gut machen. Nee, was ich an der Stelle
mache, ist, ich nehme ein, das ist ein
Trick von. Oh, eine Sentinel. Eine Sentinel. Ja,
genau, von Luke Plant
hat er das, 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,
äh, Falls
evaluiert und
ähm, äh, 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?
Ja, Entschuldigung.
Schwer enttäuscht.
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.
Bei 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,
wie würdest du das mit dem Auto machen?
Das habe ich jetzt nicht verstanden.
Eine eigene Klasse Auto.
Es ist halt Auto.
Ja.
Und, also das importiere ich dann irgendwo her.
Und, also der Default-Wert ist Auto.
Die Annotation ist so, wie sie halt sein soll.
Also zum Beispiel.
Ja, okay, und dann?
Und dann sage ich, if das Ding, if not das Ding,
dann setzt es neu.
Okay, aber wenn jemand eine leere Liste reingeben würde,
würdest du es dann auch neu setzen?
Also der Unterschied ist tatsächlich nur,
dass er halt none sparen kann.
Aber dann würde ja,
wenn das, wenn das halt nicht okay wäre,
dann würde ja der Type-Checker meckern.
Also du hast halt nicht,
wenn das Ding ist none.
Nee, du hast einen semantischen Unterschied eingeführt.
Ja, if not, schreibst halt nicht,
if not foo, dann, also ne,
du schreibst if not foo,
dann foo neu setzen, oder ne,
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 ist-Geschichte
und ich mache es halt so,
wie es Leute mit none machen.
Wobei die ist-Geschichte könntest du ja,
du könntest ja immer noch fx-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
und 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?
Hä? 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 also ich mache es halt jetzt gerade so,
ich leide dann auch mal ein bisschen drunter,
dass zum Beispiel LLMs,
die halt das gewohnt sind,
dass Leute da none oder none 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.
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ß jeder, was gemeint ist?
Nee, das wissen Leute dann halt dummerweise auch nicht,
das wäre auch schon passiert.
Wenn das das LLM schon nicht weiß.
Ja, genau.
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, Pattern-Matching, oder?
Das ist ja ein 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.
Okay, 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,
das ist eine Straßenadresse,
dann,
guck dir, okay, hier ist eine Straßenadresse,
passt da rein und gehst weiter.
Und du kannst da bestimmte Attribute omitten,
indem du die einfach auf dann setzt,
falls das verständlich ausgerichtet ist.
Und kannst damit relativ schön Cases abfangen
und hast dann irgendwann einen Standard-Case.
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.
Ich glaube, das ist für
den 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,
also 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.
Ja.
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 das erste Mal
habe ich Pattern-Matching gesehen.
Da war ich noch ein junger Mann
damals und das war in Erlangen.
Ah, ja, ja, ja, gut.
Und da ist es ja ein
Core-Language-Feature.
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
das und das und jedes Mal.
Und da ist es ja nicht, da geht es nicht so sehr um
Parser, 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ß, ich weiß auch nicht.
Ich weiß auch nicht. Kann man verschiedene Exception-Types
gucken oder, ja.
Ja, aber die fange ich doch in dem Accept,
in den Accept-Blocks schon ab, die verschiedenen
Exception-Types. Da gibt es doch schon Syntax für.
Und für die verschiedenen Instanz-Typen
muss ich eher irgendwie
in Funktionen reinverzweigen.
Und, ach, ich weiß irgendwie nicht,
ich würde es gerne mehr benutzen. Ich weiß nicht, ob das
ein Problem an mir ist
oder ob das ein Problem an...
Also ein Problem
war eine ganze Zeit lang auch,
also jedenfalls, als das Feature total frisch war, für mich
jedenfalls auch, dass ich mir gesagt habe,
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 jetzt 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?
Genau, nicht 3.10, meinte ich nicht.
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 sagen, jetzt ist
sicher, dass man es eigentlich immer verwenden kann.
Insofern, ja,
muss man mal gucken, ob es da nicht doch mehr Use Cases gibt,
als man so denkt. Aber es ist auch
fiese Syntax, also ich habe mir dazu auch schon ein paar
Vorträge angeguckt 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, ne, so man
sagt irgendwie match unknown und dann machst du
eine Case List
or Tuple und wenn man die dann
nicht instanziiert mit den Klammern,
dann ist es immer true. Dann ist es kacke, weil es
always true ist, weil der nach der Funktion
guckt und nicht guckt, ob es ein List oder ein Tuple ist.
Genau.
Ja, 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 auch irgendwie
etwas, was halt in anderen Sprachen anders
ist und, äh, ja, es gibt ja schon so
ein paar Falschstricke, also
naja.
Und dass man den am besten immer handeln sollte, genau,
in Python, dass man... 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.
Na, nicht falsch.
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, äh, ist das
Quantum-Sort, ja?
Kennt ihr den, kennt ihr den Quantum-Sort-
Algorithmus? Der ist ein O von 1, äh,
Sortier-Algorithmus.
Aha. 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
bist, ist, dass da bist du immer
überrascht.
Überlebst du immer.
Schneller? Geht nicht mehr.
Also, es, dieses Kapitel macht
mehrere interessante Wendungen und
und es schneidet einige,
einige Sachen an,
die, die interessant sind,
die aber so ein bisschen über Data
Classes hinausgehen.
Ja. Es, ich muss ja, ich muss ja
sagen... Macht ihr denn lieber in Data
Classes oder lieber in M-Tupels?
Lieber Data Classes. Ja, ich auch. Lieber
Data Classes. Ich weiß jetzt gar nicht so genau, warum.
Ja, weil
das ist, weil das gutes Marketing hat.
Es steht auch hier
in dem, also 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.
Ja, ja. Deswegen auch direkt M-Tupel,
ist ein Tupel. Ja, also ich...
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, 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 Daumenriegel für
ja, diesen Kram. Und
ja, ich glaube, in allen Fällen, wo ich Data Class verwende,
könnte ich wahrscheinlich auch einen Tupel verwenden, aber
ja. Ja, aber es ist
schon bequemer, dass man die Namen schreiben kann,
das ist schon, das ist schon cool.
Ja. Das kannst du bei einem Tupel auch.
Ja, genau, aber dann, also kannst du nicht ein
normales Tupel nehmen. Nee, nee, aber ein Named Tupel
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 Named Tupel, weil ich gerne die Namen verwende und ich
mag Indizes nicht so.
Ja, okay.
Ich verwende Tupel sehr häufig.
Ja, ich würde so implizit
für Multiple Return values. 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 unsichtbar.
Da willst du ja dann nicht ein Named Tupel verwenden, ja.
Ja doch, also warum nicht? Als Returnwert ein Named Tupel, dann hast du
schon Type Annotation und kannst danach auf die Attribute
des Dings wieder zugreifen. Ach, viel zu viel Arbeit.
Ja. Viel zu viel Arbeit.
Einfach zwei Werte zurückgeben, zack.
Zack, zack.
Dies und jenes.
Dies und jenes wird dann vielleicht auch das und dafür wird ein Match Case
wieder gut.
Ja, sorry.
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.
Okay, also. Das ist doch was Gutes.
Also, was ich gerne picken würde und
ja, ich weiß nicht, ob die so viele
Hater haben wir gar nicht, aber das wäre ein guter
Hook für die Hater.
Wir hätten erst einmal einen, wenn ich mich aktiv verändere.
Und zwar,
was mir momentan tatsächlich...
Nachts um halb drei mit einem Ton, da war ich auch schon vor.
Ja, aber, also, was mir
tatsächlich momentan richtig viel Spaß macht, ist
ein Tool von Anthropic
und zwar heißt das
Claude Coot und
das ist quasi so ein
LLM-basierter
Kommando-Teil...
Dein neuer Pack Engine.
Ja, weil, ne, genau.
Ja, was ist ein Agent?
Ja, schwierig, aber...
Was ist ein Agent?
Ja, also, das Ding ist einfach nur,
es ist halt ein LLM und es
läuft in einer Schleife und macht halt
Dinge und
das funktioniert, also, ich will
jetzt gar nicht so definieren, was das ist.
Und hast du Claude 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 eins, weißt du,
im Server, da kannst du dich austoben, ein bisschen Budget
dafür.
Ich habe mal gefragt, also auch Claude,
ob
das jetzt eigentlich mich ersetzt
oder ist das, ne, 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.
I agree.
Die Bromance zwischen dir und
Kai.
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
untertrieben, weißt du, wenn du jochen beim Arbeiten
zu guckst, dann schlägst du die ganze
Zeit gut 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
drauf gucken ist das, was dich vom Vibe unterscheidet,
das heißt, das ist das, was dich vom Vibe unterscheidet,
das ist das dann? Ja, ja, nee, das ist nicht Vibe-Coding, was ich,
also ich nenne das manchmal
bosnacherweise Vibe-Coding, um die
Leute, um die Leute zu ärgern,
die... Keine Sorge,
das ist nicht Vibe-Coding, das warst du.
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 der
davon abdenkt, dass das total anstrengend ist.
Das war mal gut definiert und zwar als
Vibe-Coding ist halt dann, wenn 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, der hat es geklaut.
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 irgendwie mal anders definiert.
Ja, aber es gibt in dem Bereich halt schon so viele Worte,
die halt ihre Bedeutung verloren haben, dass
jetzt so das... Ja, okay.
Naja gut, ist auch wurscht, kann man
auch nicht mehr sagen.
Ja, zurückholen.
Meinetwegen ist es auch Vibe-Coding, aber
es ist tatsächlich so, dass ich damit halt
viele
Dinge irgendwie jetzt so machen kann, die
vorher mühselig waren und jetzt sind sie halt nicht mehr so mühselig
und auch
quasi das über Copy-Paste
oder halt über Cursor
oder sonst wie Copilot
kann man das ja auch machen. Das hat auch schon alles ganz gut
funktioniert, aber Cloud Code ist tatsächlich
für mich nochmal eine deutliche Verbesserung.
Also das 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 in einem Ausschuss, weiß ich nicht,
NITN?
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.
Ja.
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 weil, ich kann jetzt jeder
Marketeer 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's
ja schon so ein bisschen. Das ist,
ja,
erzeugt halt viel Zeugs, viel Code,
den man halt kaputt machen kann.
Oder halt auch nicht, ne?
Oder ist der kaputt? Wen braucht man dafür?
Die richtigen Ingenieure wie uns,
um das hier zu reparieren? Oder schafft
das dann Cloud Code selber?
Naja, also ich meine, für den
Anwendungsfall, dass du halt überhaupt erst mal
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
auskommt.
Der so aussieht, als würde er funktionieren und
nach zweimal Gegenpusten zusammenbricht. Und das ist
kein Unterschied mehr zu dem, was du dir einfach da
viben kannst. Und das ist das, mit dem die
meisten Leute irgendwie in der Branche irgendwie
ihren Umsatz gemacht haben. Und das ist jetzt einfach quasi
obsolet.
Oder was war ein, der das so gespeichert hat?
Du bist ja immer noch dann abhängig auch da von dem
Service und so. Also, naja.
For business leaders, ne?
Un-fuck-it-a-eye.
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, das macht für mich
jetzt mehr Aufwand. Ich kann schon programmieren,
ich brauch das nicht. Ja gut, aber so eine
Postcast-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.
In Intercode. 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.
Wenn ich die auf meinem Produktionsserver dann ausrollen möchte,
dann müssen die irgendwo sein.
Dieses irgendwo heißt normalerweise Registry.
Ja, Docker-Hub kannst du nehmen, wenn du
Open-Source machst, wenn du keine Geheimnisse
hast, wenn du alle deine
Sachen offenlegen willst auf der Welt.
Ansonsten ist es eine Artifactory oder so.
Artifactory, Nexus
oder in die Amazon,
in so eine
private Registry für Amazon.
Aber jetzt gibt es hier ein Projekt,
das heißt Unregistry.
Und damit kann ich
direkt von meiner Maschine auf
die 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überkopieren 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 eine Registry wäre
und wenn du sagst, hier push mal auf den Server,
dann macht es dort einfach kurz eine Registry auf,
dann pushst du dahin und dann ist es bei
dem Server, bei dem
Produktions-Server
einfach 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, wenn du
dir Sachen aufbewahren möchtest, dann brauchst du
eine Registry, ja. Ja. Achso.
Achso, wenn du, achso meinst du History von
Images. Ja. Ja, okay, das, ja.
Ne, das ist ja eben
Unregistry. Ja, ja, ja. Das hast du jetzt nicht mehr.
Und das will ich auch in ganz vielen Fällen einfach
nicht haben. Ja, ist eben meistens noch Müll und Ballast
der Stromverbrauch. Ich hab immer nur Latest. Es gibt nur
Latest.
Aber wenn du was kaputt gemacht hast,
Jonas, da musst du ja dann wieder zurück, anstatt
dass du vorwärts gehst. Ja,
war gut, aber das hab 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.
Macht's gut.