Transcript: Fragen über Fragen

· Back to episode

Full episode transcript. Timestamps refer to the audio playback.

Dominik

Ja, hallo liebe Hörerinnen und Hörer. Willkommen bei einem Python-Podcast in der 15. Episode.

Dominik

Hier ist der Dominik, bei mir ist der Jochen. Wir sind wieder im Wintergarten.

Dominik

Hallihallo.

Dominik

Diesmal scheint sogar noch die Sonne zu sein. Wahnsinn.

Jochen

Ja, es ist auch selten, dass wir aufnehmen, wenn es noch hell ist, aber heute hat es geklappt.

Jochen

Ja, wir haben tatsächlich Dezember irgendwie.

Jochen

Ja, der 12. Dezember, genau. Vielleicht gar nicht so schlecht, wenn wir das mal dazusagen, wann das ist.

Dominik

Ja, wir haben uns ein bisschen Zeit gelassen in letzter Zeit mit den Folgen, es war so viel zu tun,

Dominik

aber wir versprechen, wir werden es nicht aufgeben und euch weiter damit bespaßen können.

Dominik

Ich wollte ja nicht belästigen sagen.

Jochen

Ja, genau. Das ist aber die Frage, was man da empfindet, wenn man das hört.

Dominik

Unsere Folge heute soll wirklich mal so eine Anfängerfolge sein.

Dominik

Ja, wir werden mit euch heute reden über ein, zwei Fragen, die wir stellen möchten.

Dominik

Was für Anfänger für Fragen haben oder was mir eingefallen ist oder was einige Hörer uns geschrieben haben.

Dominik

Worum es eigentlich bei Python geht. Ein paar ganz grundlegende Sachen.

Dominik

Vielleicht wird es ja spannend.

Dominik

Also, ja, keine Lava-Folge, kennt ihr schon.

Dominik

Wen ihr schon gehört habt.

Dominik

Ja, ja.

Jochen

Genau, das mit den Themen können wir auch

Jochen

irgendwann mal klassen.

Jochen

Die nächste Lava-Folge.

Dominik

Ja, was machen wir hier eigentlich heute?

Dominik

Und was ist so passiert in der Szene?

Dominik

Und gibt es irgendwas Neues?

Jochen

Nee, nicht, dass ich, ich glaube,

Jochen

seit dem letzten Mal hat sich da gar nicht so viel getan.

Jochen

Django 3 ist raus.

Jochen

Oh ja, doch, ja, richtig, du hast recht.

Jochen

Ja, tatsächlich, Django 3 ist raus

Jochen

und das war, das ist natürlich eine tolle Geschichte.

Jochen

Ich habe das direkt mal versucht

Jochen

zu installieren und da so ein paar Sachen

Jochen

irgendwie mitzumachen, aber

Jochen

habe dann feststellen müssen,

Jochen

dass ein Haufen der Abhängigkeiten, die man so defaultmäßig

Jochen

irgendwie in Django-Projekten drin hat,

Jochen

dann nicht mehr so richtig

Jochen

funktioniert haben, beziehungsweise dazu führen, dass man

Jochen

halt ein Traceback kriegt, wenn man was für den Entwicklungsserver

Jochen

zu starten und

Jochen

ja, unter anderem sowas wie

Jochen

Django-Model-Utils, was

Jochen

irgendwie fast alle Leute, also ich verwende

Jochen

das eigentlich immer. Wahrscheinlich auch eine Menge andere Leute

Jochen

wegen

Jochen

Timestamp-Model oder so, was man ja

Jochen

oft verwendet.

Jochen

Ich weiß nicht mehr genau,

Jochen

was es noch alles war.

Jochen

Ich habe dann für die Sachen, die

Jochen

nicht funktioniert haben, da habe ich dann

Jochen

einfach die geforkt auf GitHub

Jochen

und

Jochen

habe das dann versucht zu fixen und dann halt

Jochen

entsprechend immer Pull-Requests aufgemacht.

Jochen

Also das heißt, ihr könntet bei Jochen

Dominik

in den Repos versuchen, die auch bei

Dominik

Dango 3 funktionieren?

Jochen

Nein, nee, das sollte man vielleicht

Jochen

nicht machen, also

Jochen

Daran wird sich das irgendwie

Jochen

mitten oder so, nee, nee, nee

Jochen

Aber es hat mich gewundert, wie viel da noch

Jochen

nicht funktioniert hat, also es war bei so einem

Jochen

normalen, ich weiß nicht, bei welchem

Jochen

ich das probiert habe, entweder bei einer Webseite oder

Jochen

auch bei der Python-Podcast

Jochen

Projekt-Dings

Jochen

habe ich mal versucht, das auf Django 3

Jochen

umzustellen und das ist

Jochen

mit fünf

Jochen

Einhängigkeiten oder so sind kaputt gegangen

Jochen

und ich glaube, ich habe auch so fünf Pull-Requests

Jochen

irgendwie gemacht. Also bei Danko gibt es irgendwie

Dominik

immer drei oder vier Versionen, oder nee, drei.

Dominik

Also 0, 1 und 2 und dann ist

Dominik

nämlich das Major Release. War das nochmal was?

Dominik

Also ich glaube 0 ist immer so die neue

Dominik

Feature-Sachen? Nee, ist immer

Jochen

gerade, ungerade. Gerade

Jochen

sind immer die Long-Term. Ich glaube

Dominik

2 ist Long-Term. Punkt 2.

Dominik

Also 2.2, 1.2, 3.2

Dominik

sind die Long-Term.

Dominik

Und 1...

Dominik

Ich bin mir sicher. Okay, gut, sehr gut.

Dominik

Und 1 ist irgendwas anderes, das weiß ich

Dominik

nicht. Aber ja, deswegen habe ich nur gefragt.

Dominik

was man dann macht? Also für Security-Patches dann wahrscheinlich

Dominik

mal die Zweier-Version nehmen, dass man irgendwie stabil sein möchte?

Jochen

Nee, also das, was tatsächlich

Jochen

empfohlen wird eigentlich,

Jochen

also das ist auch so eine Legacy-Geschichte,

Jochen

das mit den Long-Term-Support-Geschichten.

Jochen

Und

Jochen

naja, jedenfalls sagt das

Jochen

derjenige, der aktuell irgendwie

Jochen

da ja auch hauptruflich

Jochen

für das Django-Projekt arbeitet,

Jochen

Carlton Gibson,

Jochen

dass er empfehlen würde

Jochen

und das machen eigentlich alle

Jochen

Leute, die

Jochen

da wirklich viel Ahnung

Jochen

von haben, dass man halt, also

Jochen

früher war das wohl mal anders, aber mittlerweile sind

Jochen

die neuen Versionen von Django so stabil

Jochen

und so gut getestet, dass man eigentlich

Jochen

immer möglichst nah dran an

Jochen

der Entwicklung bleiben sollte.

Jochen

Weil es auch gar nicht mehr so schlimm ist, bis dahin

Jochen

abzudaten. Es geht gar

Jochen

nicht mehr so viel kaputt. Sollte eigentlich nicht.

Jochen

Ja, wir haben gerade gesehen, genau.

Jochen

Also eigentlich, weil das halt

Jochen

macht halt viele andere Sachen deutlich einfacher, wenn man

Jochen

das so rummacht. Und wenn man halt

Jochen

auf der Long-Term-Support-Version sitzt, dann

Jochen

ja, hat man halt irgendwann

Jochen

ein großes Problem und das

Jochen

will man vielleicht dann doch nicht. Also

Jochen

die Art, wie man das heute macht, aber auf der anderen Seite machen das

Jochen

viele Leute schon seit langer Zeit so.

Jochen

Insofern kann man, die kann man auch nicht einfach alle so vor den Kopf

Jochen

stoßen, aber

Jochen

so wie man das heute eigentlich machen

Jochen

sollte, ist eigentlich immer die aktuellste

Jochen

Django-Version verwenden.

Jochen

Okay. Und ich

Jochen

versuche das auch immer und normalerweise funktioniert, also bis jetzt

Jochen

auch die 2er-Serie hat das eigentlich sehr gut funktioniert,

Jochen

bis jetzt Umstieg auf 3, da hat es halt nicht mehr funktioniert.

Jochen

Und das war auch in allen Fällen das gleiche Problem.

Jochen

Und zwar sind halt so ein paar private APIs

Jochen

für die Unterstützung von so alten Python-2-Geschichten

Jochen

sind jetzt aus Django 3 rausgeflogen.

Jochen

Also eigentlich gibt es ja keinen Python-2-Support mehr,

Jochen

auch seit Django 2 schon nicht mehr.

Jochen

Oh, das läuft ja aus.

Dominik

Wir können ja runterzählen, es sind nur noch Tage.

Jochen

Ja, es sind nur noch Tage, bis es irgendwie vorbei ist.

Jochen

18, 19.

Jochen

Ja.

Jochen

Ja.

Jochen

Aber es waren noch so ein paar

Jochen

Geschichten dabei,

Jochen

so zum Beispiel, man konnte irgendwas, es gab so einen

Jochen

Dekorator-Pi2-Unicode-String

Jochen

oder sowas, den man über Funktionen

Jochen

setzen konnte und dann kam das halt mit

Jochen

auch den alten

Jochen

Geschichten klar und

Jochen

Six gab es halt auch

Jochen

in Django drin.

Jochen

Was auch immer Six ist. Ja, auch so eine Geschichte, die einem

Jochen

helfen soll, damit

Jochen

umzugehen, wenn es halt

Jochen

ja, Python 2

Jochen

und Python 3 Geschichten sind.

Dominik

Ich unterbreche dich gerade ungenau. Wir haben eigentlich versprochen,

Dominik

dass es eine Anfängerfolge sein sollte.

Dominik

Und wir fangen schon mit der Ahnung ganz tief in die Materie reinzugehen.

Dominik

Nee, das ist eigentlich auch nicht so.

Jochen

Es sind ein paar Hilfsfunktionen,

Jochen

die einem dabei helfen, das für Python 2

Jochen

und Python 3 gleichzeitig zu machen.

Jochen

Die sind jetzt tatsächlich

Jochen

entfernt worden. Die waren vorher bloß deprecated,

Jochen

aber jetzt sind die halt wirklich weg.

Jochen

Und das heißt, wenn jemand die noch

Jochen

verwendet, ein Paket, die noch verwendet,

Jochen

dann gibt es halt ein Traceback an der Stelle.

Dominik

Also alles, was jetzt in Python 3 deprecated

Dominik

angezeigt wird, ist bei Python 4 dann weg.

Dominik

Bei Python, sag ich schon. Bei Django 3, 4.

Dominik

Ja, also diese

Jochen

Geschichten waren jetzt halt dann

Jochen

weg. Und das hat

Jochen

dann auch diverse Pakete gebrochen

Jochen

und insofern, ja, also

Jochen

Umstieg auf Django 3 nicht so super easy.

Dominik

Wie lange ist es, bis Django 2 rauskam?

Dominik

Wie lange das her ist?

Dominik

Ich weiß es nicht mehr genau.

Jochen

Ich würde mal so tippen. Ages.

Jochen

Ja, fast zwei Jahre oder so.

Jochen

irgendwas um die zwei Jahre ein bisschen?

Jochen

Das geht ja. Ja, also die

Jochen

Release-Zyklen bei Django sind ja auch viel kürzer geworden.

Jochen

das war früher alles viel länger und

Jochen

ja, Django 2 gab es

Jochen

jetzt gar nicht so lang. Ja, wenn du noch

Dominik

welche News einst, weil sonst machen wir tatsächlich weiter mit

Dominik

Content heute. Ja, ne, Content

Jochen

klingt gut. Also ich stelle

Dominik

jetzt immer ein paar blöde Fragen

Dominik

und ich

Dominik

versuche dich dazu zu bringen, dass du die Fragen möglichst

Dominik

kurz beantwortest.

Dominik

Oder so eine Minute pro Fage oder so.

Dominik

Vielleicht schaffen wir das.

Dominik

Wow, okay.

Dominik

Ja, alles klar.

Dominik

Ich weiß, es wird nicht immer ganz einfach bei einigen Themen.

Dominik

Das ist natürlich auch was anderes.

Dominik

Aber mal gucken.

Dominik

Ja, schauen wir einfach mal.

Dominik

Also erste Frage.

Dominik

Ist Python eine Schlange?

Dominik

Ah, wo kommt der Name her?

Jochen

Also, nee, tatsächlich ist das eine Referenz auf Monty Python.

Jochen

Spam, Spam, Spam, Spam, Spam, Spam.

Jochen

Genau, genau.

Jochen

auch interessant,

Jochen

der

Jochen

Monty Pythons

Jochen

Flying Circus, also

Jochen

der Flying Circus ist wiederum

Jochen

eine Anspielung auf, glaube ich,

Jochen

Ersten Weltkrieg, Roter Brunnen,

Jochen

irgendwie, Geschichte.

Jochen

Die nannte man

Jochen

halt, das war halt so die

Jochen

informelle Bezeichnung,

Jochen

weil die halt immer mit Zelten auf irgendwelchen

Jochen

Äckern und Wiesen unterwegs waren,

Jochen

weil es sowas wie Flugplätze ja damals noch gar

Jochen

nicht gab, wurden die dann halt auch mal

Jochen

der fliegende Zirkus genannt und

Jochen

ja,

Jochen

ja, aber wo

Jochen

Monty Python eigentlich herkommt,

Jochen

weiß ich jetzt auch nicht. Also Guido hat sich das dann ja irgendwie

Jochen

so ausgedacht. Genau, also

Jochen

die Referenz

Jochen

des Namens der Programmiersprache

Jochen

bezieht sich schon auf Monty Python.

Jochen

Also ich finde aber eine Schlange eigentlich viel cooler

Dominik

und ich würde einfach sagen, ich nehme auch immer so eine Schlange als Symbol

Dominik

und es ist ja sogar im Logo mittlerweile drin.

Dominik

Nee, klar.

Dominik

Wenn ich mir ganz viele

Dominik

Python-Muster auf mein Körper

Dominik

tätowieren lasse, dann ist das natürlich ein Zeichen von meiner

Dominik

Liebe zur Sprache.

Dominik

Tja. Ja, man kann sich ja schlecht nur

Dominik

irgendwelche Gags auf den Körper tätowieren lassen, das geht natürlich nicht.

Dominik

Ich habe übrigens noch keine Tattoos.

Dominik

Leider, meine Frau sagt, ich darf nicht.

Dominik

So. So, so. Ja.

Dominik

Tja, da musst du dich wohl entscheiden.

Dominik

Ja.

Dominik

Nächste Frage wäre,

Dominik

welche Einsatzzwecke von Python fallen dir ein?

Dominik

Na ja, schon eine ganze Menge,

Jochen

aber ich würde sagen, die allerwichtigsten zur Zeit

Jochen

sind, ja,

Jochen

Data Science ist jetzt, glaube ich, das

Jochen

am stärksten gehypte Thema momentan.

Jochen

Immer noch sogar. Ja, doch, ich denke schon.

Jochen

Einfach deswegen, weil das halt

Jochen

irgendwie alle machen wollen, weil da auch viele

Jochen

Fortschritte passieren und Python ist halt

Jochen

die

Jochen

Programmiersprache, mit der man das vielleicht am besten machen kann,

Jochen

abgesehen von R. Aber R ist halt

Jochen

ein bisschen, hat ein bisschen einen engeren Einsatzzweck

Jochen

und du kannst halt nicht gut

Jochen

Webgeschichten zum Beispiel nachschreiben oder so.

Jochen

Oder ganze komplette Systeme in R bauen, das geht eigentlich

Jochen

nicht gut. Aber mit Python geht das, daher ist

Jochen

Python irgendwie da

Jochen

schon so, gerade für produktive

Jochen

Geschichten, das Mittel der Wahl.

Jochen

Also wenn man jetzt nicht nur Sachen analysieren möchte

Jochen

oder explorative Analyse von irgendwas

Jochen

machen möchte, sondern man möchte es tatsächlich einsetzen, dann

Jochen

kommt man eigentlich um Python nicht wirklich

Jochen

drumherum. Es gibt ja auch noch so ein paar Leute, die dann

Jochen

irgendwie, oder sagen wir so, das ist auch ein großer

Jochen

Bereich, aber die dann Java oder so verwenden.

Jochen

Es gibt ja auch irgendwie mit Scala,

Jochen

also nicht Java, sondern die Java4M

Jochen

und meistens verwenden die Leute dann irgendwie Scala

Jochen

obendrauf

Jochen

und Spark und da gibt es auch so DataFrames.

Jochen

Aber

Jochen

ich würde sagen, das ist ein deutliches Stück kleiner

Jochen

als der

Jochen

PyData-Stack.

Jochen

Ja, also das ist auf jeden Fall

Jochen

das größte

Jochen

Thema, glaube ich, momentan, aber Web-Entwicklung

Jochen

ist nach wie vor auch sehr groß.

Jochen

Dann eine Geschichte, die

Jochen

jetzt kommt irgendwie,

Jochen

da wollen wir auch unbedingt

Jochen

nochmal was zu machen,

Jochen

ist alles, was irgendwie so mit Home-Automation

Jochen

Zeugs zu tun hat. Home Assistant

Jochen

ist ein

Jochen

großes Thema. Ich habe da letztens

Jochen

so um Weihnachten rum, dann kann ich auch noch mal

Jochen

gucken, ob diese ganzen Geschichten noch

Jochen

gehen oder Geschenke in bestimmte Richtungen

Jochen

werfen, die irgendwas in der Art

Jochen

tun, weil das ja doch eine ganz angenehme

Jochen

Sache ist, wenn man halt Lampen und sowas

Jochen

automatisch steuern kann. Das ist natürlich ganz spannend,

Dominik

weil man hat halt irgendwie ganz viel

Dominik

kleines Zubehör, das irgendwie, wenn ich das richtig mal verstehe,

Dominik

meistens so in C am besten programmiert ist.

Dominik

Man hat irgendwie so eine High-Level-API, so wie MicroPython

Dominik

oder sowas, die man da drauf schmeißt und kann dann einfach in Python

Dominik

auch die ganzen Module nehmen.

Dominik

Ja, also die ganzen

Jochen

Endgeräte,

Jochen

das ist ja die Frage. Also man kann das, wenn das so

Jochen

Arduino-mäßig ist, ist das auf C, was man

Jochen

normalerweise schreibt, aber

Jochen

es gibt halt auch mittlerweile Chips, auf denen

Jochen

man Mikro-Python

Jochen

installieren kann und dann kann man da einfach Python schreiben.

Jochen

Die haben halt WLAN und ansonsten hast du

Jochen

ein Problem, wie kommunizierst du eigentlich mit Sensoren

Jochen

oder irgendwelchen Dingen, die dann was schalten oder so.

Jochen

Wenn du da

Jochen

irgendwie das über Funk, DVB-T oder so

Jochen

machen, also ein bisschen ätzend.

Jochen

Und WLAN ist natürlich schon nicht so schlecht und das geht eigentlich

Jochen

mit alles mittlerweile. Aber halt eben, ich glaube,

Jochen

der größte Punkt ist, dass Home Assistant

Jochen

ist halt in Falken geschrieben und das ist halt das Ding,

Jochen

was zum Verwalten von diesem ganzen Kram halt

Jochen

üblicherweise so verwendet wird, wenn man

Jochen

jetzt nicht irgendeine fertige Lösung

Jochen

wie jetzt, na, wie heißt

Jochen

das denn, von Apple

Jochen

oder Google oder

Jochen

Amazon oder so, die haben natürlich ihre

Jochen

eigenen Geschichten.

Jochen

Und was ich da interessant, ich habe da letztens noch mal

Jochen

genau in dem Zusammenhang mir dieses State of the

Jochen

Union von Home Assistant

Jochen

den Talk angeguckt und

Jochen

das war mir gar nicht so

Jochen

klar, dass die mittlerweile unter den

Jochen

Top Ten der

Jochen

Projekte bei GitHub sind, die am meisten

Jochen

Contributions kriegen. Okay, cool.

Dominik

Ja, weil die Leute am meisten gerne daran basteln, ne?

Dominik

Ja, ich war

Jochen

überrascht, wie viel das ist, weil

Jochen

das ist ja jetzt eben noch nicht so prominent

Jochen

als, ich glaube, es waren sowieso sehr wenig

Jochen

Open-Source-Projekte in den ersten 10.

Jochen

Also da waren eher solche, das fand ich

Jochen

auch so ein bisschen erschreckend. Wir haben doch keine

Jochen

Zeit. Aber sowas wie

Jochen

Visual Studio zum Beispiel,

Jochen

VS Code oder so ist in den

Jochen

Top 10, TensorFlow und so.

Jochen

Das sind ja alles nur so mehr oder weniger Open-Source-Projekte.

Jochen

Nicht so richtig eigentlich, aber Home Assistant schon.

Jochen

Also ja, da geht auf jeden Fall

Jochen

auch noch was. Und

Jochen

ansonsten, ja, alles was irgendwie

Jochen

noch so an

Jochen

Server-Infrastrukturen automatisch hochziehen,

Jochen

Deployment,

Jochen

da ist Python auch sehr stark

Jochen

vertreten. Das heißt, Web, hat man doch so ganz kurz gesagt,

Jochen

ich glaube, ist gar nicht so klein, oder?

Jochen

Nee, Web ist auch sehr groß, ja.

Jochen

Also Django und Flask sind ungefähr

Jochen

beide gleich groß, mehr oder weniger.

Jochen

Und es sind beides

Jochen

große Bereiche,

Jochen

in denen es passiert.

Jochen

Viele der Top-Seiten sind irgendwie

Jochen

eins von beiden.

Jochen

Also, genau.

Jochen

Ziemliche Allround-Sprache eigentlich, kann man sagen.

Jochen

Ja, okay.

Jochen

Kann man fast alles mitmachen.

Dominik

Was sollte man in Python können, um einen Job zu bekommen?

Jochen

Hm, das, äh, hm, ich weiß nicht, also ich glaube, da kann man, das ist immer ein bisschen schwer, ne, wenn man das dann sagt, was Leute da machen sollen, und dann sagt irgendwie die Library oder das, das ist besonders interessant zur Zeit, dann braucht man irgendwie eine gewisse Zeit, um das zu lernen, wobei die meiste Zeit, die man braucht, um das zu lernen, wahrscheinlich dabei drauf geht, programmieren zu lernen, das dauert halt einfach lange, und dann ist es halt in dem Moment, wo man es kann, wieder veraltet.

Jochen

Also insofern, das hilft alles nicht, aber ich würde sagen, tatsächlich die Geschichte, die am meisten bringt und von der aus man dann alle anderen Sachen, die man vielleicht lernen kann, ist halt tatsächlich einfach richtig programmieren können. Das ist schon so die Fähigkeit, die man haben sollte.

Jochen

oder es ist halt auch etwas, was nicht so, es ist ja, ja.

Dominik

Richtig programmieren können, das hört sich jetzt total einfach an.

Jochen

Das hört sich total einfach an, aber das ist tatsächlich nicht so verbreitet,

Jochen

wie man sich das wünschen würde.

Jochen

Also das kann man immer, man denkt immer so, ja, das macht man halt irgendwie,

Jochen

dann machen Leute irgendwie einen Kurs oder kaufen sich irgendwie,

Jochen

ich weiß nicht, ob es sowas überhaupt gibt, Python in 21 Tagen oder Java.

Jochen

Das geht nicht in 21 Tagen, das geht auch nicht in einem halben Jahr,

Jochen

das dauert alles ein bisschen länger.

Dominik

Ja, manche Leute denken ja, dass wenn sie die Syntax mal gesehen haben.

Jochen

Genau, dass das das Gleiche wäre,

Jochen

aber das stimmt halt nicht.

Jochen

Die Syntax ist ja auch bei Programmiersprachen

Jochen

eigentlich gar nicht so...

Dominik

Also für Anfänger schon, die verstehen

Dominik

erst mal überhaupt nicht, was da steht. Das ist der erste Schritt

Dominik

zum Verstehen, worum es überhaupt geht.

Jochen

Ja, aber wenn man das eben mit einer natürlichen Sprache vergleicht,

Jochen

es gibt halt viel weniger Worte. Es gibt halt ein paar

Jochen

ja,

Jochen

es gibt ein paar

Jochen

Verben sozusagen für Worte.

Dominik

Hast du aber die ganze Standard-Library mit bedacht?

Jochen

Klar, also die Libraries sind dann nochmal ein anderes Thema,

Jochen

aber das muss man ja auch alles gar nicht so unbedingt

Jochen

können.

Jochen

Wenn man die Syntax und halt die paar

Jochen

Worte, die es tatsächlich gibt,

Jochen

kann, dann kann man das ja zumindest mal alles lesen.

Jochen

Ja, also

Jochen

das ist halt, also programmieren

Jochen

können ist aber so ein bisschen wie ein Musikinstrument

Jochen

können oder halt auch

Jochen

Fremdsprache lernen oder so und das ist halt eine Geschichte,

Jochen

die dauert einfach. Da gibt es

Jochen

dann halt auch Sachen, wie man das schneller hinkriegt und

Jochen

wie man das effektiver üben kann und so.

Jochen

Aber

Jochen

wenn man das dann kann,

Jochen

dann kann man sich

Jochen

eigentlich in jedes Thema relativ schnell

Jochen

einarbeiten, würde ich jetzt mal so einfach sagen.

Jochen

Und das ist halt

Jochen

auch, denke ich, also die entscheidende

Jochen

Geschichte, die man

Jochen

können sollte.

Jochen

Sich in Themen schnell einarbeiten.

Jochen

Ja, beziehungsweise die Prinzipien des Programmierens.

Jochen

Diese Geschichte, die halt lange dauert, halt schon

Jochen

vorher erledigt haben, weil das

Jochen

wird einem niemand gerne bezahlen wollen,

Jochen

sondern das lernt man, das

Jochen

lange dauert. Aber ich würde auch sagen,

Jochen

da gibt es halt enormes Potenzial.

Jochen

Jetzt hört sich so ein bisschen an, das kann das ja jeder,

Jochen

aber das ist nicht so.

Jochen

Also die allermeisten haben damit Probleme und strugglen da.

Jochen

Und nicht die Mehrheit aller Programmierer

Jochen

kann ordentlich programmieren, würde ich jetzt mal so sagen.

Jochen

Ja, das musst du eigentlich noch definieren,

Jochen

was denn ordentlich programmiert ist.

Jochen

Und das ist vielleicht auch, das kann ich ehrlich gesagt

Jochen

gar nicht so genau.

Jochen

Und es ist auch die Frage,

Jochen

eigentlich ist es auch wieder so ein bisschen,

Jochen

ich will eigentlich niemanden ausschließen.

Jochen

Ich würde sagen, ja,

Jochen

selbst wenn man das nicht so total hundertprozentig kann.

Jochen

Wahrscheinlich haben die meisten von uns

Jochen

auch schon irgendwie Jobs gemacht, wo sie

Jochen

dachten, dass sie dafür eigentlich gar nicht geeignet

Jochen

wären oder so und das haben dann halt irgendwie gelernt.

Jochen

So ist das halt auch

Jochen

normal, das ist wahrscheinlich auch in anderen Bereichen

Jochen

so und vielleicht

Jochen

muss man sich einfach mal trauen, irgendwas zu machen

Jochen

oder zu sagen, dass man irgendwas kann, auch wenn man es halt vielleicht nur so

Jochen

ein bisschen kann und dann nicht so total perfekt.

Dominik

Ja, aber du musst ja trotzdem damit rausholen,

Dominik

was denn jetzt richtiges Programmieren dann überhaupt ist.

Dominik

Also das ist ja zwar eigentlich jetzt nicht auf meiner Liste, aber dann musst

Dominik

du jetzt in kleinen Kurvortrag teilen? Ich gebe dir sogar

Dominik

zwei Minuten.

Dominik

Naja, das wäre

Dominik

gar kein Problem, das sind zwei Minuten, ist ja klar.

Dominik

Also ich würde

Dominik

sagen, wenn man halt

Jochen

nichts total, also wenn man

Jochen

Dinge so macht, wie sie gemacht werden

Jochen

sollten, nicht so total schrecklich

Jochen

Dinge falsch macht, vielleicht.

Jochen

Weil tatsächlich ist es das, was man oft sieht, dass Sachen

Jochen

halt wirklich, also nicht

Jochen

nur so ein bisschen nicht ordentlich

Jochen

sind, sondern so Kleinigkeiten, sondern

Jochen

dass so Dinge so gar nicht richtig sind eigentlich.

Dominik

Was gehört denn dazu, also was würde denn da?

Jochen

Also ich würde sagen eben, dass

Jochen

der Umgang mit den

Jochen

ganz einfachen

Jochen

Datenstrukturen, ja, also

Jochen

irgendwie Listen,

Jochen

Dicks,

Jochen

irgendwie Skalare und damit halt ordentlich umgehen kann.

Jochen

Also wenn man das schon kann, ist schon viel,

Jochen

hat man schon viel,

Jochen

weil das schon viele Leute nicht so richtig hinkriegen

Jochen

und ja,

Jochen

dann halt,

Jochen

dass man eben

Jochen

Sachen halt ordentlich in Funktionen packt,

Jochen

nicht irgendwie Spaghetti-Gut schreibt, dass das halt alles so

Jochen

halbwegs, sondern sich nicht

Jochen

dauernd wiederholt. Dry, don't

Jochen

repeat yourself.

Jochen

Ja, aber da

Jochen

gehen wir fast schon in diese Detailgeschichten,

Jochen

oder dass man halt Tests schreibt und diese ganzen

Jochen

Best Practices verwendet

Jochen

und Versionskontrolle verwendet und so.

Dominik

Mit den Daten schon, das musst du später nochmal sagen, da habe ich noch ein paar

Dominik

Fragen, da müssen wir nochmal ein bisschen drauf eingehen, was denn

Dominik

überhaupt jetzt im Skalar-Daten schon

Dominik

was alles ist, ja.

Dominik

Okay, also du sagst halt einfach, okay, man muss halt die Prinzipien

Dominik

Best Practices irgendwie kennen und anwenden

Dominik

und sich daran so ein bisschen hochhangeln und

Dominik

irgendwie sich was besorgen, was man da...

Jochen

Ja, und viel Code lesen, halt viel

Jochen

sich mal angucken. Das Problem ist natürlich, wenn man

Dominik

jetzt jemanden liest, wo du sagst, die Mehrheit der Programmierer

Dominik

ist gar nicht so hervorragend

Dominik

und dann lese ich jetzt von...

Jochen

Ich würde es vielleicht anders sagen,

Jochen

da ist viel Verbesserungspotenzial. Also wenn man sich anguckt,

Jochen

was, wenn der Code, der geschrieben

Jochen

wird von Leuten oder der so in Firmen

Jochen

läuft oder so, ist das dann so, wie es

Jochen

sein könnte oder kann da noch, geht da noch mehr?

Jochen

Und da muss man sagen, da geht eigentlich

Jochen

fast immer noch deutlich mehr.

Dominik

Ja gut, aber wenn man sich jetzt seinen eigenen Code anguckt,

Dominik

dann ein halbes Jahr später, dann denkt man natürlich schon so,

Dominik

oh, was willst du sagen.

Dominik

Ist das auch so, ja.

Jochen

Genau, aber ja.

Dominik

Ja, was, erstmal, also ich habe noch eine Basisfrage bekommen

Dominik

vom Olli, der hat ja noch geschrieben,

Dominik

Tipps für eine gute Syntax, dein Top 5 oder so.

Jochen

Heute, heutzutage würde ich sagen, Black verwenden

Jochen

und nicht mehr drüber nachdenken.

Jochen

Also einfach Black, bumm.

Jochen

Ja.

Jochen

Vielleicht, also Namen vielleicht auch.

Jochen

Namen sind natürlich, das ist eine ganz schwierige Sache, also wie kommt man da auf gute Namen, da muss man auch lange drüber nachdenken oft, also ja, da gibt es ja auch immer den bekannten Witz, was sind die zwei schwierigen Sachen, ja, in der Informatik irgendwie Dinge benennen, Caching und oft bei One-Error-Errors, ja, aber genau, also Dinge benennen ist schwierig, ist eine Kunst und ja, wo man sich da auch dran orientieren kann,

Jochen

Ist so ein bisschen wie bei gutem Kommentaren.

Jochen

Man sollte eher darauf achten,

Jochen

hinzuschreiben, warum man das

Jochen

macht oder was das macht. Nicht so

Jochen

sehr, wie da irgendwas passiert oder so.

Jochen

Ja, und halt dabei,

Jochen

wenn man was schreibt,

Jochen

dran denken, dass das,

Jochen

wenn das jemand liest,

Jochen

dann halt verständlich sein sollte, weil

Jochen

Code viel öfter gelesen wird als geschrieben.

Jochen

Ja.

Dominik

Was ist mit sowas wie

Dominik

List Comprehensions? Würdest du das bevorzugen,

Dominik

gegenüber klassischen Loops.

Jochen

Kommt drauf an. Also ich würde sogar

Jochen

eher ein bisschen, die andere,

Jochen

ich würde sagen, lieber eine

Jochen

Vorschleife verwenden und

Jochen

List Comprehension halt eher dann, wenn es halt

Jochen

irgendwas einfacher ist, wo

Jochen

ja, wenn es halt offensichtlich und einfach

Jochen

ist, dann kann man auch gerne

Jochen

List Comprehension verwenden. Aber wenn man

Jochen

also, ich meine,

Jochen

auch da,

Jochen

das ist halt, wenn man irgendwas entdeckt, wie es

Jochen

funktioniert und das dann cool findet, dann fängt man an, das überall

Jochen

zu benutzen. Und ich habe dann auch schon

Jochen

nicht List Comprehensions gebaut, irgendwie

Jochen

wo ich dann halt

Jochen

mehrfach verschachtelt irgendwie

Jochen

über Dinge iteriert habe. Und das wird bei

Jochen

List Comprehensions sehr, sehr schnell, sehr, sehr

Jochen

unübersichtlich, wo ich dann halt irgendwie

Jochen

stolz darauf war, so ein Statement hingekriegt zu haben.

Jochen

Einer Zeile, Goldgolf.

Jochen

Nicht in einer Zeile, das geht dann halt nicht mehr in einer Zeile, aber

Jochen

dann so drei Zeilen List Comprehension

Jochen

irgendwie mit Bedingungen drin

Jochen

und verschachtelt und so lange

Jochen

getüftelt, bis es irgendwie ordentlich funktioniert hat.

Jochen

Das macht ja dann auch irgendwie Spaß. Das ist halt so ein bisschen

Jochen

wie puzzeln, aber

Jochen

ich fürchte, wenn da jemand dann draufguckt,

Jochen

der das

Jochen

verstehen muss und das unter einem gewissen

Jochen

Zeitdruck tut, dann

Jochen

würde der sich wahrscheinlich irgendwie

Jochen

Rot vor Rot.

Jochen

Spaß zur Ärger.

Jochen

Da gibt es

Jochen

das Remote Strangulation Protocol,

Jochen

wie zu Hilfe wünschen.

Jochen

Das Remote Strangulation Protocol?

Jochen

Ja.

Jochen

Ich weiß nicht.

Jochen

Das kennt wahrscheinlich auch keiner.

Jochen

Damals gab es so einen Text

Jochen

auch schon lange her,

Jochen

Bastard Operator from Hell

Jochen

und da gibt es die

Jochen

sysadmin, also es gibt die

Jochen

sysadmin-man-pages oder die

Jochen

sysadmin-recovery

Jochen

gab es in Newsgroup

Jochen

und dann

Jochen

ASR, alt sysadmin-recovery

Jochen

das war die Newsgroup und dann gab es die

Jochen

ASR-man-pages und Tools

Jochen

ich glaube, wenn man

Jochen

man-asr sagt oder man-knife

Jochen

oder man-snip oder so,

Jochen

dann kriegt man das auch noch irgendwie

Jochen

auf dem Linux zu sehen.

Jochen

Da gibt es dann Tools, mit denen man

Jochen

irgendwie Usern

Jochen

die Attitüde

Jochen

von Usern wieder

Jochen

rejustieren kann. Und diese Tools sind halt

Jochen

sowas wie Snip

Jochen

oder Knife

Jochen

ist da X.

Jochen

Mit der Axt irgendwie mal dazwischen geht

Jochen

und Dinge gerade richtet.

Jochen

Die Attitüde von Usern regulieren, das hört sich

Jochen

toll an. Ja, das klingt

Jochen

nach Spaß an,

Jochen

wenn man auf der richtigen Seite steht.

Jochen

Ja, ist natürlich so ein bisschen, ich meine, das Mindset dahinter ist auch etwas fragwürdig, aber es ist damals irgendwie lustig. Und da gab es auch Protokolle und eines der Protokolle in dem Zusammenhang ist halt das RSTP, Remote Strangulation Protokoll über Fernverbindungen.

Dominik

Sehr gut, das ist das, was man in Startorganisationen gerne hätte oder wo man dran arbeitet, das automatisch zu bekommen. Also ihr braucht gute Admins für den Start, damit das funktioniert.

Dominik

Ja, also ein bisschen Syntax haben wir gemacht. Also die Frage wäre jetzt noch, was gehört als zu Python Fullstack dann? Also wenn man jetzt schon ganz viel kann und so, was würdest du sagen, wenn man richtig Fullstack entwickelt?

Jochen

Ja, Fullstack, das ist so ein Ding, was heutzutage

Jochen

auch wieder in aller Munde ist, wobei das

Jochen

auch selten tatsächlich so ist.

Jochen

Würde ich sogar sagen,

Jochen

auch das, ich mach das nicht eigentlich.

Jochen

Ich bin deutlich eher auf der Backend-Seite als auf der

Jochen

Frontend-Seite, aber Fullstack hieße ja,

Jochen

dass du quasi alles machen kannst, von

Jochen

unten bis Frontend. Also Fullstack in Python

Jochen

geht gar nicht, weil man kein Frontend kann. Das geht nicht richtig, genau,

Jochen

weil du mit Frontend bist du halt nicht,

Jochen

da brauchst du halt dann schon JavaScript

Jochen

für und

Jochen

ja, oder es ginge theoretisch

Jochen

auch. Aber das ist halt ein Bereich, der schön wäre,

Jochen

wenn das mit Python funktionieren würde. Aber momentan

Jochen

geht das nicht richtig. Also man könnte natürlich Python

Jochen

auch irgendwie Richtung WebAssembly

Jochen

kompilieren und dann halt im Frontend verwenden.

Jochen

Aber es gibt keine, es gibt

Jochen

eben nicht so viel wie für JavaScript

Jochen

die ganzen UI-Bibliotheken, die man

Jochen

da so braucht, um halt Dinge irgendwie

Jochen

auszumachen. Also

Jochen

schwierig.

Dominik

Ja, das heißt, JavaScript braucht ihr, wenn ihr Full-Tag

Dominik

machen wollt. Und mit Python kriegt ihr das gar nicht so hin.

Dominik

Aber vielleicht wollt ihr das ja auch gar nicht so machen,

Dominik

weil warum sollte man Full-Tag machen, wenn man

Dominik

die anderen Sachen wie Data und Backend so gut kann.

Jochen

Naja, also wenn du eine Webseite machst, hast du

Jochen

sofort diesen ganzen Kram, wobei du da

Jochen

möglicherweise eben auch ohne JavaScript oder

Jochen

ohne viel JavaScript auskommen kannst.

Jochen

So eine ganz stinknormale

Jochen

Webseite, so.

Dominik

Ein bisschen CSS-Version machen

Dominik

oder sowas, ja. Auch kein Python.

Jochen

Auch wieder kein Python, genau.

Jochen

Aber das geht natürlich auch immer noch und

Jochen

ist eigentlich auch für viele Anwendungen

Jochen

irgendwie gar nicht so schlecht.

Jochen

Aber, ja. Ja, gibt ja so ein paar

Jochen

Framework, ne? Grid, Materialize,

Jochen

so. Naja, also ohne

Dominik

JavaScript. Aber das ist ja was anderes. Ja, also Fullstack geht

Jochen

gar nicht nur mit Python.

Jochen

Und das ist tatsächlich auch einer der großen

Jochen

Risiken

Jochen

irgendwie für die Zukunft von Python, wenn das

Jochen

halt, wenn das quasi so aus dem

Jochen

Wettding, weil die Frage ist jetzt,

Jochen

kommt Python nochmal ins Frontend oder

Jochen

geht JavaScript ins Backend?

Jochen

Und wenn der Weg in die Zukunft

Jochen

so aussieht, das wird dann JavaScript, weil das natürlich auch

Jochen

gewisse Vorteile bringt. Du kannst

Jochen

einmal den Code, kannst ihn im Backend und

Jochen

im Frontend verwenden.

Jochen

wenn wir jetzt auch im Backend zunehmend

Jochen

JavaScript kriegen, dann brauchst du halt

Jochen

eigentlich Python in der Webentwicklung gar nicht mehr.

Jochen

Oder es läuft umgekehrt

Jochen

und wir kriegen auch irgendwann

Jochen

Python im Frontend, das wäre natürlich eigentlich die schönere Variante.

Dominik

Ja, da müssen wir mal dran arbeiten, dass das

Dominik

passiert, das ist natürlich eine gute Sache.

Dominik

Ich glaube, also die Chance ist gar nicht so schlecht,

Dominik

also ich glaube, Python ist noch

Dominik

bei Anfängern gerade ein bisschen beliebter, vielleicht bedeutet

Dominik

das, dass das irgendwann dann auch in diese Richtung

Dominik

driftet. Ja,

Dominik

mal schauen, wer weiß.

Dominik

Ja, noch ein Import-Sys.

Dominik

Ja, ich glaube, das hatten wir letztes Jahr auch schon mal.

Jochen

Ziemlich genau um diese Zeit hatten wir das nicht in der ersten Folge schon mal.

Jochen

Am Schluss, glaube ich, ja.

Jochen

Aber kann man sich auf jeden Fall immer mal wieder angucken.

Dominik

Ja, also den Interpreter öffnen, einfach Import-Sys eingeben und abschicken.

Dominik

Und dann seht ihr das.

Dominik

Also die Prinzipien, die man sich darauf geeinigt hat,

Dominik

die in Python gelten, sollen auch sein.

Jochen

Da ist auch immer so ein bisschen Humor mit dabei.

Jochen

Aber ja, ist auch was dran.

Jochen

Ja, das ist direkt verknüpft zu PEP 8.

Dominik

Ich glaube, das hatten wir dann auch schon mal kurz erwähnt, aber

Jochen

an der Stelle vielleicht nochmal. Ja, das ist sozusagen einfach nur die

Jochen

Art, wie man

Jochen

relativ minimalistischer

Jochen

Konsens darüber,

Jochen

wie man Python-Code formatieren sollte

Jochen

vielleicht.

Jochen

Nee, wer macht das nicht, dann kommt hier in die

Jochen

Python-Hölle. Ja, aber auch innerhalb

Jochen

von Tab 8 gibt es ja so Dinge, die dann

Jochen

nicht geklärt sind dadurch und

Jochen

Black

Jochen

hat halt zum Beispiel eben eine Meinung dazu, wie das

Jochen

sein soll. Du kannst ja Dinge machen, die...

Jochen

Ich finde bei einigen Sachen total furchtbar, das sieht scheußlich aus.

Jochen

Okay, was denn?

Dominik

Ja, wenn ich zum Beispiel Argumente in Funktionen packe

Dominik

oder längere Print Statements schreibe,

Dominik

wie er die dann umbricht,

Dominik

dann macht er die Klammer auf in eine Zeile,

Dominik

dann nächste Zeile den String aus dem Print Statement

Dominik

und dann darunter die Klammer wieder zu,

Dominik

wo ich dann sagen würde,

Dominik

hey, für die fünf Zeilen,

Dominik

wenn das Print Statement eh länger als 89 Zeichen ist,

Dominik

hättest du das auch einfach in Einzel schreiben können.

Dominik

Oder halt, wenn Kommentare am Ende der Zeile sind,

Dominik

dann bricht er dann trotzdem die ganze Funktion auseinander,

Dominik

obwohl sie noch reinpassen würde.

Dominik

Oder wenn Black sagt, ganz viele Argumente in einer Funktion,

Dominik

bricht das dann aber um, weil es nicht genug Argumente sind,

Dominik

um auf jeder Zeile ein Argument zu haben.

Dominik

Das sieht auch ganz furchtbar aus.

Dominik

Und dann ist dann der, ich kann mal so mit dem Doppelpunkt,

Dominik

dann am Anfang von einer Zeile irgendwie drei Zeilen Funktionsdefinition.

Dominik

Das finde ich total furchtbar.

Dominik

Ich bin eh nicht so ein Freund von diesem 89 Zeichen Editor-Quatsch,

Dominik

weil ganz ehrlich, so entziehend,

Dominik

dass wir nur 89 Zeichen auf dem Bildschirm haben.

Dominik

79.

Dominik

Entschuldigung, ich entwickle nicht die ganze Zeit

Dominik

mit meinem Telefon.

Dominik

Nee, das ist für Konsolen eigentlich.

Dominik

Die haben halt bloß 80 Zeilen,

Jochen

also 24 Zeilen,

Jochen

80 Spalten.

Jochen

es gibt natürlich, oder ich weiß nicht...

Jochen

Ja, die alten, aber nur die neuen.

Jochen

Weiß ich nicht, ob es dann...

Jochen

Nee, der Standard ist immer noch so.

Jochen

Es ist auch so, wenn du jetzt auf dem Linux oder so bist,

Jochen

dann hast du ja nicht unbedingt immer ein grafisches System

Jochen

und deine Konsole sieht halt so aus.

Jochen

Da gibt es keinen...

Jochen

Ja, aber auch bei VI hast du ja mehr.

Jochen

Auf einer Konsole?

Jochen

Ja, also ohne grafische Benutzeroberfläche, glaube ich, ist schwierig.

Jochen

Aber auf der anderen Seite, wahrscheinlich gibt es diesen Fall,

Jochen

dass jemand an einem Rechner ohne grafische Benutzeroberfläche sitzt,

Jochen

praktisch gar nicht mehr so.

Jochen

Also, wenn ich mich auf meinen Server einlogge,

Dominik

habe ich da mehr als 80.

Dominik

Ja, natürlich, aber du hast...

Dominik

Über die Konsole, über meine Shell.

Dominik

Hast du dich mal an eine Konsole gestellt,

Jochen

an einem Rechenzentrum, an eine serielle Konsole?

Jochen

Ich glaube, da hast du genau die 80 Spalten

Jochen

und 24. Das ist ja uralt

Jochen

DOS. Ja, bei DOS

Jochen

war das auch so, genau.

Jochen

Ja, ich

Jochen

weiß auch nicht.

Jochen

Also ich glaube auch nicht, das ist eigentlich nicht mehr relevant, aber

Jochen

da kommt das halt her und

Dominik

wenn, dann sieht man da halt, muss man kurz drauf aufpassen,

Dominik

dass es dann umgebrochene Zeilen gibt,

Dominik

die automatisch vielleicht eingeguckt werden

Dominik

oder so. Ich weiß gar nicht, auf was ich es gestellt

Jochen

habe bei mir. Das ist ja auch ein Ding, das man

Jochen

bei Black tatsächlich einstellen kann. Also da

Jochen

das muss man nicht

Jochen

so auf 79 zeichnen lassen.

Jochen

Also 79 Zeichen deswegen, weil man halt noch

Jochen

eins braucht für einen Zeilenumbruch.

Jochen

Aber

Jochen

wenn,

Jochen

also ich glaube, ich habe es auch irgendwo auf einer 10

Jochen

stehen, aber ich weiß es nicht.

Jochen

Jedenfalls, das kann man ja konfigurieren und dann ist es nicht mehr so schlimm.

Jochen

Also ich finde auch ein bisschen mehr als 80 geht schon.

Jochen

Irgendwann ist es natürlich auch wieder doof, wenn das

Jochen

halt zu lang wird.

Dominik

Also so, dass man es halt vernünftig auf einem normalen Arbeitsrechner

Dominik

irgendwie vernünftig anlesen kann, dass es dann nicht immer halb so

Dominik

groß ist, dass man viel zu viel Platz braucht.

Dominik

Das wäre ja völlig unheimlich und hässlich, einige Sachen.

Dominik

Also ich finde, DEC ist dann so ein bisschen inkonsistent,

Dominik

wenn es halt dann,

Dominik

beispielsweise, du hast drei Debug-Statements hintereinander,

Dominik

das eine ist vier Zeichen zu lang, dann bricht

Dominik

das ganz komisch rum irgendwie und die

Dominik

anderen darunter sehen

Dominik

nicht so aus. Das ist irgendwie komisch.

Dominik

Naja.

Dominik

Also ich finde das, wo mein ästhetisches Empfinden

Dominik

wird, da immer so ein bisschen angehört. Naja, gut.

Dominik

Wann ist man Amnesie-Syndrom erkrankt?

Jochen

Ah.

Jochen

Not invented hier, ja.

Jochen

Das, äh,

Jochen

Wenn man alles selber macht.

Jochen

Sehr böse erwischt.

Jochen

Ja, das ist halt das Problem.

Jochen

Genau, das heißt einfach nur,

Jochen

dass man halt versucht, alles selber zu machen.

Jochen

Und wenn es halt nicht von hier kommt,

Jochen

viele Firmen haben das auch, die ja alles

Jochen

doof finden, was sie nicht selber gemacht haben und dann

Jochen

halt viel zu viel selber machen. Das ist natürlich ein Problem.

Jochen

Wir empfinden das Rad nochmal von vorn.

Dominik

Genau. Das ist halt immer nett, da kann man immer was mit lernen.

Dominik

Also die Grundlagen zu verstehen, ist gar nicht so schlicht.

Dominik

Und hat man irgendwann nicht

Dominik

kein mehr, der versteht, wie es irgendwann mal gebaut

Dominik

worden ist, sondern nur noch Leute, die dann irgendwie

Dominik

auf dem Sand und der Asche von alten

Dominik

versunkenen Städten versuchen, neue Gebäude zu errichten

Dominik

und dann immer so, oh, da war eine Grube.

Dominik

Und dann steht es ja Palast

Dominik

zusammen. Das ist natürlich dann das, was man vielleicht verhindern will

Dominik

und deswegen ist das vielleicht auch gar nicht immer so schlecht.

Dominik

Aber natürlich kann man ja viel Zeit damit

Dominik

verschwinden, dass man einfach anfängt, komplett

Dominik

das Rad nochmal neu zu erfinden,

Dominik

obwohl man eigentlich schon irgendwie fliegen könnte, dann

Jochen

naja. Ja, es ist

Jochen

immer schwierig. Man muss da halt eine richtige

Jochen

Balance finden. Es ist manchmal gut,

Jochen

Dinge, also ein Beispiel dafür wäre auch

Jochen

dieses Timestamp-Modell aus den

Jochen

Model-Utils, ja, deswegen haben alle als Abhängigkeit

Jochen

Model-Utils drin,

Jochen

dabei, ja,

Jochen

man ist dann auch so,

Jochen

wie meinte ich, über Django 3 kurz

Jochen

auch gesprochen

Jochen

und da hat er dann so, naja,

Jochen

das sind halt eigentlich zwei Zeilen,

Jochen

irgendwie in einem Modell, wenn man das selber

Jochen

macht, das ist,

Jochen

vielleicht wäre es besser gewesen, die beiden Zeilen dann selber

Jochen

hinzuschreiben und dann diese Abhängigkeit

Jochen

nicht zu haben, weil jetzt hat man halt das Problem,

Jochen

dass wenn man, das ist ja auch wieder

Jochen

blöd, wenn man nichts selber macht,

Jochen

ganz schlimmen NPM hat das ja auch so bei JavaScript-Geschichten,

Jochen

dann hast du halt,

Jochen

musst du dich halt

Jochen

viel mit dieser Maintenance von diesem Kram

Jochen

beschäftigen, was ja auch blöd ist.

Dominik

Ja, Parkway-Resonierung muss immer stimmen

Dominik

und genau in dem Zustand bleiben

Dominik

und wenn du irgendwelche Bugs hast, musst du dann irgendwas updaten,

Dominik

weil irgendwas kritisch war und das hat dann

Dominik

andere Abhängigkeiten und dann fliegt dir irgendwas auseinander,

Dominik

weil das inkompatibel ist mit irgendeiner neuen Implementierung

Dominik

von irgendeinem, ja.

Jochen

Also es ist halt auch, man kann nicht

Jochen

sagen, das eine ist super schlecht, das andere ist,

Jochen

sondern es ist halt, man muss halt irgendwie

Jochen

da einen,

Jochen

ja,

Jochen

irgendwie einen Weg finden, der

Jochen

für den Anwendungsfall, den man hat, den besten

Jochen

Trade-Off bietet.

Jochen

Aber tatsächlich ist es so, dass die

Jochen

meisten Leute eher zu viel Richtung

Jochen

Not-Invented hier gehen.

Dominik

Ja, manchmal

Dominik

ist das praktisch. Ich glaube, manchmal ist es auch gar nicht so

Dominik

schlecht, wenn man einfach coole Sachen, die cool funktionieren, einfach benutzen

Dominik

kann und die dann cool weiter funktionieren und

Dominik

dann auch einem schnell irgendwas

Dominik

ermöglichen zu entwickeln. Ich glaube, gerade für Anfänger ist das

Dominik

gar nicht schlecht, wenn man halt nicht von ganz immer

Dominik

anfängt, obwohl es natürlich auch nett ist, wenn man vielleicht

Dominik

erstmal Assembler lernt und dann C und dann

Dominik

guckt, wie es alles so funktioniert, aber es ist auch vielleicht ein bisschen

Dominik

aufwendig. Man kann vielleicht auch ab und zu

Dominik

mal eine High-Level-Bibliothek einfach benutzen,

Dominik

um zu gucken, wie man Dinge damit anstellt, ohne

Dominik

direkt alles zu verstehen oder selber zu

Jochen

implementieren. Ja,

Jochen

über die Zeit ist es natürlich so, dass auch

Jochen

der Level an Abstraktion, auf dem man

Jochen

arbeitet, wird halt immer höher eigentlich,

Jochen

weil halt immer mehr wird Commodity,

Jochen

also die Sachen, die früher

Jochen

der interessante

Jochen

Bereich war, in dem man irgendwas gemacht hat, die werden halt

Jochen

zunehmend Community und

Jochen

wandern halt sozusagen aus dem

Jochen

interessanten Feld raus und das,

Jochen

wo man die interessanten Sachen machen

Jochen

kann, das geht über die

Jochen

Zeit immer in abstrakter Geschichten. Das ist halt

Jochen

auch die Frage, inwiefern das nicht unter Umständen,

Jochen

also auf der einen

Jochen

Seite kann man sagen, man kann heute mit viel

Jochen

weniger Zeilencode irgendwie viel kompliziertere

Jochen

Dinge und tollere Sachen bauen, auf der

Jochen

anderen Seite ist es halt, wenn man sich das manchmal genauer anguckt,

Jochen

es ist halt ein, steht das

Jochen

alles so ein bisschen auf tönernen Füßen.

Jochen

Es ist halt so Kartenhaus über Kartenhaus geschichtet

Jochen

und irgendwie auf den unteren Ebenen

Jochen

stimmen schon viele Sachen nicht mehr so richtig, aber dann

Jochen

baut man halt so lange Abstraktionen drüber, bis es

Jochen

wieder, also ja,

Jochen

aber in Wirklichkeit hat man diese

Jochen

Probleme nicht wirklich gelöst. Ja, wenn man halt das Gebäude

Dominik

und den Palast aus der Samtgrube baut, man kann tatsächlich noch ein paar

Dominik

Stahlträger einziehen, das dann zu tun hat, könnte der Palast

Dominik

nicht mehr halten. Ja, das ist halt dann, ja.

Dominik

Ja.

Dominik

Aha.

Dominik

Ja, aber jetzt gehen wir, glaube ich, jetzt haben wir so ein bisschen

Dominik

generell darüber gesprochen, was so

Dominik

Python generell, was das so ausmacht.

Dominik

Jetzt gehen wir so ein bisschen tiefer in die

Dominik

Probleme der, oder was heißt

Dominik

die Probleme, die Ideen, die Konzepte der eigentlichen

Dominik

Sprache, was man auch vielleicht achten muss.

Dominik

Also, falls ihr noch Fragen habt, die ich nicht beantwortet hatte, schreibt uns

Dominik

wieder, wie immer, hallo at pythonpodcast.de

Dominik

Wofür ist die

Dominik

InitPy?

Dominik

Das ist eine gute Frage.

Dominik

Ja, man braucht das irgendwie,

Jochen

damit es ein

Jochen

Paket ist.

Jochen

Ein Modul, wo es

Jochen

Unterschied zwischen Modulen und Paketen? Oh mein Gott.

Jochen

Ich glaube, das muss ich ja selber nochmal nachlesen.

Dominik

Damit der Namespace irgendwie vernünftig

Dominik

zugegriffen werden kann. Also alles, was man da irgendwie reinpackt,

Dominik

das sitzt dann im Namespace dieses Moduls, wenn man

Dominik

es importiert, direkt drin.

Dominik

Irgendwie so. Und dann kann man da direkt aktiv

Dominik

drauf zugreifen. Aber die Frage ist halt, warum man

Dominik

das dann nicht mit den Submodulen macht.

Jochen

Du kannst das ja auch

Jochen

reinschreiben,

Jochen

was du exportieren willst, welche Symbole.

Jochen

Interessante Frage ist,

Jochen

kann man da auch Sachen ausschließen?

Dominik

Also dass ich zum Beispiel sage, ja, auch diesen Modul bitte nicht

Dominik

in den Namespace packen oder sowas?

Dominik

Also es kommt noch

Dominik

eine andere Frage von einem Hörer von uns, der

Dominik

wissen wollte, wie das dann überhaupt so funktioniert, dass man

Dominik

Module selber bauen kann. Ich glaube, das Einzige, was man machen muss,

Dominik

ist halt ein Folder importieren.

Dominik

Also indem man halt relativ

Dominik

Zugriff drauf hat und dann einfach sagen

Dominik

Import Foldername

Dominik

oder sowas und wenn da eine Inispy drin ist, dann

Dominik

kann man die Module, die da drin sind, einfach

Dominik

aufrufen mit einem

Dominik

Import-Teil und dann kann man

Dominik

Modul, Verzeichnisname, Import, Python

Dominik

Datei oder from Modulname

Dominik

Punkt Python Datei, Import

Dominik

Funktionsname und dann kann man

Dominik

die einsetzen auf

Dominik

dieser lokalen Ebene. Und die Frage wäre halt jetzt,

Dominik

warum man diese initpy an der Stelle braucht

Dominik

und was die halt vielleicht macht und

Dominik

dass sie vielleicht halt dieses Namespacing,

Dominik

was in Python auch irgendwie so ein Ding ist, also

Dominik

zum Beispiel zu sagen, welcher Name

Dominik

jetzt zu welcher Funktion, zu welcher

Dominik

Sublibrary gehört,

Dominik

dass das da ein bisschen definiert wird.

Jochen

Ja, man kann auf jeden Fall an der Stelle kontrollieren,

Jochen

was halt

Jochen

eben, was mit welchem Namen

Jochen

exportiert werden soll, sozusagen.

Jochen

Und

Jochen

dafür ist es ganz nützlich. Warum man sie unbedingt braucht,

Jochen

weiß ich nicht so genau. Und das ist auch etwas, was

Jochen

mir schon öfter mal auf den Fuß gefallen

Jochen

ist und wahrscheinlich vielen Leuten, die jetzt,

Jochen

dass man halt, kriegt manchmal so

Jochen

wenig hilfreiche Fehlermeldungen, wenn man

Jochen

die Init-Py vergisst,

Jochen

sozusagen. Oder wenn die aus irgendwelchen Gründen abhanden

Jochen

gekommen ist, was ja auch manchmal vorkommen kann.

Jochen

Und dann kriegt man Tracebacks, die sehen

Jochen

irgendwie komisch aus. Und man

Jochen

sieht den nicht sofort an, dass da eine Input-Wire

Jochen

fehlt. Irgendwann weiß man halt einfach so,

Jochen

ah, das sieht jetzt danach aus, okay, das könnte sein,

Jochen

dass da einfach eine Input-Wire fehlt, aber...

Dominik

Ich hab zehn Minuten da vor meinem Bildschirm gestanden und überlegt,

Dominik

warum macht der jetzt nicht die Migrationen von

Dominik

meinem Dankmodell, den ich da geschrieben habe, verstehe ich nicht.

Dominik

Und dann fehlte einfach die Input-Wire, Migrations-

Dominik

Bruder und dann, ach so, ja klar, kennt der ja nicht,

Dominik

kann der ja gar nicht sehen.

Dominik

Aber da muss man auch drauf kommen, tatsächlich, sonst...

Jochen

Ja, das ist so ein bisschen...

Jochen

Genau, und eben, ja, also gute

Jochen

Idee

Jochen

mit, was sind eigentlich Paketemodule

Jochen

wie funktioniert eigentlich ein Port-System?

Jochen

Da müssen wir uns auch nochmal beschäftigen, aber da

Jochen

müsste ich mich auch erstmal anlesen. Das weiß ich jetzt alles gar nicht so genau.

Jochen

Ja, das kriegen wir bestimmt noch

Dominik

jeden Tag. Aber wir haben ja die Minute schon wieder überschritten.

Dominik

Ah ja, gut.

Dominik

Aber Inipi ist ja immer mit dann, dann, also doppelt

Dominik

Underscore am Anfang und am Ende. Also wofür brauchen wir

Dominik

überhaupt ein Underscore und wofür zwei?

Dominik

Ja, also ich glaube,

Dominik

das ist...

Jochen

Also die Konvention ist das.

Jochen

Ich glaube, früher war es mal

Jochen

nicht nur eine Konvention, aber mittlerweile ist es tatsächlich

Jochen

nur Konvention, dass man Sachen, die halt

Jochen

innerhalb einer

Jochen

Klasse oder innerhalb

Jochen

also Dinge, die halt sozusagen

Jochen

private API sind oder privat

Jochen

benutzt werden, aber nicht nach außen

Jochen

eigentlich nicht von außen

Jochen

benutzt, also

Jochen

angefasst werden sollten, die

Jochen

werden halt mit Doppel

Jochen

und Underscore halt irgendwie gepräfixt

Jochen

und Sachen, die halt

Jochen

sozusagen

Jochen

dann gibt es einfach ein Underscore, das ist halt

Jochen

so markiert

Jochen

für

Jochen

Aber ja, also sollte man nicht, ist auch eher so interner Gebrauch, aber ist jetzt nicht so total privat.

Jochen

Ja, also ist es eine Konvention. Im Grunde braucht man das auch, also außer jetzt manchmal bei Double Underscore, eigentlich auch nicht wirklich.

Dominik

Also ich habe zum Beispiel diese internen Variablen

Dominik

noch nicht verstanden, wofür das gut ist.

Dominik

Ich habe es auch noch nie benutzt, außer jetzt

Dominik

im Magic-Method-Kontext von

Dominik

Klassen, wo man halt dann irgendwelche magischen

Dominik

Methoden, die es identifiziert, überschreiben will, um

Dominik

andere Effekte zu erzeugen.

Dominik

Ja, es ist halt so ein

Jochen

Hinweis darauf, dass man

Jochen

da nicht

Jochen

wirklich mit interagieren

Jochen

sollte. Nicht umfassen, fast, meine Klasse

Jochen

nicht. Alles, was man selber schreibt,

Dominik

machen immer anders, bevor damit eigentlich niemand anderes

Dominik

anfasst. Nee, nee, ich versuche

Jochen

mal ein Beispiel zu geben. Also wenn du

Jochen

eine Klasse hast, die irgendwas casht, dann

Jochen

packst du halt

Jochen

wenn, also du rechnest

Jochen

das halt aus, du überprüfst in der Methode, ja,

Jochen

sozusagen ein bestimmtes Attribut

Jochen

ist eine Property von dieser Klasse,

Jochen

also hat ein Property-Dekorator drüber, irgendwas

Jochen

wird ausgerechnet und du

Jochen

schreibst das Ergebnis dieser Berechnung, also prüfst

Jochen

wenn du die Methode aufrufst, zuerst habe ich

Jochen

das schon ausgerechnet, wenn ja,

Jochen

gibst du einfach das

Jochen

gecashten Wert zurück

Jochen

und ansonsten rechnest du es halt neu aus,

Jochen

unter bestimmten Bedingungen.

Jochen

Und

Jochen

den Cache selber, den legt man

Jochen

oft dann in so eine Underscore irgendwie

Jochen

Attribut ab. Underscore Cache.

Jochen

Ja, oder Underscore

Jochen

dieses, dieser Name, dieses

Jochen

Attributes oder so, weil

Jochen

und das heißt halt ja bitte nicht anfassen,

Jochen

weil das Problem ist jetzt, wenn ich von außen da rangehe,

Jochen

dann kriege ich vielleicht den gecacheten Wert, aber ich

Jochen

kenne ja jetzt gar nicht die Bedingungen, unter denen das

Jochen

vielleicht, ich denke, Cache invalidieren

Jochen

müsste oder so. Und wenn ich da jetzt einfach so drauf

Jochen

zugreife, dann

Jochen

kann sein, dass Dinge schief

Jochen

gehen. Und

Jochen

das heißt, ja, das ist halt so eine Markierung

Jochen

für, das Ding hier bitte nicht

Jochen

direkt verwenden, sondern, ne, dann gibt's

Jochen

ja meistens ein öffentliches

Jochen

Attribut, was man

Jochen

benutzen kann und dann kann die Klasse das intern

Jochen

handeln, wie sie das integriert.

Jochen

Was ist denn überhaupt eine API?

Jochen

Ja,

Jochen

im Grunde eine Schnittstelle,

Jochen

die Schnittstelle zu irgendwas.

Jochen

Das gibt's jetzt auch in unterschiedlichen

Jochen

Kontexten kann man das

Jochen

verwenden, aber ich würde jetzt mal sagen, also

Jochen

üblicherweise, wenn man jetzt irgendein Paket

Jochen

verwendet,

Jochen

weiß ich nicht, Party-Django-Paket

Jochen

oder irgendeine Python-Bibliothek oder so,

Jochen

dann ist die API das, was

Jochen

man sozusagen von außen benutzt.

Jochen

Die besteht ja aus ganz vielen Funktionen.

Dominik

Befehle, die man für seine Bibliothek benutzen

Dominik

kann, um die

Jochen

für den Anwendungsfall...

Jochen

Also wenn ich jetzt zum Beispiel jetzt Requests nehme

Jochen

oder so, dann macht

Jochen

Request.get macht halt ein Get-Request, das ist halt

Jochen

der öffentliche. Intern macht das dann

Jochen

unter Umständen noch eine ganze Menge anderer Funktionsaufrufe

Jochen

und Dinge und weißer Teufel.

Jochen

Und die sind aber intern gar nicht alle

Jochen

mit einem Underscore. Nö, also manche

Jochen

von denen kann ich auch einfach so verwenden, das wäre auch kein Problem,

Jochen

aber andere wahrscheinlich auch eher

Jochen

nicht. Und die, die ich nicht unbedingt verwenden sollte

Jochen

von außen, die sind halt dann

Jochen

so markiert als

Jochen

für intern gebraucht.

Dominik

Was ist eine private und eine globale

Dominik

Variable und was ist der Unterschied und wofür braucht man

Jochen

Global, privat, also privat

Jochen

öffentlich, das ist halt so ein bisschen, aber

Jochen

das hat man in Python eigentlich auch gar nicht so wahnsinnig

Jochen

viel, also es gibt es in anderen Programmiersprachen

Jochen

gibt es da eine stärkere

Jochen

Unterscheidung, aber also im Grunde

Dominik

ist es einfach so. Also ich hatte es gerade so in den ganz

Dominik

Anfängertagen ganz oft so, dass ich irgendwie mir dachte

Dominik

so ja, private Variablen, das ist

Dominik

alles irgendwie ein bisschen blöd, ich muss ja irgendwie von der Funktion

Dominik

immer irgendwie so einen Wert returnen und damit das dann

Dominik

also ich glaube im Kontext einer Funktion sind ja die eigentlich

Dominik

die Variablen immer privat. Nein, nein, nein,

Jochen

nee, das ist eine Verwechslung, also du meinst

Jochen

lokal und global.

Jochen

Privat und öffentlich, das ist

Jochen

halt genau diese Geschichte mit dem Double Undersquad.

Dominik

Ja, okay. Dann meinte ich lokal

Dominik

und global, ja. Also

Dominik

lokal heißt, Variablen sind halt

Dominik

quasi in dem

Dominik

Block

Dominik

gültig.

Dominik

Und ich

Dominik

habe immer gehört, man braucht keine globalen, man darf

Dominik

die nicht nehmen, dass das total nicht so backrest ist.

Dominik

Kann man schon. An einigen Stellen habe ich halt

Dominik

gemerkt, also gerade ich habe mal so Spielereien gemacht,

Dominik

Spiele gebaut oder sowas. Da hat es immer total

Dominik

super geholfen, weiß ich nicht, die Lebensenergie

Dominik

des kleinen Männchens global

Dominik

zu definieren, anstatt in einer Funktion oder so.

Jochen

Jaja, kann man

Jochen

durchaus machen. Es gibt auch Fälle, wo man das

Jochen

durchaus

Jochen

praktische Anwendungsfälle

Jochen

hat.

Jochen

Ist jetzt nicht unbedingt immer so gut. Also es kommt halt

Jochen

darauf an, was man damit machen möchte.

Jochen

Man muss das

Jochen

halt explizit halt dann als

Jochen

global markieren, wenn man das tun möchte. Und dann gibt es

Jochen

auch, glaube ich, nochmal einen Unterschied zwischen

Jochen

nur global oder global für ein

Jochen

Modul oder

Jochen

aber

Jochen

ja, also für manche Sachen ist das

Jochen

durchaus, also gerade irgendwelche Konstanten

Jochen

oder so, die definiert werden, die sind oft global.

Jochen

Also wenn man das nicht ändert,

Jochen

ist das ja auch nicht schlimm. Wenn man jetzt globale

Jochen

Variablen hat, die man ändert, dann

Jochen

ist so ein bisschen

Jochen

das riecht dann schon so ein bisschen danach,

Jochen

als ob da irgendwas nicht so richtig ordentlich

Jochen

funktioniert, weil

Jochen

was

Jochen

möchte man damit eigentlich machen? Also man hat

Jochen

da irgendwie State, auf den man zugreift

Jochen

von unterschiedlichen Stellen. Also es wird dann halt sehr schwer zu

Jochen

debuggen und sehr schwer vorauszusagen,

Jochen

was da eigentlich passiert, wenn man das einfach so verwendet

Jochen

in unterschiedlichen Stellen des Codes.

Jochen

Das dann ändert einfach so.

Jochen

Da muss man sich halt sehr, sehr genau überlegen

Jochen

oder man muss halt, also

Jochen

vielleicht fange ich so rum an.

Jochen

Das Problem beim Programmieren ist dann halt irgendwie,

Jochen

dass ich an der Stelle, wo ich das ändere,

Jochen

muss mir ja immer klar sein,

Jochen

was an allen anderen

Jochen

Stellen im Code,

Jochen

an diesem Ding irgendwie rumgeschraubt wird, auch passiert.

Dominik

Warum? Also ich nehme jetzt mal

Dominik

so ein Beispiel, wo ich jetzt intuitiv sagen würde,

Dominik

das wäre jetzt für mich das, was ich jetzt

Dominik

als globale Variable haben würde. Ich habe

Dominik

jetzt ein Spiel, mein Barbar hat Lebensenergie

Dominik

von 100. Und es gibt

Dominik

bestimmte Funktionen, die aufgerufen werden, wenn der

Dominik

Barbar irgendwas macht, falsch macht, richtig macht,

Dominik

runterfällt, gegen einen anderen, gegen einen Monster kämpft,

Dominik

dann würde ich von dieser

Dominik

globalen Lebensenergie irgendwas abziehen.

Dominik

Ja.

Dominik

Wofür muss ich denn dann an der einen Stelle,

Dominik

wenn er jetzt, weiß ich nicht, auf ein Skelett trifft,

Dominik

dem Zehn Lebensenergie abzieht,

Dominik

wissen, was an einer anderen Stelle die Falle mit ihm gemacht hat.

Dominik

Naja, also weil du, weil ja, naja, lass mal überlegen.

Jochen

Kann ich irgendwas konstruieren, was dann problematisch wird?

Jochen

Ich meine, es kann ja auch Dinge geben,

Jochen

die die Lebensenergie wieder erhöhen.

Jochen

Ein Trank.

Jochen

Ja, und du musst halt zum Beispiel,

Jochen

du musst halt wissen,

Jochen

dass das jetzt schon nicht unter Null gefallen ist,

Jochen

wenn du jetzt, sonst könntest du dich ja auch wieder lebendig machen,

Jochen

sozusagen, wenn du tot bist, eigentlich.

Jochen

Ein Lifehack, ja.

Jochen

Irgendwas muss diesen State verwalten.

Jochen

Irgendwas muss halt sagen, okay, jetzt bist du

Jochen

aber tot. Und dann darfst du nicht

Jochen

durch, darf nicht irgendein anderer Teil

Jochen

des Codes, der jetzt nicht weiß, ob du tot bist oder nicht,

Jochen

einfach deine Lebensenergie

Jochen

oder deine Lebenspunkte erhöhen,

Jochen

weil das macht dich ja eventuell wieder lebendig,

Jochen

in einer Situation, wo das gar nicht gehen darf.

Jochen

Also, sozusagen,

Dominik

es ist... Also, das würde nicht so

Dominik

gut funktionieren. Das heißt, da würde man auch auch

Dominik

klassenbasiert einen Ansatz nehmen, wo man irgendwie

Dominik

sowas machen wie erhöhe Lebenspunkte und reduziere

Dominik

Lebenspunkte und der macht das halt dann nur dann, wenn man

Jochen

noch nicht tot ist oder so. Genau, und das

Jochen

erhöhe Lebenspunkte geht halt nur, solange man nicht tot ist,

Jochen

zum Beispiel und so. Aber diese Logik,

Jochen

wie das funktioniert, wäre dann halt an einem

Jochen

Ort gebündelt. Das ist ja so ein bisschen die Idee

Jochen

auch hinter Klassen,

Jochen

überhaupt hinter Objektorientierter Programmierung,

Jochen

dass du halt die ganze Komplexität

Jochen

irgendwie verbirgst

Jochen

hinter

Jochen

ja, hinter dieser

Jochen

in diesem Objekt, hinter einer API.

Jochen

Genau, und dann das halt alles nicht mehr

Jochen

wissen musst. Während wenn du jetzt einfach nur eine Variable hast,

Jochen

die jeder irgendwie verändern kann,

Jochen

dann ist die Komplexität verteilt

Jochen

über den gesamten Code

Jochen

irgendwie, der mit dieser Variable interagiert.

Dominik

Was wäre denn jetzt aber ein cleveres Beispiel für eine globale

Dominik

Variable, wo man sagen würde, hey, da macht das

Dominik

irgendwie jetzt dann doch Sinn?

Jochen

Mir fällt da fast keins ein,

Jochen

wo das irgendwie sinnvoll ist.

Jochen

Was man manchmal hat, ist, dass man

Jochen

sicher sein möchte, dass

Jochen

man etwas nur

Jochen

einmal hat oder so. Aber da

Jochen

würde man auch eher ein Single nehmen,

Jochen

beziehungsweise in Python eher Borg-Pattern.

Dominik

Oh, Singleton, das steht hier ein bisschen weiter unten.

Dominik

Ein Singleton-Borg-Pattern, hast du gerade gesagt?

Dominik

Ja, okay.

Dominik

Was ist ein Singleton, was ist ein Borg-Pattern?

Dominik

Du musst wieder anfangen.

Dominik

Also sozusagen, Singleton ist, wenn garantiert sein soll,

Jochen

dass es von einer bestimmten Geschichte nur eine Instanz gibt.

Jochen

Also wenn ich zum Beispiel eben in einem Spiel die Spielfigur

Jochen

oder so, die dann bestimmte Eigenschaften hat,

Jochen

eben sowas wie Lebensenergie oder so,

Jochen

wenn ich garantieren möchte, dass alle,

Jochen

die damit interagieren, immer die gleiche Instanz sehen.

Jochen

Dass ich halt den nicht, weil es gibt nur einen

Jochen

und es wäre jetzt blöd, wenn ich zwei davon erzeuge und dann

Jochen

in dem einen Objekt

Jochen

verlinke ich die Lebensenergie und beim anderen nicht oder so.

Dominik

Wie macht man das denn? Überschreibt man dann die New-Methode

Dominik

und sagt dann so, nee, wenn es schon eins gibt, dann mach keinen neuen?

Jochen

Naja, das ist, nee,

Jochen

eigentlich, also so, weil

Jochen

dann kommen wir zum Borg-Python, so wird das üblicherweise dann in Python

Jochen

implementiert, ist, man macht

Jochen

es einfach so, dass

Jochen

jetzt muss ich mal,

Jochen

wie ging das da? Also ich glaube, der Trick

Jochen

ist, aber das muss man mal nachgucken,

Jochen

also mit Vorsicht genießen,

Jochen

ist, dass

Jochen

sozusagen den State

Jochen

innerhalb von der,

Jochen

eines Objekts sozusagen

Jochen

in der Klassenvariable zu halten,

Jochen

die halt bei allen Instanzen gleich ist.

Jochen

Und dann können die Instanzen zwar unterschiedlich sein,

Jochen

aber der State ist immer gleich.

Jochen

Und dann ist es zwar kein

Jochen

Singleton in dem Sinne, wie

Jochen

wie man das vielleicht ursprünglich mal so definiert hat.

Jochen

Im Gänger-Vorbuch gibt es halt das Pattern Singleton,

Jochen

weil man eben nicht immer tatsächlich,

Jochen

also ich glaube, bei ursprünglichen Singleton-Beschreibungen

Jochen

ist es so, das wird einfach immer die gleiche Instanz returnt,

Jochen

wenn man halt die...

Dominik

Also das heißt nie überschreiben.

Dominik

Das würde halt bedeuten, wenn es schon ein anderes gibt,

Dominik

dann returnt es halt das.

Dominik

Returnt so das alte halt.

Jochen

Sowas kann man auch in Python machen, das wäre kein Problem,

Jochen

aber praktischer ist es halt, weil es einfach weniger Code

Jochen

und macht sozusagen, verhält sich ähnlich

Jochen

und hat noch ein paar andere nette Vorteile.

Jochen

dass du halt sozusagen sagst, der State

Jochen

bleibt über alle Instanzen

Jochen

von diesem Objekt gleich und ich muss da nicht kompliziert

Jochen

irgendwie dafür sorgen, dass ich immer die gleiche Instanz zurückgebe, weil

Jochen

wen interessiert es?

Jochen

Ja, aber genau, das sind alles,

Jochen

es geht immer so um State Handling im Grunde, das ist immer so,

Jochen

und wer manipuliert den und wie kann man dafür sorgen,

Jochen

dass man

Jochen

den Code, der den State manipuliert, an einer Stelle behält

Jochen

und so und nicht, weil das sind immer so

Jochen

das ist was, was halt man am Anfang

Jochen

das ist ein bisschen unintuitiv, das

Jochen

denkt man sich so, naja, das ist ja kein Problem

Jochen

State kann irgendwo sein, egal

Jochen

ist in einer Variable, in einer globalen Variable

Jochen

oder so oder halt auch

Jochen

oft verteilt oder man hat

Jochen

die Klassen, sich mal irgendwie überlegt, wie

Jochen

so eine Klassenhierarchie aussehen soll

Jochen

oder so, aber

Jochen

zieht das dann durch, unabhängig davon, wie das Problem

Jochen

eigentlich ist und

Jochen

das fiese, was manchmal dann

Jochen

oder fast immer passiert, irgendwie

Jochen

ist, dass man dann halt den State verteilt

Jochen

über viel Code.

Jochen

Was ist überhaupt State?

Jochen

Das, was du

Jochen

speichern musst, was sich

Jochen

irgendwie ändert.

Jochen

Der Status.

Jochen

Also

Jochen

sagen wir mal so, bei einer Web-Applikation würde

Jochen

man sagen, das ist der State einer Web-Applikation,

Jochen

liegt üblicherweise dann eben in der Datenbank.

Jochen

Das ist so einer klassischen

Dominik

Datenbank.

Dominik

Was bedeutet das? Also was ist

Dominik

denn überhaupt dann der State? Sagt

Dominik

der, wie der

Dominik

Nutzer gerade aussehen soll, wie der heißt

Dominik

und was er für Daten gespeichert

Dominik

hat für sein Profil, was

Dominik

er sehen soll. Und das ist halt nicht dynamisch

Dominik

generiert, sondern das liegt dann irgendwo rum.

Dominik

Das heißt, wenn man das ändern

Dominik

möchte, dann muss man erst die Daten anfragen oder so was.

Dominik

Das macht man dann gar nicht woanders.

Dominik

Ja, genau.

Dominik

Also

Jochen

das, was halt sozusagen

Jochen

beschreibt, in welchem Zustand

Jochen

deine Applikation ist.

Jochen

Gehen wir jetzt nochmal aufs Spiel kurz, also was

Dominik

mit der Figur ist, was hat die gerade für eine Waffe

Dominik

in der Hand, was für Lebensenergie hat die, wie viel

Dominik

Rüstung hat die noch an, das wäre der State.

Jochen

Genau, dann gehst du irgendwo in einen virtuellen

Jochen

Laden und kaufst dir irgendwie das magische

Jochen

sonst was Schwert, Feuerschwert, mit dem

Jochen

du irgendwie alle platt machen kannst, dann muss

Jochen

ja irgendwo gespeichert werden, dass du das jetzt

Jochen

hast, dass das deine Adventure ist. Und ich darf aber auch

Dominik

keine zwei gleichzeitigen Sachen dann irgendwie

Dominik

haben, also damit das sich jetzt nicht widerspricht, darf es immer noch

Dominik

ein State geben, das so das, was

Jochen

dahinter steckt. Die interessante Frage ist, wie

Jochen

verwaltet man diesen State?

Jochen

sozusagen. Und

Jochen

naiv

Jochen

wäre halt, man hat

Jochen

halt zum Beispiel, Held da ist halt in irgendwelchen

Jochen

globalen Variablen. Man hat halt eine Liste,

Jochen

die ist halt global,

Jochen

genau, da steht halt drin,

Jochen

ja, hier ist halt das Flammenschwert

Jochen

und das ist da jetzt in dieser Liste der

Jochen

Items drin. Und alle manipulieren

Jochen

diese Liste von Items irgendwie.

Jochen

Aber das macht dann halt Probleme,

Jochen

weil dann ist Logik, die jetzt

Jochen

irgendwie solche Sachen

Jochen

abbildet, wie das Flammenschmerz

Jochen

macht jetzt plus 10 Angriff, aber

Jochen

auf der anderen Seite wird dir heiß, das heißt

Jochen

wird dir die Hand heiß und

Jochen

du verlierst irgendwie alle halbe Stunde ein paar Lebenspunkte

Jochen

oder sowas, keine Ahnung.

Jochen

Das ist ja Code,

Jochen

der irgendwie diese Business-Logik,

Jochen

wenn man das so sagen kann, in dem Spiel

Jochen

halt implementiert und das kann ja sein, dass da

Jochen

unterschiedlicher Code an unterschiedlichen Stellen steht

Jochen

und wenn du jetzt überall das gleiche

Jochen

globale

Jochen

Variable hast,

Jochen

auf die du zugreifst, da musst du dafür sorgen,

Jochen

dass dieser gesamte Code, der halt

Jochen

über dein Projekt verteilt sein kann,

Jochen

dass der immer weiß, was alle anderen Sachen

Jochen

machen. Und das geht ab einer gewissen Größe nicht

Jochen

mehr. Am Anfang geht das, solange es alles sehr klein

Jochen

ist, kriegt man das auch noch hin, dass man

Dominik

das alles im Kopf behält. Ja, du musst halt jedes Mal zumindest

Dominik

diese Überprüfung machen. Du musst halt jedes Mal gucken,

Dominik

hat denn jemand irgendwas geändert an der Stelle, das nicht sein

Dominik

darf. Das heißt, jede dieser Logiken müsstest du

Dominik

bei jeder Stelle, wo

Dominik

diese globale Variable geändert wird,

Dominik

erneut machen, was halt dem Don't Repeat Yourself

Dominik

widerspricht und so.

Jochen

das kann schon durchaus so sein,

Jochen

dass man sich da nicht wiederholt, aber

Jochen

du kannst halt Änderungen machen,

Jochen

die dann nicht lokale Auswirkungen haben.

Jochen

Also nehmen wir an, du weißt das halt alles

Jochen

nicht. Du machst jetzt halt ein neues

Jochen

Item, sozusagen, das irgendwelche

Jochen

Spezialgeschichten hat, schreibst da Code für,

Jochen

dass das halt irgendwie tut

Jochen

und dabei bedenkst du aber nicht,

Jochen

dass unter bestimmten Umständen

Jochen

irgendwelche Anarchoid irgendwas anderes tut.

Jochen

Und dann passieren halt Fehler

Jochen

und seltsame Effekte und

Jochen

solange man halt von dem

Jochen

ganzen anderen Code, der irgendwie daran rummanipuliert

Jochen

irgendwie weiß, ist das ja okay, aber

Jochen

sobald das Projekt irgendwie größer wird, geht das

Jochen

irgendwann nicht mehr und dann

Jochen

kann man überhaupt nicht vorhersagen, was passieren

Jochen

wird, wenn man jetzt irgendwie

Jochen

Dinge ändert, wie man manipuliert

Jochen

irgendwas an den Lebenspunkten oder so und dann

Jochen

gibt es irgendwas anderes, was wiederum nochmal was anderes

Dominik

macht. Der Invincible

Jochen

Geist. Ja, und

Jochen

das Mittel dagegen ist halt,

Jochen

dass du eben nicht direkt

Jochen

die Daten pro anfasst,

Jochen

sondern, dass du sagst,

Jochen

okay, wir haben hier eine Klasse oder so

Jochen

und der ist, bündeln wir den State, also die Daten

Jochen

und die Logik, die jetzt irgendwas damit macht

Jochen

und haben da eine API nach außen, die öffentlich ist

Jochen

und können sozusagen immer überprüfen,

Jochen

dass alles ordentlich ist an einer Stelle.

Dominik

Ja, die Frage war, was ist ein Objekt in Python?

Jochen

Was ist ein Objekt in Python?

Jochen

Ich würde es jetzt mal sagen,

Jochen

das erklärt aber nicht viel,

Jochen

ist halt die Instanz,

Jochen

konkretisierte Instanz von

Jochen

irgendwie einer Klasse.

Jochen

Also

Jochen

in einer Klasse definiert man sozusagen

Jochen

irgendwie, ja,

Jochen

eben eine

Jochen

Zusammenfassung von irgendwie Code, der was

Jochen

tut und irgendwie Daten,

Jochen

die man irgendwie halten will und

Jochen

wenn man das jetzt, das ist halt sozusagen

Jochen

die Beschreibung

Jochen

und wenn man da jetzt daraus...

Dominik

Ich sag nicht so besonders an von dem Brot, der irgendeine

Dominik

Beschreibung von irgendwelchen Sachen...

Jochen

Ja, also man könnte das vielleicht

Jochen

also... Also ein Objekt

Dominik

ist ein Ding. Also ich glaube, in Python ist alles ein Ding

Dominik

oder ein Objekt, oder? Alles ein Objekt, ja.

Dominik

Also alles, was es in Python gibt, kann sich

Dominik

als Objekt darstellen. Also ein Objekt ist immer

Dominik

eine Instanz einer Klasse,

Dominik

wenn man das so sagt. Ja. Das heißt,

Dominik

alles, was ihr habt in Python, sind tatsächlich

Dominik

Instanzen von irgendwelchen Klassen, von irgendwelchen Dingen.

Dominik

Ja. Die nächste Frage

Dominik

war, was ist Self? Self ist immer

Dominik

das Objekt selbst, also wenn man in dem Objekt

Jochen

auch eine, ist eine Konvention sozusagen, dass man

Jochen

das so nennt, aber

Jochen

sehr sinnvoll, das so zu machen.

Jochen

Außer es gibt wiederum Spezialfälle, bei denen

Jochen

man das ein bisschen anders macht. Also wenn man

Jochen

eine Methode hat, also Methode ist nichts

Jochen

weiter als eine Funktion,

Jochen

die sozusagen an so ein

Jochen

so eine

Jochen

Instanz, an so ein Objekt gebunden ist.

Jochen

Und jetzt

Jochen

möchte man halt, um zum Beispiel auf die Daten,

Jochen

die man halten möchte, in so einem Objekt

Jochen

um da drauf zuzugreifen, muss man

Jochen

ja irgendwie sich selbst referenzieren können

Jochen

deswegen wird immer als erstes Argument in Methoden

Jochen

das ist halt auch das

Jochen

was dann Methoden von Funktionen unterscheidet

Jochen

immer eine Referenz auf

Jochen

das

Jochen

auf sich selbst sozusagen mit übergeben

Jochen

man könnte das auch anders nennen

Jochen

man kann auch sagen

Jochen

A statt Self, dann ist es A

Jochen

aber es ist schon sinnvoll das Self zu nennen, damit man weiß

Jochen

dass es halt eine Referenz auf

Jochen

sich selbst ist, sozusagen auf das Objekt

Jochen

was gerade, was man gerade ist.

Jochen

Und dann kann man halt auf Self-Punkt

Jochen

irgendwelche Daten zugreifen.

Jochen

Da fangen wir jetzt direkt ein paar andere Sachen ein,

Dominik

weil wir jetzt gerade so hatten mit Objekt.

Dominik

Was ist denn ein Objekt? Es ist eine Klasse und jetzt gibt es

Dominik

irgendwie drei Dekoratoren, also wir müssen noch gleich

Dominik

darüber sprechen, was ein Dekorator ist,

Dominik

aber es gibt drei Dekoratoren, die Python

Dominik

verwendet, die da immer so drüber

Dominik

stehen. Static Method, Class Method

Dominik

und

Dominik

Property. Über Property hattest du eben auch schon.

Dominik

Was ist denn jetzt da irgendwie

Dominik

so der kleine

Dominik

Hagen, also wann

Dominik

dachte man jetzt zum Beispiel, das ist eine statische Methode

Dominik

und wann dachte man, das ist eine Klassenmethode?

Dominik

Was heißt das denn in dem Kontext zu Self und

Jochen

Objekt und

Jochen

Ja, also ich würde eigentlich

Jochen

am liebsten mit der

Jochen

Klassenmethode anfangen, also

Jochen

Class Method

Jochen

ist halt eine

Jochen

eine

Jochen

Methode, die eben nicht eine konkrete

Jochen

Instanz, das heißt da fehlt auch

Jochen

Self bei der, genau, da könnte man

Jochen

jetzt auch Self übergeben, das wäre dann sehr verwirrend

Jochen

sondern was man da üblicherweise

Jochen

übergibt, ist ein CLS

Jochen

oder so und bekommt man die Klasse übergeben.

Jochen

Die Klasse ist auch wieder ein Objekt.

Jochen

Das ist auch irgendwie, man kann das dann noch ein Stückchen

Jochen

weitertreiben, auch dann mit dem Meta-Klassenanschluss.

Dominik

Also die kleinste, das kleinste Objekt, also

Dominik

jede Klasse ist irgendwie ein Objekt und das Objekt

Dominik

Objekt und Objekt selber ist ein Objekt vom Typ-Typ.

Dominik

Ja, okay.

Dominik

Ja, okay.

Jochen

Ja, also

Jochen

jedenfalls

Jochen

in der Klassenmethode

Jochen

übergibt man halt CLS und nicht

Jochen

Self, weil man damit halt weiß,

Jochen

dass man jetzt gerade die Klasse in der Hand hat und nicht

Jochen

eine Referenz

Jochen

auf die Instanz.

Jochen

Und es gibt

Jochen

halt, das verwendet man vor allen Dingen dafür, dass

Jochen

man, es gibt halt bestimmte Methoden,

Jochen

die brauchen eben nicht, die müssen nicht

Jochen

auf irgendwelche internen Daten oder so zugreifen,

Jochen

weil die hat man ja nicht.

Jochen

Sondern die machen halt,

Jochen

die gehören zwar vielleicht irgendwie in die

Jochen

Klasse rein, weil die Funktionalität,

Jochen

die sie bieten, halt sehr viel zu tun hat mit der

Jochen

Klasse, aber die

Jochen

verhalten sich in gewisser Weise natürlich dann so

Jochen

wie eine normale Funktion.

Jochen

Und vielleicht können sie auch

Jochen

auf Daten, die halt

Jochen

für alle Instanzen dieser Klasse

Jochen

gleich sind, zugreifen eben über die Klasse, aber

Jochen

die brauchen

Jochen

jetzt nicht

Jochen

irgendwie eine konkrete

Jochen

Instanz, auf der sie irgendwas machen. Also Beispiel

Jochen

für

Jochen

sowas sind, was ist denn ein gutes

Jochen

Beispiel für

Jochen

aus dem Spiel, also

Dominik

zwei Beispiele, die ich ganz gut zu visualisieren

Dominik

finde, entweder hat man so ein Spiel mit so

Dominik

Charakteren oder man hat so ein

Dominik

Universum mit Planeten und Dingen, die umeinander

Dominik

kreisen oder sowas. Zwei verschiedene

Dominik

Sonnensysteme als zwei Klassen.

Dominik

Okay, lass mir das.

Dominik

Ich weiß nicht so genau, ob ich das da irgendwie, also

Jochen

mir fällt da jetzt gar nichts

Jochen

also es sind oft

Jochen

irgendwelche Hilfsfunktionen oder so, die

Jochen

was machen, was logisch dann

Jochen

in der Klasse gehört, aber wo man nicht mit einer konkreten

Jochen

Instanz irgendwas zu tun hat

Jochen

mir fällt jetzt tatsächlich kein super tolles Beispiel

Dominik

Was ist denn der beste

Dominik

Static Method, was wäre das denn jetzt so als

Dominik

Ja, Static Method

Dominik

Die bekommt halt einfach

Jochen

tatsächlich überhaupt nicht mal die Klasse.

Jochen

Aber im Prinzip ist das nichts anderes,

Dominik

außer dass sie nur nicht mal die Klasse bekommt.

Dominik

Das heißt, sie könnte man auch

Dominik

draußen hinschreiben. Genau.

Dominik

Der einzige Unterschied bei der StaticMethod ist halt, dass sie dann

Dominik

im Namespace der Klasse

Dominik

oder des Objekts aufrufbar ist oder so.

Dominik

Ja, was ist jetzt in dem Vergleich eine StaticMethod?

Dominik

Okay.

Jochen

Ja, also StaticMethod

Jochen

bekommt gar kein

Jochen

automatisches Argument

Jochen

mit, sozusagen.

Jochen

Das wäre dann die reine,

Jochen

wäre quasi wie eine Funktion, ja, also es ist

Jochen

egal, ob man jetzt Static-Method

Jochen

aufruft oder halt

Jochen

eine Funktion von draußen, genau.

Jochen

Ah, richtig, jetzt fällt

Jochen

mir doch wieder ein Beispiel ein zu Class-Method, wo das

Jochen

wenn man jetzt

Jochen

in Django zum Beispiel Modelle hat,

Jochen

dann sind halt

Jochen

viele Geschichten,

Jochen

die jetzt ein Modell betreffen, die man von außen

Jochen

aufrufen kann, ruft man halt auf der Klasse auf

Jochen

und nicht auf einer Instanz, weil eine konkrete

Jochen

Instanz ist ja zum Beispiel,

Jochen

man hat ja die Daten für,

Jochen

die Geschichten stehen halt

Jochen

in der Datenbank

Jochen

und jetzt eine konkrete Instanz

Jochen

eines, also Django-Modelle

Jochen

sind Klassen

Jochen

und sie modellieren sozusagen

Jochen

den Zustand, der irgendwie in der Datenbank steht

Jochen

und eine Instanz

Jochen

üblicherweise ist halt

Jochen

eine Zeile, also wenn ich jetzt zum Beispiel

Jochen

ein Beispiel User nehme, ja, also ein User-Objekt

Jochen

in Django ist halt

Jochen

eine Zeile aus der Tabelle

Jochen

Users irgendwie und

Jochen

hat halt all die Attribute,

Jochen

die jetzt irgendwie die Zeile hat, also

Jochen

Spalten hat sozusagen in dieser Tabelle.

Jochen

Ja, aber ich

Jochen

möchte jetzt möglicherweise Dinge machen

Jochen

auf der kompletten Tabelle.

Jochen

Auf allen Nutzern. Ja, genau, auf allen

Jochen

Nutzern oder ich möchte einen neuen Nutzer erzeugen.

Jochen

Ja, das kann ich ja jetzt nicht innerhalb

Jochen

von einem Nutzer machen, sondern das ist halt

Jochen

irgendwie, ja, und dafür

Jochen

sage ich dann

Jochen

irgendwas, Users.Objects.Create

Jochen

und das ist dann halt eine Class-Method,

Jochen

die zwar sozusagen

Jochen

ja, Informationen über die Klasse braucht

Jochen

und wissen muss, was man dann so tut.

Jochen

Also Users.Create. Streng genommen ist es

Jochen

naja, Objects.Create ist halt

Jochen

der Model-Manager, auf den man das aufruft,

Jochen

aber das ist halt dann ein Ding,

Jochen

aber dieses Objects ist halt... Ja, den Manager lassen wir jetzt mal kurz

Jochen

weg, da müssen wir uns schon ein bisschen zu sagen gehen. Ja, es ist nochmal

Jochen

komplizierter, aber dieses Objects ist auf jeden Fall

Jochen

Dingen, was an der Klasse hängt

Jochen

von

Jochen

ja, was halt sozusagen

Jochen

also man kann sich das so vorstellen, es betrifft halt

Jochen

die gesamte Tabelle, man erzeugt jetzt auf dieser Tabelle

Jochen

eine neue Zeile und das kann nicht eine Methode

Jochen

sein, die man auf einer Instanz aufruft, sondern

Dominik

die halt Instanz und die eine Zeile repräsentiert, weil innerhalb

Dominik

von der einen Zeile sich selber irgendwie

Dominik

ranzeigen würde, gar nicht so richtig funktioniert. Ja, könnte man auch machen,

Jochen

wäre irgendwie komisch. Und warum

Dominik

nimmt man jetzt aber dafür jetzt nicht einfach eine Static-Method?

Jochen

Ja, könnte man auch, aber, nee, kann man nicht,

Jochen

weil dann würde man halt zum Beispiel nicht mehr wissen,

Jochen

was sind denn jetzt die ganzen Felder.

Jochen

Wie der Kontext von der Tabelle wahrscheinlich.

Jochen

Genau, man möchte ja auch wissen, welche Attribute gibt es,

Jochen

was muss ich eigentlich da, und so, das, ja, das muss man ja auch,

Jochen

welche Tabelle ist denn das überhaupt, wo steht die in der Datenbank,

Jochen

und das hängt halt an der, das sind Informationen,

Jochen

die an der Klasse dranhängen, und, ja.

Dominik

Das heißt, die Static Method würde mir sowas sagen,

Dominik

wie ist da draußen denn was anderes noch verfügbar,

Dominik

das könnte ich dann vielleicht gucken.

Jochen

Static Method könnte sowas sein wie

Jochen

hash mir mal das Passwort.

Jochen

Also hier hast du einen String, mach mir mal einen Hash davon,

Jochen

den ich dann irgendwie in die Datenbank schreibe.

Jochen

Das braucht gar keinen Kontext.

Jochen

Das nimmt irgendwie einen String und gibt einen anderen String raus.

Jochen

Das braucht aber sonst überhaupt nichts zu wissen.

Jochen

Und das könnte dann ein Static Method

Jochen

sein zum Beispiel. Aber es gehört halt logisch

Jochen

vielleicht schon in die User-Klasse, weil es halt

Jochen

irgendwie um Passwörter geht, die

Jochen

ein User eingibt und die dann halt irgendwie

Jochen

gehashed werden sollen.

Jochen

Jetzt haben wir noch Property.

Jochen

Property-Dekorator, ja, der ist

Jochen

da geht es eigentlich nur darum,

Jochen

dass man

Jochen

ja, so ein bisschen Convenience, dass man

Jochen

nicht eine Methode aufruft, sondern

Jochen

also man schreibt halt

Jochen

also der häufigste Fall ist, man hat

Jochen

eine Methode, die nennt man so wie

Jochen

ein Attribut und schreibt dann addProperty drüber

Jochen

und dann

Jochen

wird halt diese Methode aufgerufen,

Jochen

wenn man irgendwo sagt Instanz.

Jochen

Also braucht man eigentlich nicht, man könnte auch

Jochen

eine Methode schreiben.

Jochen

Ja, aber dann müssen wir halt dann an der Stelle, wo man es

Jochen

verwenden will, Klammer auf Klammer

Jochen

zusagen, was halt so ein bisschen sinnlos ist,

Jochen

wenn man zum Beispiel gar nichts übergeben möchte

Jochen

an Argumenten und

Jochen

vielleicht auch etwas ist, was halt

Jochen

so aussehen soll, als wäre es ein Attribut,

Jochen

aber wo man Sachen noch ausrechnen will

Jochen

und dann kann man halt den Property-Dekorator

Jochen

benutzen, um halt...

Dominik

Oh, das ist quasi ein getarntes Methodending.

Dominik

Ja, ist so manchmal ein bisschen,

Dominik

also das ist auch so,

Dominik

diese Dekorator-Geschichte

Jochen

ist so manchmal ein bisschen,

Jochen

also

Jochen

auf Python steht ja sowas, explizit ist besser

Jochen

als implizit. Und das ist halt schon ganz schön

Jochen

implizit, dass wenn man jetzt irgendwo

Jochen

eben

Jochen

Instanz

Jochen

x.huber sagt, halt dann

Jochen

irgendwie Code ausgeführt wird, der irgendwas ausrechnet

Jochen

und dann unter Umständen auch sehr langsam sein kann.

Jochen

Das ist halt nicht unbedingt, also in dem Moment, wo man

Jochen

das halt lokal liest,

Jochen

weiß man nicht, was passiert. Was immer so

Jochen

ein bisschen schlecht ist. Aber

Jochen

ja, es ist eigentlich

Jochen

normalerweise, wenn man dann komplizierte Sachen

Jochen

macht, dann sollte man das vielleicht dann auch eher

Jochen

als Methode hinschreiben und dann

Jochen

wird das dann vielleicht klarer.

Dominik

Aber wenn man kurz vielleicht zwei Attribute

Dominik

hat, wie das eine ist Kosten, das andere

Dominik

ist Umsatz und dann will man den

Dominik

Gewinn ausrechnen, dann kann man vielleicht schon eine Funktion

Dominik

machen, die dann einfach kurz als

Dominik

Property sagt, hier gibt man Umsatz

Dominik

gewinnen und dann geht das einfach schnell aus.

Jochen

Und ja, also

Jochen

das Get

Jochen

zu implementieren ist sehr leicht, man schreibt irgendwie

Jochen

der Property drüber und dann war's das. Das Set

Jochen

geht auch, also man kann das auch so machen, dass dann halt ein Setter

Jochen

aufgerufen wird, wenn man sagt,

Jochen

Instance x.fuba gleich irgendwie.

Jochen

Das ist ein bisschen komplizierter,

Jochen

aber, tja, geht auch so ähnlich.

Jochen

Ja,

Jochen

also man kann, ich weiß nicht genau,

Jochen

man kann mit dem Property-Dekorator irgendwie sagen,

Jochen

das ist hier der Getter, das ist hier der Setter oder was.

Jochen

Ach, ich weiß nicht genau. Man kann dann nachgucken, wenn man es braucht.

Jochen

Braucht man selten. Also ich

Jochen

habe es ein paar Mal benutzt, aber nicht oft.

Jochen

Aber überhaupt das

Jochen

Konzept von Dekoratoren.

Dominik

Getter-Setter bedeutet halt, dass man die Attribute irgendwie

Dominik

von außen dann beeinflussen und setzen.

Dominik

von der Instanz setzt,

Jochen

bekommt oder setzt,

Jochen

genau, und zwar nicht direkt manipuliert, sondern

Jochen

halt Methoden

Jochen

dafür aufruft, die dann noch irgendwas vorher und hinterher tun.

Jochen

Jetzt haben wir schon ungefähr 50 Mal Dekorator gesagt und du wolltest

Jochen

da nicht noch irgendwas anderes vorher sagen.

Jochen

Dann muss man vielleicht nochmal erklären, was ein Dekorator eigentlich ist.

Jochen

Eigentlich ist es eine sehr,

Jochen

eigentlich nicht so,

Jochen

es kann

Jochen

leicht kompliziert werden.

Jochen

Ja, es ist

Jochen

auf der einen Seite ein bisschen Spezial-Syntax,

Jochen

Diese Geschichte mit dem Ad-Symbol, dass man halt über Klassen und über Methoden, Funktionen schreiben kann.

Jochen

Auf der anderen Seite ist es, man könnte es auch anders hinschreiben.

Jochen

Da bräuchte man diese Spezialsyntax nicht, also die einem das so ein bisschen vereinfacht.

Jochen

Man könnte halt auch hinschreiben, irgendwie x gleich, wrap mir mal eine andere Funktion, wrap, Klammer auf, irgendwie eine andere Funktion, Klammer zu.

Jochen

Und dann wäre das die dekorierte, wäre x die dekorierte Funktion.

Jochen

Und man macht sich eine Tapete auf die Wand und unter der

Dominik

sieht man dann halt hier Sachen anders.

Dominik

Ah, die Form bleibt erhalten, aber die ist dann

Dominik

vielleicht rot oder blau.

Jochen

Ja, also die Idee ist sozusagen, dass man

Jochen

etwas

Jochen

macht, also man halt Code hat, der

Jochen

ja, man packt,

Jochen

deswegen ist Dekorator eigentlich auch

Jochen

und das zeichnet ziemlich genau, was es tut.

Jochen

Man hat halt...

Dominik

Input und Output, der rauskommt oder

Dominik

reingeht, wird...

Jochen

Geht nochmal durch anderen Code durch und dann

Jochen

sozusagen, man kann halt

Jochen

bevor irgendwas, bevor die Funktion aufgerufen

Jochen

wird, irgendwie Dinge damit tun und

Jochen

hinterher Dinge mit dem

Jochen

Das wird aber ganz schön langsam, wenn das durch einen Dekorator

Dominik

hat, der einen Dekorator hat, der einen Dekorator hat, dann

Jochen

Ja, aber normale

Jochen

Funktionsaufrufe macht man

Jochen

ja auch, ist auch okay, also

Jochen

und das ist ja auch nichts anderes im Grunde. Das heißt, wenn man

Dominik

einen Dekorator selber schreibt, dann baut man quasi einen eigenen

Dominik

Rapper und sagt halt, was passiert, bevor der da reingeht und

Dominik

wann der wieder rauskommt.

Jochen

Ja, man sollte auch

Jochen

tatsächlich

Jochen

nicht wirklich, wenn man Dekoratoren

Jochen

schreibt, nicht das selber machen,

Jochen

sondern man sollte für den Functools

Jochen

Wraps oder so nehmen.

Jochen

Und weil es gibt

Jochen

noch so ein paar Hakeligkeiten mit den

Jochen

Funktionsnamen zum Beispiel, die sonst verschwinden,

Jochen

wenn man, die sieht man in Tracebacks nicht mehr

Jochen

und da muss man so ein bisschen, und dann gibt's

Jochen

halt eben in den Functools

Jochen

gibt's da glaube ich

Jochen

irgendwie

Jochen

Funktionen, die, wenn man die benutzt, um

Jochen

einen Dekorator zu bauen, dann kümmern die sich um diesen

Jochen

Kram, sodass halt dann man in Traceworks weiterhin

Jochen

die Namen sieht und so. Also das ist ein bisschen...

Dominik

Was hat denn das jetzt mit so einem Kontext zu tun? Kontextmanager oder so?

Jochen

Oh nee, das hat aber nichts zu tun.

Jochen

Das ist eine andere Geschichte.

Jochen

Das hört er sich so ein bisschen an, als macht man irgendwie so einen Kontext auf und

Dominik

rappt irgendwas und baut das dann am Ende

Dominik

wieder auseinander.

Dominik

Also

Jochen

ja,

Jochen

also was eventuell irgendwie

Jochen

eine Gemeinsamkeit

Jochen

ist, dass beides irgendwie unten drunter vielleicht

Jochen

Closure ist verwendet, weil es, wie das

Jochen

umgesetzt ist, aber

Jochen

das ist sozusagen

Jochen

eine interne Funktion, die halt

Jochen

zurückgegeben wird

Jochen

und

Jochen

die halt, das ist ja auch so der Trick, wie man das hinkriegt,

Jochen

dass der Scope,

Jochen

dass man halt auf die Sachen zugreifen kann,

Jochen

die im Scope der Funktion sind,

Jochen

dass man halt sozusagen,

Jochen

naja, das ist zu kompliziert,

Jochen

das kann man alles nicht so, das ist auch nicht entfängermäßig,

Jochen

das kann man nicht gut erklären, da muss man sich einfach mal,

Jochen

also ich würde sagen, also ein Tipp ist,

Jochen

und wenn man Dekoratoren schreiben will, aus den Functools die Wraps-Funktion zu nehmen

Jochen

und einfach mal so ein bisschen damit rumzuspielen.

Jochen

Man braucht ein bisschen, bis man das so raus hat.

Jochen

Aber dafür sind Dekoratoren da.

Jochen

Man kann damit ganz nette Sachen machen, wie zum Beispiel,

Jochen

also wenn man einfach nur wissen will, wofür braucht man solche Sachen eigentlich.

Jochen

Wenn man, ja zum Beispiel eben wieder Datenbankgeschichte, kann man sagen, okay, gibt es einen Transaktions-Dekorator, da schreibt man einfach drüber.

Jochen

A Transaction Atomic.

Jochen

Genau. Das hier ist jetzt alles in einer Transaktion und alle Schritte gehen zusammen gut oder gar nicht. Und wenn halt zwischendurch irgendwas nicht funktioniert hat, dann rollt das automatisch die Datenbank in den ursprünglichen Zustand zurück, als wäre nichts passiert.

Dominik

Das ist ein tolles Beispiel, weil da gibt es nämlich auch den Kontextmanager, man kann auch sagen, with a Transaction Atomic.

Jochen

Ja, ja, ja, genau. Klar, kann man auch machen. Das ist eine Geschichte. Ansonsten, man kann auch Dekoratoren dafür benutzen, um sich jetzt eine bestimmte Datenbankverbindung immer reinzuholen in eine Funktion.

Jochen

Ja, da werden wir jetzt gerade über Tango reden.

Dominik

Da wird das ja auch benutzt, zum Beispiel, um Funktionen zu dekorieren.

Dominik

Login required, dass man halt irgendwie eingeloggter Benutzer sein muss.

Dominik

Das heißt, die Frage ist halt, was er dann macht.

Dominik

Das kann man auch als Mixin benutzen.

Dominik

Das heißt, auch das wäre eine ähnliche Methode.

Dominik

Ein Mixin ist eine Subklasse, eine Klasse, die man benutzt,

Dominik

um bestimmte Attribute zusätzlich dazu zu packen.

Dominik

Mixin sind so ein bisschen eben, wie man Code wiederverwenden kann,

Jochen

in Klassen ohne erben zu müssen.

Jochen

Weil Erben macht natürlich das ganz klassische Weg und das kann man natürlich auch tun.

Dominik

Ja, also in gewisser Weise ist es ja eine Form von Vererben, aber eine generalisierte Form, die irgendwie jetzt nichts genau mit der ursprünglichen Klasse zu tun hat.

Jochen

Ja, genau. Also du kannst halt, ist es nicht so, dass du, ja, also zwei unterschiedliche Klassen, die nichts miteinander zu tun haben, ganz unterschiedliche Stellen in der Klassengereiche sind, können halt das gleiche Mix-In verwenden.

Dominik

Cool, das ist so ein bisschen wie Genetik. Du kannst dem Frosch Flügel geben oder so.

Jochen

Ja, warum auch nicht?

Dominik

Ja, wenn man die Flügel haben will,

Dominik

man hat irgendwie eine Klasse, die Flügel bereitstellt,

Dominik

dann kann man diese Flügel jeder Klasse geben.

Jochen

Ja, macht natürlich auch nicht immer Sinn.

Jochen

Aber also Vererbung ist auch so ein problematisches Gefühl.

Jochen

Das ist immer das, was einem,

Jochen

wenn man sich mit objektorientierter Programmierung beschäftigt,

Jochen

irgendwie so gesagt wird, wie man das tun soll oder so am Anfang.

Jochen

Keine Ahnung, jedenfalls bei mir ist es mittlerweile auch besser geworden,

Jochen

dass man halt Sachen von Dingen dann erbt,

Jochen

dass man halt, keine Ahnung,

Jochen

ja, weiß ich nicht, da wird immer mit

Jochen

solchen Beispielen gearbeitet,

Jochen

was

Jochen

dass man

Jochen

irgendwie, keine Ahnung, meistens irgendwelche geometrischen Formen

Jochen

oder sowas, irgendwie, wenn man

Jochen

jetzt ein rechtwinkliges Dreieck hat, dann ist das

Jochen

auf jeden Fall schon mal ein Dreieck und ein Dreieck

Jochen

ist irgendwas, was halt irgendwie...

Dominik

Ja, ich finde das gar nicht so schlecht, das nämlich dem Gradius auch vorzustellen.

Dominik

Also die Gourmet-Reformen sind zwar ganz okay,

Dominik

aber vielleicht auch mit dieser Universumsgeschichte.

Dominik

Du hast irgendwo ein großes schwarzes Loch,

Dominik

so den Urknall oder sowas.

Dominik

Und ein Objekt orbitet da irgendwie herum.

Dominik

Das ist jetzt vielleicht schon mal so eine Galaxie,

Dominik

und dann, das ist also die

Dominik

Subklasse, wäre es halt Universum, das wäre

Dominik

die Basisklasse, von der alles irgendwie erbt,

Dominik

alles so ein Ding. Das ist ein bisschen groß.

Dominik

Ja, dann hast du halt eine Galaxie, das ist ja schon

Dominik

das erste kleine Ding, dann, oh, okay, in der Galaxie

Dominik

gibt es jetzt ein Sonnensystem. Ein Sonnensystem ist auf jeden Fall

Dominik

Teil einer Galaxie, da gelten halt die gleichen Gesetze,

Dominik

physikalischen Gesetze. Und dann hast du ein Sonnensystem, hast du

Dominik

einen Planeten, das ist jetzt vielleicht schon unsere

Dominik

speziellere Klasse. Und dann weißt du halt, genau,

Dominik

das gibt verschiedene Sonnensysteme, die haben vielleicht

Dominik

gleiche Grundlagen und Planeten,

Dominik

können jetzt aber verschiedene Dinge

Dominik

besonders machen. Ja, aber ich glaube,

Jochen

ich fürchte, also das wird auch,

Jochen

also mit solchen Dingen,

Jochen

glaube ich, dass Leute versuchen, da irgendwie so

Jochen

Alltags-Ontologie irgendwie...

Jochen

Ja, aber der Orbit ist ja schon,

Dominik

das passt ja schon, weil dieser Planet, der orbitet

Dominik

ja, ne, dieser,

Dominik

diesem Stern, und der Stern, der orbitet

Dominik

ja dem Zentrum dieser Galaxis, so.

Dominik

Ja, dann wäre sozusagen die

Jochen

allgemeinste Oberklasse wäre sowas wie Himmelskörper

Jochen

oder sowas, oder keine Ahnung.

Dominik

Nee, nee, nee, ich glaube, das ist gar nicht so,

Dominik

also Himmelskörper-Objekt, na, ich weiß nicht.

Dominik

Du brauchst ja schon ein Orbit, das ist ja

Jochen

Ja, aber ich würde nicht,

Jochen

ich würde, also das, ich sehe,

Jochen

ich sehe, dass das immer wieder

Jochen

passiert und das solche Leute, dass das versucht wird,

Jochen

das so zu beschreiben und ich finde, das ist

Jochen

nicht hilfreich, weil, ähm.

Jochen

Also Mond, Vermieter, Planet.

Jochen

Ja, das.

Jochen

Du hast ja irgendwie immer so eine Basisklasse, ja,

Dominik

und die Basisklasse vom Mond wäre jetzt der Planet, die Basisklasse

Dominik

vom Planeten wäre das Sonnensystem, die Basisklasse

Dominik

vom Sonnensystem wäre dann das Universum, die Basisklasse

Dominik

von dem Universum wäre dann vielleicht irgendwie, ne.

Jochen

Ja, nee, genau solche Sachen will man eigentlich nicht machen.

Jochen

Also das ist genau das, was ich, also das ist halt, ja, das klingt so ein bisschen danach, als würde das, aber ich würde das nicht versuchen so auf die Alltagswelt so zu applizieren, sondern es geht tatsächlich darum, dass man Sachen programmieren kann und das ist, das ist oft nicht so wie, das ist halt anders.

Jochen

Das ist nicht so wie die Welt da draußen, das ist schwer. Oft ist es nicht so, dass man die Welt da draußen modellieren muss und dann das, was man modellieren muss, ist ganz anders als das, was man so draußen normalerweise, man versucht diese Analogien, die gehen immer so ein bisschen ins, ich habe da Schwierigkeiten mit und ich finde, man kann sich das anders besser merken.

Jochen

Wenn man jetzt, also ich würde sagen, vererben sollte man einfach eher nicht machen, lieber nicht machen. Also es gibt Fälle, wo das richtig und wichtig ist, aber die sind selten. Und was einem aber erklärt wird, ist, dass das der Normalfall ist, so macht man das halt.

Jochen

Dann würde ich sagen, das ist ganz falsch. Nein, so macht man das eigentlich nicht. Also Vererbung, es gibt Fälle, wo das geht, wo das sinnvoll ist, aber das ist nicht so, dass man das immer machen oder normalerweise so machen sollte, sondern das ist halt eher die Ausnahme. Normalerweise sollte man, wenn man zum Beispiel Code in zwei Klassen wiederverwenden will, dann macht man halt Mixen und nicht diese Vererbung, weil das ist halt, auch am Anfang, das geht ganz gut, sobald es komplizierter wird, hat man da große Probleme, weil deine Hierarchie, die muss halt einfach stimmen, die muss halt passen auf dein Problem.

Jochen

und das kannst du hinterher nicht mehr gut ändern

Jochen

und hinterher gut anpassen, das geht alles nicht

Jochen

so richtig schön und am Anfang zu sehen,

Jochen

wie das richtig wäre für das Problem, was man

Jochen

eigentlich lösen will, ist sehr schwer.

Jochen

Ja, weil man das Problem meistens gar nicht genau weiß.

Jochen

Genau, man kennt meistens das Problem nicht richtig

Jochen

und bei Mixins ist es relativ simpel,

Jochen

das ist halt so wie, keine Ahnung, wenn ich nur,

Jochen

wenn ich ohne Objektorientierung

Jochen

programmiere, dann habe ich halt Funktionen,

Jochen

die ich aufrufe und

Jochen

wenn ich jetzt merke, ich benutze

Jochen

den gleichen Code an drei, vier unterschiedlichen Stellen,

Jochen

ja, dann

Jochen

mache ich halt eine Funktion

Jochen

draus und rufe den an den Stellen, wo ich

Jochen

sozusagen das verwenden möchte,

Jochen

den Code einfach auf.

Jochen

Anstelle, dass ich den Code aber nicht stehen habe.

Jochen

Und genauso kann man das mit Klassen im Grunde auch machen

Jochen

und Code, den ich in mehreren Klassen benutze,

Jochen

den ziehe ich halt in Mixins raus.

Jochen

Und dann ist es relativ easy,

Jochen

weil

Jochen

diese Mixins machen halt

Jochen

nichts anderes, außer irgendwie halt

Jochen

eine Methode sozusagen hinzuzufügen zu einer Klasse.

Jochen

ja,

Jochen

während so Vererbungen,

Jochen

hm,

Jochen

das macht halt mehr.

Jochen

Das tut mehr, also es gibt halt dann diese

Dominik

Basis, Basis-Klassen, Basis oder so was,

Dominik

oder es gibt noch so was wie Message,

Dominik

Resolution-Order, MROs, wo man dann gucken kann,

Dominik

welche Methoden in welcher Reihenfolge aufrufen

Dominik

werden, weil die sich ja gegenseitig überschreiben können

Dominik

und das Problem, was man dann hat, irgendwann ist

Dominik

das, wenn man da, wie du sagst, einen Fehler macht,

Dominik

dann hat man

Dominik

Circle-Vererbung oder so was.

Jochen

Ja, das passieren halt, genau, wenn man irgendwas falsch macht, dann passieren unerwartete Dinge, die man auch nicht so, die nicht so offensichtlich sind und ja, und es kann auch sehr schnell sehr hässlich werden, also es gibt wenig Fälle, wo das eine super sinnvolle Geschichte ist, das ist immer so, es ist halt so ein bisschen auch wieder wie bei den Dekoratoren, auch wenn man das am Anfang mal verstanden hat, wie das funktioniert, also ich meine, auch wenn man das mit der Vererbung verstanden hat, wie das funktioniert, dann ist das, dann fühlt sich das so toll an, dass man da ganz viele Dekoratoren machen will, ganz viele Vererbungen und am besten das Ganze irgendwie in den

Jochen

verschachtelte List-Comprehensions-Fakt oder so.

Dominik

Und mit Abtrag Meta-Klassen bitte?

Jochen

Ja, Meta-Klassen, oh ja.

Jochen

Aber

Jochen

ich weiß nicht, vielleicht keine gute Idee.

Jochen

Also jedenfalls nicht am Anfang.

Jochen

Wenn man dann irgendwann genau

Jochen

weiß, welches Problem man lösen möchte und man möchte

Jochen

halt ein Framework bauen, das halt, wo man

Jochen

dann, also nehmen wir irgendwie sowas wie General REST-Framework,

Jochen

finde ich das relativ gelungen.

Jochen

Da kann man oft viel

Jochen

Funktionalität abbilden, dadurch, dass

Jochen

man jetzt sozusagen von irgendeinem

Jochen

Viewset oder so erbt und

Jochen

dann überschreibt man noch zwei, drei Methoden, passt

Jochen

ein bisschen was an und dann macht das ganz viel.

Jochen

Sehr schön, aber dafür muss man sehr, sehr genau

Jochen

verstanden haben, welches Problem man hat und

Jochen

wenn man

Jochen

so anfängt, dann

Jochen

üblicherweise landet man relativ

Jochen

schnell in einem ziemlich üblen Zustand.

Jochen

In Teufelsküche, in der Schlangengrube.

Jochen

Ja, genau.

Jochen

Man kann das ja immer noch machen am Schluss, wenn man dann

Jochen

wirklich verstanden hat, was man tut und so, dann kann man ja

Jochen

immer noch dann irgendwie Klassengereiche hinbauen und so.

Jochen

Aber am Anfang lieber nicht.

Jochen

Ich glaube, das ist jetzt der richtige Ort für die nächste Frage.

Dominik

Die wäre, was heißt ein Monkey-Patch?

Jochen

Ja, das ist,

Jochen

da das alles Objekte sind in Python,

Jochen

kann man die natürlich, und die alle

Jochen

dynamisch

Jochen

änderbar sind, kann man ja auch

Jochen

sozusagen einfach die Methode

Jochen

eines Objektes einfach,

Jochen

man kann ja sagen, zum Beispiel, wenn ich

Jochen

nicht nur Attribute setze, sondern ich kann

Jochen

auch die Methode einfach überschreiben. Ich könnte zum Beispiel

Dominik

sagen, wenn ich meinen Barbaren habe, von dem wir eben

Dominik

geredet haben, und er hat ein Attribut,

Dominik

das heißt Attacke, und da ist immer irgendwas drauf,

Dominik

Dann kann ich einfach die überschreiben.

Dominik

Dann macht er bei der Attacke irgendwas anderes, zum Beispiel heilte ich oder so.

Dominik

Genau, genau. Und ich könnte einfach sagen,

Dominik

ja,

Jochen

baba.attack gleich

Jochen

lambda xyz, was auch immer

Jochen

da übergeben wird. Das wäre zum Beispiel

Jochen

wahrscheinlich die Möglichkeit, wie man

Dominik

Vererbung bei Klassen

Dominik

richtig macht, indem man die Basisklasse hat, die wäre

Dominik

jetzt wahrscheinlich in so einem

Dominik

Rollenspiel sowas wie eine Person

Dominik

und dann vererbt man dann auch verschiedene

Dominik

Rassen,

Dominik

zum Beispiel Echse oder Mensch oder sowas.

Dominik

naja, nee, ich wäre da sehr vorsichtig.

Dominik

Und dann hat man dann Klassen, die man dazu macht,

Dominik

also zum Beispiel Magier oder Barbar

Dominik

und dann kann man zum Beispiel Attacke

Dominik

oder so was schreiben.

Jochen

Ja, aber das ist halt sehr

Jochen

verführerisch, dass man halt ein Bild davon hat, wie das

Jochen

wie sozusagen die Welt, die man

Jochen

im Spiel bauen will,

Jochen

aufgebaut ist, aber tatsächlich ist das zu programmieren

Jochen

oft was anderes, als nur diese Welt zu

Jochen

modellieren und dann, das ist nicht

Jochen

das, oder jedenfalls meine Erfahrung ist so, dass

Jochen

wenn man das so versucht zu modellieren, wie man

Jochen

sich das vorstellt, dann passt es nicht

Jochen

so gut auf das, wie man das programmieren will.

Jochen

Sondern es ist halt einfach,

Jochen

ja, es ist...

Dominik

Aber das zu verstehen, das ist vielleicht

Dominik

schwierig, also für jemand, der das nicht weiß, warum,

Dominik

wieso, warum man das dann einfach nicht macht, obwohl das

Dominik

ja so intuitiv endlich so einen Zugang dazu gibt.

Jochen

Ja, genau, also ich, das ist

Jochen

halt, es gibt da auch immer diesen

Jochen

Spruch, es gibt für jedes Problem eine Lösung, die ist

Jochen

einfach, leicht

Jochen

zu verstehen, elegant und

Jochen

falsch.

Jochen

Das ist halt auch immer, und ich,

Jochen

was mich ärgert so ein bisschen, ist, dass es halt auch immer so

Jochen

Programmierlehrbüchern oder so oft so

Jochen

oder schlimm ist es,

Jochen

wenn Leute Programmieren

Jochen

erklären und dann vielleicht gar nicht selber

Jochen

so da drin stecken, dann machen die

Jochen

das oft so, dann fangen die da an mit irgendwelchen Analogien

Jochen

aus dem täglichen Leben zu kommen und dass man

Jochen

halt so das abbildet, das ist

Jochen

aber, ich weiß nicht,

Jochen

da liegt kein Segen drauf.

Jochen

Das funktioniert

Jochen

so nicht.

Jochen

Ja.

Jochen

Naja. Also ihr seht schon, wenn

Dominik

Wenn ihr über die Schlangengrube drüber wollt, dann ist da manchmal

Dominik

so ein bisschen, ja,

Dominik

Indiana Jones-Seit hängt von der Decke rüber schwingen.

Dominik

Ich würde, so

Jochen

Ratschlag wäre halt eher,

Jochen

versuchen einfach zu halten, nicht so komplizierte Sachen,

Jochen

so ganz komplizierten Sprachwitscher sind vielleicht nicht so viel

Jochen

zu verwenden oder

Jochen

das ein bisschen hinaus zu zögern.

Jochen

Ja, ich verstehe natürlich, dass das immer so ein bisschen

Jochen

auch reizvoll ist, aber

Jochen

nicht irgendwie so, wenn so Dinge

Jochen

so aussehen, als wie die Weltform, die alles löst.

Jochen

Sehr skeptisch sein.

Dominik

Ja, dann machen wir direkt wieder mit einfachen Dingen weiter.

Dominik

Was sind denn Argumente oder Keyword-Argumente?

Dominik

Was sind Arcs und Quarks?

Dominik

Ah, ja, ja, ja.

Jochen

Das ist auch etwas, was immer ein bisschen verwirrend ist.

Jochen

Ja, also Funktionen, Methoden haben Argumente.

Jochen

Das heißt, Dinge, die man übergeben kann.

Jochen

Ganz normale Positionsargumente sind halt sozusagen das Übliche irgendwie.

Jochen

Die haben halt eine feste Stelle und werden dadurch dann identifiziert, dass sie halt an der ersten, zweiten, dritten Stelle oder so stehen. Und dann gibt es halt noch Keyword-Argumente, wo man dann explizit dazu sagt, welches Argument man denn jetzt gemeint hat.

Jochen

Das schreibt man dann halt sowohl in die Funktionsdefinitionen rein, als auch dann, wenn man es übergibt, wobei man es beim Übergeben nicht unbedingt braucht, also da ist es dann halt so, wenn man das weglässt, dann wird halt das nächste Keyword-Argument genommen, das ist so ein bisschen, da können dann komische Sachen passieren und dann ist es auch so, dass man, wenn man jetzt eine Liste von Argumenten übergibt, dann kann man die natürlich alle einzeln übergeben,

Jochen

man kann die aber auch insgesamt übergeben.

Jochen

Mit Stähnchen dann bei Argumenten oder

Jochen

mit Stähnchen, Stähnchen bei Keyword-Argumenten.

Jochen

Also wenn man die Liste hat in der Hand,

Jochen

wenn man eine Liste hat oder Tupel, dann kann man einfach

Jochen

einen Stern davor schreiben und

Jochen

dann wird das automatisch sozusagen als

Jochen

ja

Jochen

Argumente dann übergeben.

Jochen

Als Impact dann, als Argumenten.

Jochen

Genau, man sagt dann irgendwie

Jochen

Funktion, Klammer auf,

Jochen

Stern und dann eben

Jochen

Args, Argumente

Jochen

oder wie auch immer das, die Items,

Jochen

diese Struktur heißt, die man jetzt gerade in der Hand hat,

Jochen

Klammer zu und dann kann man in der

Jochen

Funktionsdefinition drin stehen haben, so was

Jochen

def Funktion, Klammer auf,

Jochen

a, b, c und

Jochen

ja, muss dann natürlich alles irgendwie stimmen von

Jochen

der Anzahl und so, aber das passiert dann

Dominik

automatisch. Ich finde bei Keyword-Argumenten relativ

Dominik

nützlich, weil da kann man alle viele Sachen, die man irgendwie zugewiesen

Dominik

hat, irgendwie in eine Liste packen

Dominik

und dann kann man die einfach alles

Dominik

mit Sternchen, Sternchen übergeben und hat dann seine Keywords.

Dominik

Genau, das eben

Jochen

bei normalen Positionsargumenten

Jochen

ist es halt, entweder man

Jochen

übergibt sie per Position oder Stern,

Jochen

kann auch eben in der

Jochen

Funktionsdefinition sagen, das können jetzt hier

Jochen

beliebig viele sein, dann schreibt man halt nicht a, b, c

Jochen

rein, sondern Stern, args,

Jochen

Komma, und dann

Jochen

kommen dann halt beliebig viele

Jochen

Argumente rein, die dann hinterher in der Liste

Jochen

args sind, wenn man, vielleicht kennen

Jochen

Leute das noch von Perl oder so, gibt das nur so.

Jochen

Das geht in Python auch,

Jochen

ist da aber ein Spezialfall.

Jochen

Oder, genau,

Jochen

Und das Ganze geht mit Keyword-Argumenten

Jochen

ganz genau so, nur dass es dann halt nicht Stern ist, sondern

Jochen

Stern, Stern. Und damit lassen sich

Jochen

halt sehr, sehr leicht

Jochen

zum Beispiel Dicts in

Jochen

Keyword-Argumente verwandeln und Keyword-Argumente

Jochen

in Dicts, was

Jochen

halt manchmal sehr praktisch ist.

Jochen

Und an viel Schreibarbeit auch Sport.

Jochen

Cool. Jetzt haben wir noch zwei Sachen, die

Dominik

noch ein bisschen in diese Funktionen reingehen.

Dominik

Wir haben ja Funktionen, jetzt jede Menge so Sachen.

Dominik

Was ist dann Lambda-Funktion? Was macht die denn dann?

Dominik

Das haben wir, glaube ich, auch schon einmal kurz besprochen.

Dominik

Das ist eigentlich nichts Besonderes.

Dominik

Das ist eine Funktion,

Jochen

wie jede andere. Also was halt in Python

Jochen

nicht so richtig schick geht.

Jochen

Ich meine ja auch

Jochen

ein bisschen JavaScript und das ist da

Jochen

so schon ein Stückchen eleganter vielleicht.

Jochen

Oder was es

Jochen

in Python so nicht gibt, sind so anonyme Blöcke

Jochen

oder anonyme Funktionen

Jochen

über mehrere Zeilen oder sowas.

Jochen

Sondern da gibt es halt Lambda.

Jochen

Warum muss das überhaupt sein? Wofür braucht man sowas?

Jochen

es gibt oft irgendwie

Jochen

Situationen, wo man

Jochen

eine Funktion übergeben möchte

Jochen

irgendwo hin,

Jochen

aber die

Jochen

sonst nicht braucht.

Jochen

Also ein Beispiel wäre

Jochen

jetzt irgendwie, wenn man

Jochen

irgendwas mit

Jochen

NumPy

Jochen

Arrays macht oder so, oder

Jochen

DataFrames, da

Jochen

ist es ja so, dass man eigentlich keine Vorschleifen

Jochen

nicht per Vorschleife über irgendwas

Jochen

iterieren kann, weil Vorschleifen

Jochen

super langsam sind im Fallen.

Jochen

Was jetzt nicht heißen soll.

Jochen

Vorschleifen sind halt schon gut, aber wenn man jetzt

Jochen

über ein Array mit ein paar Millionen

Jochen

Einträgen iteriert, dann will man das vielleicht nicht

Jochen

als Vorschleife hinschreiben, sondern was man dann

Jochen

hinschreibt, ist halt irgendwas, dataFrame.apply

Jochen

und dann übergibt man eine Funktion,

Jochen

die dann halt

Jochen

das macht, was man jetzt eigentlich

Jochen

im Body einer Vorschleife gerne gemacht hätte,

Jochen

aber die man ja eigentlich hinschreiben kann.

Jochen

Diese Funktion hat aber sonst keinen Zweck.

Jochen

Die ist nicht, an anderer Stelle braucht man

Jochen

die nicht, weil eigentlich, was man hätte hinschreiben wollen,

Jochen

wäre eine Vorschleife gewesen und dann

Jochen

das, was man in dieser Vorschleife macht, halt machen.

Jochen

Aber das geht halt nicht. Daher

Jochen

ja,

Jochen

braucht man halt jetzt diese temporäre

Jochen

Funktion, der man jetzt auch gar nicht unbedingt einen Namen

Dominik

geben will. Man möchte halt quasi die Quadrate

Dominik

haben von einer Spalte oder sowas. Irgendwie sowas.

Jochen

Oder rechnet halt irgendwas aus auf jedem Element

Jochen

oder so. Und dann, genau.

Jochen

Lambda

Jochen

gibt halt sozusagen,

Jochen

also Lambda x Doppelpunkt

Jochen

x zum Quadrat

Jochen

oder sowas, würde halt

Jochen

ein Argument nehmen und dieses

Jochen

Argument mit sich selbst multiplizieren und dann wieder

Jochen

zurückgeben. Nur dass man halt

Jochen

das Return weglassen

Jochen

muss. Also Return kann man nicht hinschreiben

Jochen

in der Lambda, sondern es ist halt

Jochen

das, was halt man, das Letzte,

Jochen

was irgendwie...

Jochen

Implizit wird das halt einfach

Jochen

zurückgegeben. Und

Jochen

ja, auch die

Jochen

Argumentübergabe ist ein bisschen anders.

Jochen

Es ist halt nicht irgendwie Klammer auf und dann irgendwas,

Jochen

sondern es ist halt einfach Leerzeichen

Jochen

und dann Liste der Argumente,

Jochen

Doppelpunkt und das wird halt

Jochen

implizit passiert. Und es kann alles

Jochen

nur in einer Zeile stehen. Es darf nicht

Jochen

mehrere Zeilen.

Dominik

Es ist aber so ein bisschen hässlich.

Dominik

Auf der anderen Seite ist es so, wenn das komplizierter

Jochen

wird, man muss das ja nicht so machen. Man kann auch

Jochen

tatsächlich eine Funktion hinschreiben, die man einfach

Jochen

irgendwie nennt.

Jochen

Kann man ja auch sagen, irgendwie

Jochen

rechne mir irgendwie das Quadrat aus

Jochen

oder so Funktion.

Jochen

Und dann kann man ja auch mehrere

Jochen

Zeilen schreiben, die schreibt man dann da rein und dann

Jochen

übergibt man das Ding halt. Der Lambda-Funktion?

Jochen

Nicht der Lambda-Funktion, sondern

Jochen

übergibt das statt der Lambda-Funktion, weil das ist genau

Jochen

das Gleiche. Das, was man

Jochen

zurückbekommt von diesem Lambda, ist auch nichts. Das heißt, Lambda braucht man

Dominik

eigentlich überhaupt nicht.

Dominik

Man braucht es nicht. Es ist halt manchmal

Jochen

auch nett, das so hinschreiben

Jochen

zu können, aber wirklich brauchen tut man es nicht.

Dominik

Spart ein bisschen Schreibarbeit

Dominik

für zum Beispiel so einfache Operationen wie einfach Quadrat zu geben,

Dominik

dann kann man einfach das Lambda in die Zeile schreiben,

Dominik

wenn man es nicht wieder sonst braucht.

Jochen

Genau, weil du hast halt, wenn du Funktionen

Jochen

hinschreibst in Python, immer einen gewissen

Jochen

Zeilen-Overhead, weil, naja,

Jochen

da die

Jochen

Umbrüche syntaktisch relevant

Jochen

sind und die Eindrückung, ist es halt so, dass

Jochen

du da auf jeden Fall immer mehrere, mindestens mal

Jochen

zwei Zeilen für hinschreiben musst.

Jochen

Ja, und mit Lambda kannst du es auch in

Jochen

einer Zeile hinschreiben. Und wenn das wirklich eine ganz simple

Jochen

Geschichte ist, dann willst du vielleicht keine,

Jochen

nicht deswegen eine Funktion definieren, sondern

Jochen

ja, aber

Jochen

letztlich kann man dafür auch ganz normale Funktionen

Jochen

verwenden und

Jochen

was ja an Python auch geht, was auch schön ist,

Jochen

du kannst halt innerhalb von Funktionen auch wieder

Jochen

Funktionen definieren. Also du musst ja nicht

Jochen

die Funktionen dann außerhalb der Funktionen. Das heißt, du kannst die Funktion

Jochen

auch direkt da an die Stelle schreiben, wo

Jochen

du sie verwenden willst. Wann macht man das denn

Dominik

alle, dass man so schachtelte Funktionen macht?

Jochen

Ja, eben. Zum Beispiel, wenn du halt eine Funktion sonst

Jochen

nirgendwo verwenden möchtest und möchtest

Jochen

halt, aber du brauchst eine Funktion.

Jochen

Da sind wir wieder bei, zum Beispiel bei

Jochen

Clojures, brauchst du das halt,

Jochen

wo du eine Funktion zurückgibst, die halt

Jochen

Zugriff auf den Scope

Jochen

auf Variablen hat, die im Scope

Jochen

dieser Funktion liegen.

Jochen

Also wenn du,

Jochen

also Clojure ist quasi,

Jochen

du hast eine Funktion und in dieser

Jochen

Funktion gibst du

Jochen

jetzt eine andere Funktion zurück.

Jochen

Eine innere

Jochen

Funktion sozusagen. Und du möchtest, dass

Jochen

diese Funktion Zugriff hat

Jochen

auf eine Variable, die zum Beispiel

Jochen

innerhalb der äußeren Funktion definiert ist.

Jochen

Zum Beispiel ein Counter, der mit

Jochen

irgendwas initialisiert wird. Also genau, das Beispiel

Jochen

können wir mal nehmen, sagen wir mal

Jochen

def

Jochen

zähle

Jochen

ab, Klammer auf

Jochen

x, Klammer zu, Doppelpunkt

Jochen

counter gleich

Jochen

x und dann def inner

Jochen

Klammer auf

Jochen

y

Jochen

Klammer zu, Doppelpunkt

Jochen

und dann return

Jochen

Range

Jochen

Counter,

Jochen

Counter,

Jochen

Y oder so.

Jochen

Es geht darum, wenn du sagen möchtest,

Jochen

ab wann etwas zählen soll, dann möchtest

Jochen

du diesen Counter ja

Jochen

diesen State wieder halten

Jochen

irgendwo und du möchtest ihn irgendwo halten, wo

Jochen

jetzt die innere Funktion, die du zurückgibst, die jetzt dann

Jochen

irgendwie zum Beispiel irgendwas iteriert oder so,

Jochen

darauf zugreifen kann. Aber

Jochen

du willst es sonst nicht

Jochen

manipulierbar haben. Das ist auch eine, damit kannst

Jochen

du tatsächlich dann auch

Jochen

Werte so weg verstecken, dass man

Jochen

da nicht mehr rankommt. Jedenfalls nicht.

Jochen

Also man kommt schon, aber dann wird's schwierig.

Jochen

Nicht mehr so einfach.

Jochen

Und

Jochen

ja, dafür braucht man zum Beispiel so

Jochen

innere Funktionen. Ohne die ginge das gar nicht richtig.

Jochen

Also, und das nennt man

Jochen

das ist eine Clojure.

Jochen

Also, dass sozusagen die innere Funktion

Jochen

hat Zugriff auf den Counter, den ich irgendwann mal

Jochen

übergeben hab. Aber

Jochen

weil die innere Funktion

Jochen

ja im gleichen Scope ist wie das Ding,

Jochen

wie das, was ich ursprünglich mal gesetzt habe.

Jochen

Ansonsten komme ich da von außen aber nicht mehr ran.

Jochen

Wenn ich jetzt nur die zurückgegebenen Funktionen habe,

Jochen

dann komme ich an den Counter-Wert nicht mehr ran.

Jochen

Und dann kann ich halt die äußere Funktion verwenden,

Jochen

um zu sagen, gib mir einen Counter, der ab 5 zählt immer zurück.

Jochen

Oder gib mir einen Counter, der ab 10 zählt immer.

Jochen

Und das 10 oder 5 steht dann halt eben in dieser,

Jochen

ja, ist ein etwas komplizierteres Konzept, muss man,

Jochen

aber das ist halt auch die Art, wie dann irgendwie Dekoratoren

Jochen

und

Jochen

Context Manager und so

Jochen

funktionieren. Die machen da

Jochen

Dinge in der Richtung.

Jochen

Ja.

Jochen

Genau. Aber das

Jochen

finde ich auch sehr schön, dass man

Jochen

halt in Funktionen auch locker

Jochen

Funktionen definieren kann. Man kann auch Klassen innerhalb von

Jochen

Klassen definieren und so. Also das

Jochen

geht einfach problemlos.

Jochen

Klingt nach viel Konfusion

Dominik

für die Anfänger, die jetzt gerade da sind.

Jochen

Ja, ja, ja. Vielleicht sollte man

Jochen

Genau, auch wieder, nee, vielleicht sollte man das

Jochen

mal doch nicht haben.

Jochen

Ja, ich habe jetzt noch eine

Dominik

Basisfrage, was ist der Unterschied von einer

Dominik

Zugweisung von gleich-gleich oder

Dominik

ist, also nicht zugreifen, sondern

Dominik

eine Abfrage, was vergleicht man

Dominik

ein gleich-gleich oder ein ist? Also zum Beispiel

Dominik

A gleich-gleich, B A ist B, etwas ist

Dominik

gleich-gleich, non, ist non.

Dominik

Ja,

Dominik

also

Dominik

wenn

Jochen

ich gleich-gleich verwendere,

Jochen

also gleich ist natürlich irgendwie

Jochen

Zuweisungen, aber gleich, gleich,

Jochen

da wird halt der Wert verglichen.

Jochen

Also

Jochen

und bei is wird

Jochen

verglichen, ob es das gleiche Objekt

Jochen

ist. Und deswegen

Dominik

bei none sagt man immer is none, weil

Dominik

es nur ein none-Objekt gibt. Genau, none

Dominik

ist ein Singleton.

Jochen

Und deswegen kann ich halt so testen,

Jochen

ob es wirklich none ist.

Jochen

True und false sind auch Singleton.

Jochen

ja

Jochen

bin ich mir jetzt nicht so ganz sicher, aber

Jochen

ich glaube schon

Jochen

ich weiß aber nicht

Jochen

ja, so müsste wahrscheinlich so sein, das könnte eigentlich

Jochen

gar nicht anders

Jochen

okay, das heißt, er müsste halt tatsächlich, wenn er ist,

Jochen

genau das Objekt

Jochen

ich weiß nicht, man kann das

Jochen

aber man kann das auch zuweisen, also es ist auch ganz böse

Jochen

man kann True und False auch noch anders

Jochen

belegen, also

Jochen

müsste man mal nachgucken, ich weiß nicht genau

Dominik

was irgendwie spannend ist, weil jetzt, wir haben ja so ein paar

Dominik

mal über so Sachen geredet, was jetzt irgendwie Klassen sind

Dominik

und Objekte und Typen, dass alle Sachen in Python

Dominik

irgendwelche Objekte sind, irgendwelche Typen sind.

Dominik

Und dann habe ich mich irgendwie gefragt, ob

Dominik

jetzt nicht die ganzen Zuweisungen, also man kann

Dominik

jetzt irgendwie Typen umwandeln, ja, also von Integer

Dominik

auf String oder sowas, ob das nicht halt auch

Dominik

eine Klasse

Dominik

dann eigentlich ist, die man dann halt nimmt, weil das halt

Dominik

ein Typ ist, ein Objekt ist, deswegen müsste das eigentlich

Dominik

großgeschrieben werden, weil man halt eine Instanz

Dominik

eines Objektes ändert und eine Instanz eines Objektes erzeugt.

Dominik

Zum Beispiel von einer Instanz eines Objektes

Dominik

String, eine Instanz, also wenn man das Integer wechselt,

Dominik

wenn man ein Inter vorstellt, es muss ein bisschen großes Int sein,

Dominik

dann an der Stelle irgendwie

Dominik

war ich dann ein bisschen verwirrt.

Jochen

Ja, also ich rate jetzt mal,

Jochen

woher das kommt. Ich weiß es ehrlich gesagt auch nicht so genau.

Jochen

Vielleicht weiß das jemand besser und kann mich da korrigieren,

Jochen

aber ich denke mal, es liegt daran,

Jochen

dass das Build-Ins sind.

Jochen

Also ja, eigentlich die Konvention in Python

Jochen

ist so, wenn es eine Klasse ist, dann schreibt man das halt

Jochen

groß, aber

Jochen

ich glaube,

Jochen

alle Build-Ins sind klein.

Jochen

Und da das Build-Ins sind, sagt man eher, das ist wichtiger, weil es gibt nicht so viele Build-Ins.

Jochen

Aber richtig wäre es tatsächlich, dass man, zum Verständnis vielleicht, dass man irgendwie, wenn man einen Typ ändert, einer Variable beispielsweise, dass man einen neuen Instanz, eine neue oder eine andere Klasse erzeugt.

Jochen

Ja, ja, das ist so, aber das passiert auch tatsächlich.

Jochen

Also wenn ich sage int, Klammer auf, 5, Klammer zu,

Jochen

dann wird ein neues Integer-Objekt erzeugt, genau, mit dem Wort 5.

Jochen

Also es ist tatsächlich, ja, auch Dict ist ja eine Klasse tatsächlich.

Jochen

Ich kann ja auch davon erben und so, sollte ich vielleicht nicht machen,

Jochen

aber ich kann davon erben und das funktioniert auch.

Jochen

Aber ja, ich denke, das hängt damit zusammen,

Jochen

dass die Build-Insights so Spezialfälle sind.

Jochen

Wenn ich die Klassen verwenden möchte,

Jochen

für die ganzen Dinger gibt es auch noch richtige Klassen.

Jochen

Zum Beispiel für Dikt und List und so

Jochen

gibt es UserDikt und UserList.

Jochen

Und auch wenn ich jetzt irgendwie selber ein eigenes Dikt,

Jochen

das Dinge ein bisschen anders macht als ein normales Dikt,

Jochen

verwenden möchte,

Jochen

dann sollte ich halt irgendwie von UserDikt erben

Jochen

und nicht von einfach nur kleingeschriebenem Dikt.

Jochen

Dass die das nie, weil sich schon Leute

Dominik

darum gekümmert haben, bestimmte Probleme zu umgehen, auf die man

Dominik

dann stößt, wenn man das nicht macht.

Dominik

Ja, genau.

Dominik

Ja, jetzt haben wir

Dominik

noch jede Menge, ich weiß gar nicht, ob wir das heute

Dominik

in der Folge alles irgendwie unterkriegen.

Dominik

Noch einer hat gefragt, was denn eine Shallow Copy ist.

Dominik

Achso.

Dominik

Wie arbeitet man richtig mit Listen im Zusammenhang

Dominik

mit Funktionen? Gibt man eine Kopie und

Dominik

retürnt eine neue Liste oder gibt man eine Liste und

Dominik

ändert die quasi in Plays?

Dominik

Was hat das damit zu tun?

Dominik

Also irgendwie.

Jochen

Ja, das ist auch eine unter Umständen Stilfrage, was man da machen möchte.

Jochen

Also einmal, vielleicht zuerst das mit der Shallow-Kopie.

Jochen

Also die Frage ist, was passiert eigentlich, wenn ich jetzt sozusagen eine Kopie von irgendwas machen möchte,

Jochen

und weil ich warum auch immer irgendwie eine zweite Version von irgendeiner Datenstruktur brauche oder so,

Jochen

Da ist es, wenn ich jetzt die einfach nur kopiere,

Jochen

also in Python habe ich eigentlich immer Referenzen

Jochen

auf solche Datenstrukturen in der Hand.

Jochen

Also auch die Übergabe von Sachen ist immer bei Referenz.

Jochen

Also es gibt ja ein C, es ist unter Umständen anders.

Jochen

Da kann ich Argumente übergeben als Referenz

Jochen

oder halt als Wert, also direkt den Wert einfach so.

Jochen

Und in Python ist es immer per Referenz.

Jochen

Also in der Variable, die ich übergebe, steht immer sozusagen einfach eine Speicheradresse drin, die halt auf das Objekt zeigt, das ich übergebe.

Jochen

Und ich übergebe immer nur die Adresse, ich übergebe nicht der Funktion das Objekt selbst.

Jochen

Und jetzt ist es halt so, wenn ich einfach nur, bestimmte Operationen duplizieren mir halt jetzt diese Adresse, aber nicht den Inhalt dahinter.

Jochen

Das heißt, wenn ich jetzt, ich mache eine Kopie davon, ich muss mal überlegen, in welchen Umständen ich das hinkriege.

Jochen

Wenn ich jetzt einfach nur kopiere, dann kann es sein, dass mir nur die Referenz kopiert wird. Das heißt, mir wird halt die Speicheradresse in eine andere Variable kopiert, aber wenn ich jetzt irgendwas am Inhalt einer Liste oder so ändere, dann ist das in beiden Listen geändert.

Jochen

Und das ist unter Umständen nicht so intuitiv. Vielleicht hätte man jetzt nicht so mit gerechnet, sondern man hätte damit gerechnet, dass ich jetzt zwei Listen habe, die im Hauptspeicher an zwei unterschiedlichen Stellen liegen.

Jochen

Und eine Shallow-Kopie ist halt eine, die nur sozusagen, also bei einer Liste könnte ich mir jetzt sogar vorstellen, dass es oft, wenn ich jetzt nochmal eine Liste drumherum schreibe oder so, dass dann tatsächlich eine Kopie erzeugt wird, also eine Nicht-Shallow-Kopie, aber wenn ich jetzt eine komplizierte Datenstruktur habe in irgendeinem Dikt oder so, wo viele Sachen ineinander verschachtelt drin liegen, dann ist es so, wenn ich jetzt sage Dikt von dem Ding, dann ist es eine, oder wenn ich sage Kopie, dann ist das eine Shallow-Kopie.

Jochen

Warum brauche ich dann überhaupt

Dominik

eine Schellokopie? Dann könnte ich auch einfach auf das normale Dikt zeigen,

Dominik

wenn es eh nur auf das gleiche Objekt zeigt.

Dominik

Das ist eigentlich nur eine andere Benennung.

Jochen

Wenn ich die Inhalte mit kopieren will,

Jochen

dann gibt es

Jochen

zum Beispiel

Jochen

eine Funktion aus dem Copy,

Jochen

ich glaube, das ist Standardbibliothek,

Jochen

dann sagt man immer FormCopy, ImportDeepCopy

Jochen

und dann sagt man DeepCopy, irgendwie

Jochen

komplizierte, dick verschachtelte Datenstruktur

Jochen

und die geht dann rekursiv

Jochen

da durch und kopiert den ganzen Kram da raus

Jochen

in eine andere Datenstruktur. Und dann habe ich halt

Jochen

das tatsächlich getrennt voneinander. Aber

Jochen

ansonsten ist das halt nicht so einfach.

Jochen

Wenn ich da

Jochen

Dict drumherum mache, dann kann es

Jochen

zwar auch sein, dass es ein neues Dict ist an einer anderen

Jochen

Speicheradresse und dass ich

Jochen

die Keys und Values kopiert habe, aber

Jochen

die Values waren halt Referenzen auf irgendwas

Jochen

und die Objekte hinter diesen Referenzen haben sich

Jochen

halt nicht geändert. Und das kann halt sehr...

Jochen

Da kann man sich so ein bisschen mit am Fuß schießen, wenn man so was

Dominik

übergibt wie leere Listen als Standardwert vom

Jochen

Keyword. Ja, da kann man sich

Dominik

böse in den Fuß schießen mit. Weil dann, also das ist glaube ich

Dominik

generell das Problem, also bei so

Dominik

ein paar Sachen, die man als Keyword setzt, ja, wenn man

Dominik

irgendwie eine Funktion hat, da wird ein Keyword

Dominik

übergeben, das setzt man einem Default-Wert,

Dominik

indem es zum Beispiel eine leere Liste hat oder einen

Dominik

random initialisierten Wert oder sowas,

Dominik

der wird halt beim ersten Mal dann

Dominik

initialisiert und da steht dann halt aber in der Speicheradresse

Dominik

dieser Wert drin, der dann halt dem zugewiesen ist schon,

Dominik

weil das halt dann nur darauf zeigt und halt nicht

Dominik

jedes Mal ein neues Objekt generiert und das

Dominik

heißt, man hat immer dieselbe leere Liste,

Dominik

die dann vielleicht nicht mehr leer ist, nachdem man die Funktion

Dominik

einmal aufgerufen hat und dann...

Jochen

Und dann ist es immer die gleiche und dann funktioniert es sogar oft

Jochen

und dann irgendwann fällt es einem ganz

Jochen

furchtbar auf den Fuß und man weiß nicht genau,

Jochen

an solchen Problemen habe ich auch schon lange

Jochen

rumgedebugt, bis ich mir dann so, oh nein,

Jochen

das ist immer die gleiche Liste, oh scheiße.

Jochen

Und da ist auch da

Jochen

eine Konvention, dass man das eben eigentlich,

Jochen

dass man nicht als Default-Argument

Jochen

in eine Funktion reinschreibt,

Jochen

irgendwie

Jochen

Default gleich

Jochen

Klammer auf, Klammer zu oder so.

Dominik

Man sagt immer None und dann macht man eine Überprüfung,

Jochen

Und dann ersetzt man die Liste neu.

Jochen

Das ist halt echt nur eine böse Fußange.

Jochen

Das kann einen schwer erwischen.

Dominik

Ja, bei Random-Werten übrigens genau dasselbe.

Dominik

Also wenn ihr jetzt irgendwo so ein Zufallswert generieren lassen wollt,

Dominik

wie von Random-Rant 1 bis 10 oder sowas,

Dominik

und dann habt ihr ihn einmal initialisiert,

Dominik

der gibt nicht jedes Mal, wenn ihr die Funktion aufruft,

Dominik

einen default neuen Zufallswert zurück,

Dominik

sondern immer dasselbe.

Dominik

Also das ist an der Stelle nicht intuitiv.

Dominik

Also fand ich auch sehr komisch,

Dominik

dass er dann nicht einfach jedes Mal beim Aufrufen das neu initialisiert,

Dominik

sondern dass er halt dann die Objekte nimmt,

Dominik

die er einmal schon irgendwo liegen hat.

Jochen

Ja, also eine Geschichte, also List Comprehension macht immer eine Kopie, wenn man zum Beispiel eine neue Liste erzeugt, ansonsten die Kopie aus dem Kopiemodul, wenn es kompliziertere Datenstrukturen sind, dann muss man sich das nicht selber, ich meine, es ist ja wirklich kompliziert, man muss halt rekursiv durchgehen und das will man ja vielleicht auch nicht selber schreiben und da gibt es halt schon ein Ding für, was man da benutzen kann.

Jochen

Dann ist es so, naja, was diese unterschiedlichen Stile angeht, also wenn man sich so ein bisschen anguckt, es gibt ja unterschiedliche Arten zu programmieren, so Imperativ, ich würde auch Python eher, auch wenn man es auch mit Berechtigung sagen kann, ist es auch irgendwie eine funktionale Programmiersprache, ist es doch eher, die meisten Leute verwenden es halt irgendwie Imperativ.

Jochen

Und in dem Lager sozusagen Paradigma der funktionalen Programmiersprachen ist es aber eher so, dass man halt da und nicht nur da, das setzt sich auch in anderen Bereichen durch. In JavaScript sehen wir das in letzter Zeit oft, auch wenn es um so State-Handling-Geschichten geht.

Jochen

Da gibt es dann Redux und so, dass man, wenn man jetzt solche Sachen handelt, versucht immer nur mit Datenstrukturen zu arbeiten, die nicht veränderbar sind, also die mutable sind und immer nur Kopien erzeugt, wenn man irgendwas ändert.

Jochen

Also man ändert nichts in einer bestimmten Datenstruktur, sondern man erzeugt eine neue Kopie und an der ändert man dann halt irgendwas, beziehungsweise man ändert nichts, sondern man baut es dann halt neu.

Jochen

Was halt diverse, sehr, sehr

Jochen

coole Nebeneffekte hat. Unter anderem,

Jochen

dass ich Sachen dann perfekt parallelisieren kann,

Jochen

dass ich

Jochen

weiß, dass ich keine Seiteneffekte habe,

Jochen

dass ich super testen kann.

Jochen

Es hat eine Menge

Jochen

und immer wenn Leute, die aus so einer

Jochen

funktionalen Ecke kommen, sehen, was man so

Jochen

in Python imperativ macht, dass man irgendwie

Jochen

Attribute von irgendwelchen Objekten ändert oder halt

Jochen

irgendwie ein Dicte übergeben bekommt,

Jochen

das dann irgendwie ein Ende hat

Jochen

und dann

Jochen

würde man jetzt in funktionaler

Jochen

richtigen

Jochen

Funktionalen Programmiersprache

Jochen

würde man nie irgendwie

Jochen

einen Dikt oder eine Liste oder sowas in der

Jochen

Funktion nehmen, da irgendwas dran ändern und

Jochen

das Ding dann wieder zurückgeben oder so, oder am besten

Jochen

gar nicht zurückgeben, sondern einfach nur ändern.

Jochen

Sondern man würde immer, wenn man was

Jochen

ändert, eine neue Kopie zurückgeben.

Jochen

Weil man dann halt diesen ganzen schönen

Jochen

Effekt hat, was, wenn man das nicht

Jochen

tut, was, würde ich sagen, aber

Jochen

in Python oft so ist,

Jochen

also man übergibt irgendwo

Jochen

eine Liste und dann ändert man irgendwie ein Element

Jochen

in dieser Liste und dann gibt man die Liste wieder zurück,

Jochen

dann gehen ganz viele

Jochen

schöne Sachen nicht mehr, weil dann ist es halt

Jochen

ja.

Jochen

Man hat vielleicht irgendwas kaputt gemacht.

Jochen

Ja.

Jochen

Was auf der anderen Seite manchmal halt auch total

Jochen

viel einfacher macht, als wenn man

Jochen

es funktional schreibt und auch

Jochen

effizienter, weil einmal ist es so,

Jochen

man kann halt Dinge nicht mehr so richtig direkt beeinflussen

Jochen

und es ist halt so,

Jochen

wenn man alles immer kopiert und jetzt

Jochen

man aber jetzt große Datenmengen hat,

Jochen

zum Beispiel im Data-Science-Bereich ist es halt, wenn

Jochen

deine Datenstrukturen alle hunderte Megabyte groß sind

Jochen

und du machst immer Kopien von allem,

Jochen

was auch, also tatsächlich, Pandas

Jochen

macht das auch per Default, wenn

Jochen

alle Operationen gehen, immer Kopien zurück.

Jochen

Aber das kann auch ganz schön

Jochen

in den Hauptspeicher gehen. Manchmal muss man dann schon

Jochen

sagen, so, ja, hier bitte nicht kopieren, das geht einfach

Jochen

nicht, passt dann nicht mehr. Und dann

Jochen

muss man halt

Jochen

Sachen direkt

Jochen

in place ändern oder so und das ist natürlich

Jochen

immer ein bisschen schmutzig, aber ja.

Jochen

Weekend 30, ja, ja.

Jochen

Dunkle Magie, wieder.

Jochen

Ja, also hängt davon ab, würde ich sagen,

Jochen

was man für ein Problem hat und

Jochen

also wenn man das nicht kennt, dann sich mal so

Jochen

anzugucken, wie man mit alten Datenstrukturen

Jochen

einfach nur Immutable irgendwie hält

Jochen

und immer kopieren soll, das ist eigentlich schon

Jochen

sehr schick, aber...

Dominik

Dann schließ direkt an, was ist denn deine Lieblingsdatenstruktur?

Dominik

Meine Lieblingsdatenstruktur?

Dominik

Also ich tatsächlich, ja,

Dominik

Dict.

Dominik

Hätte ich jetzt auch gesagt, früher fand ich Listen ganz toll Dict,

Dominik

aber ich auch.

Dominik

Vielleicht ein bisschen, wo man gerade ist, ja.

Jochen

Und vor allen Dingen ist die Dict-Inflamentation

Jochen

in Python ist halt auch total super.

Jochen

Also die ist richtig schnell.

Jochen

Die ist halt

Jochen

ein sehr effizientes Ding und

Jochen

ein Riesenhaufen Probleme lassen sich dadurch schon lösen.

Jochen

Also wenn man das ordentlich verwendet,

Jochen

dann kriegt man da so einen sehr

Jochen

großen Teil der so 0815

Jochen

Programmiergeschichten, die man so macht, kriegt man halt mit

Jochen

Listen und Dicts irgendwie abgebildet.

Jochen

Listen braucht man auch,

Jochen

halt gerade, wenn man irgendwelche Dinge

Jochen

iteriert und so, aber Dicts ist

Jochen

halt das Schöne daran ist, dass man halt irgendwie

Jochen

sozusagen beliebige Dinge irgendwie speichern

Jochen

kann und man kann die

Jochen

Namen,

Jochen

unter denen man das findet, dann halt irgendwie dynamisch

Jochen

generieren und muss das halt nicht vorher definiert

Jochen

haben in Code.

Jochen

Und

Dominik

wann nutzt man denn Tuple, das Datentruktur, wenn man eine Liste

Dominik

hat? Also warum ist das überhaupt? Ja, Tuple

Jochen

sind halt

Jochen

immutable, ja genau. Das ist

Jochen

halt der Grund, deswegen

Jochen

an den Stellen, wo man es halt immutable

Jochen

haben will, dann kann man die halt gut nehmen.

Jochen

unter anderem zum Beispiel, wenn du halt

Jochen

möchtest, dass etwas key in einem Dikt

Jochen

sein kann. Das geht halt mit einer Liste nicht.

Jochen

Da musst du halt einen Tuppel nehmen.

Jochen

Oder halt bei so Geschichten

Jochen

wie Tuppel, Unpacking und so,

Jochen

das geht auch nur mit...

Jochen

Unpacking geht auch mit Listen, ja.

Jochen

Klar, das geht auch mit Listen, aber ich weiß, ich überlege jetzt gerade,

Jochen

ob es einen tieferen Grund gibt, warum

Jochen

Argumente ein Tuppel sind.

Jochen

Also, ja.

Jochen

generell. Also Dickey war vielleicht

Jochen

eine gute Idee, ja.

Jochen

Es gibt schon den

Jochen

Fall öfter mal, dass man das halt nicht

Jochen

änderbar haben will und dann nimmt man halt ein Doppel

Jochen

statt eine Liste. Aber tatsächlich

Jochen

ist es so, es gibt auch

Jochen

Skalare, sozusagen einfache Werte

Jochen

irgendwie, also sowas wie eine 5 oder

Jochen

String, wobei

Jochen

Listen und Dics ist halt auch so das, was man

Jochen

in allen Programmiersprachen irgendwie oder

Jochen

vor allen Dingen in allen Skriptsprachen irgendwie eingebaut

Jochen

findet, ja, das hast du halt auch in Perl und in PHP

Jochen

und in JavaScript, die

Jochen

heißen halt in allen diesen

Jochen

Programmiersprachen irgendwie ein bisschen anders, ne, in Perl

Jochen

heißt es halt Hash und

Jochen

Array, ja, in PHP heißt es

Jochen

Assoziatives

Jochen

Array

Jochen

und in, weiß ich nicht,

Jochen

JavaScript heißt es halt Object

Jochen

und

Jochen

ich glaube, da heißt es aber dann auch Array, ja.

Jochen

Naja, aber

Jochen

diese Grunddatentypen hast du halt

Jochen

überall, deswegen war das halt,

Jochen

Damit kannst du halt schon eine Menge machen.

Jochen

Und Tupple gibt es halt eigentlich, glaube ich, nur in Python

Jochen

und anderswo nicht, weil es auch

Jochen

sonst nicht so häufig verwendet wird.

Jochen

Ist halt schon eher so ein bisschen

Jochen

Spezialfall.

Jochen

Ja, es gibt auch

Jochen

oft von den ganzen

Jochen

also was auch mittlerweile, glaube ich,

Jochen

ein integrierter Datentyp ist, ist halt

Jochen

Set in Python.

Jochen

Das ist auch eine Datenstruktur, die wir

Jochen

relativ häufig, oder ich benutze sie relativ häufig

Jochen

und von denen gibt es halt dann auch

Jochen

Immutable-Varianten. Ich weiß jetzt gar nicht, ob es

Jochen

Immutable-Tickets gibt,

Jochen

aber zum Beispiel von Sets gibt es halt Frozen-Set,

Jochen

eben auch für solche Fälle, wie du möchtest,

Jochen

dass es irgendwie als Key in ein Ticket ist

Jochen

oder so. Und

Jochen

den kannst du halt dann nicht mehr verändern.

Jochen

Vielleicht gibt es auch sowas wie eine Frozen-List,

Jochen

ich weiß nicht genau.

Jochen

Aber Frozen-Set benutze ich tatsächlich

Jochen

ab und zu. Frozen-List ist Tupel?

Jochen

Ja, könnte sein, genau. Frozen-List ist Tupel, ja, genau.

Jochen

Ja, ja.

Dominik

Okay.

Dominik

Wann nutzt man denn Manant Nampai Erase?

Dominik

Ja, immer dann, wenn man halt

Jochen

sozusagen

Jochen

so viele Daten hat, dass es

Jochen

irgendwie nervtötend wird ansonsten.

Jochen

Und

Jochen

wenn man jetzt die ganzen Spezialfunktionen vielleicht

Jochen

verwenden will, die halt auch in NumPy und so mit

Jochen

drin sind.

Jochen

Ja, und genau, dann gehen

Jochen

halt die Sachen, die sonst lange dauern, halt

Jochen

einfach schnell und

Jochen

muss halt ein bisschen anders programmieren.

Jochen

Es ist halt dann alles drauf ausgelegt, dass das

Jochen

vektorisiert wird und

Jochen

das heißt, Vorschleifen und sowas gehen eigentlich

Jochen

nicht mehr. Und was natürlich ein bisschen sehr anders

Jochen

ist als das, was man normalerweise macht.

Jochen

Aber, ja.

Dominik

Okay, dafür braucht man dann bei NumPy Arrays

Dominik

muss man dann mit Lambda's arbeiten oder

Jochen

Ja, oder halt die Funktionen verwenden, die es

Jochen

schon gibt. Das meiste gibt es ja, sozusagen

Jochen

würde ich mal sagen. Und dann ansonsten, wenn es das halt nicht gibt,

Jochen

dann genau, übergibt man halt eine Funktion.

Jochen

Okay.

Dominik

Wie sehr realisierst du denn dann Daten für

Dominik

Übertragungen?

Dominik

Ja.

Dominik

Kommt drauf an.

Dominik

Also erstmal, was das überhaupt zu realisieren ist,

Dominik

ist halt in eine Zeichenkette umwandeln,

Dominik

dass man das irgendwo hinschicken kann und dass

Dominik

wenn man dann weiß, was dahinter steckt, dann man daraus wieder Objekte

Dominik

baut, mit denen man Dinge tut.

Jochen

Ja, oder genau, ich würde sagen, man hat

Jochen

eine Datenstruktur und man möchte sie halt in irgendeine

Jochen

Form so verwandeln,

Jochen

dass man sie halt irgendwie über Netzwerke schicken kann

Jochen

oder irgendwo hinspeichern kann und man

Jochen

lädt sie hinterher irgendwo wieder.

Jochen

Oder kann auf Papier, dann kann man sie abschreiben.

Jochen

Und hat die gleiche Datenstruktur

Jochen

wieder irgendwie.

Jochen

Und das kann man natürlich, je nachdem

Jochen

wie kompliziert das ist, was man halt da

Jochen

ein- und

Jochen

auspacken möchte, beliebig kompliziert gestalten.

Jochen

Also das, was heutzutage ganz

Jochen

oft verwendet wird und insofern ist es auch

Jochen

keine so schlechte Wahl. JSON wird

Jochen

halt oft benutzt.

Jochen

Du kannst halt einfach

Jochen

nach JSON verwandeln.

Jochen

Alles, was irgendwie so Richtung Dikt ist oder verschachtelt

Jochen

Dikts. Also meistens

Jochen

hast du irgendwie Listen und Dikts

Jochen

irgendwie ineinander verschachtelt sozusagen als Datensstruktur.

Jochen

Das kannst du halt hervorragend irgendwie als JSON

Jochen

einfach realisieren. Also auch mit Frequenzmentation

Dominik

kein Problem, auch mit Tucheln kein Problem.

Dominik

Daten, also

Dominik

Datums. Genau, das ist

Jochen

Datumsformate. Das ist halt

Jochen

halt blöd. Genau, solche Sachen gehen dann schon nicht mehr

Jochen

so gut. Also wenn du jetzt

Jochen

ein Datum hast, dass du irgendwie oder

Jochen

einen Zeitpunkt, wenn du den

Jochen

irgendwie in JSON

Jochen

speichern willst, dann ist es halt blöd.

Dominik

Also der Flur von Datum ist Daten. Das ist aber gerade

Dominik

ein bisschen verwirrend, wenn wir über Daten schon so reden.

Dominik

Aber ja. Ja, genau.

Dominik

Das ist ein bisschen kacke.

Dominik

Und dann gibt es natürlich dann

Jochen

diverse ISO-Standards, wie man das dann doch

Jochen

irgendwie mit Zeitzone und keine Ahnung

Jochen

und dann bist du aber darauf angewiesen, dass alle irgendwie

Jochen

die gleiche Idee davon haben, was denn jetzt in diesem

Jochen

String, der da in dem JSON

Jochen

steht, was das

Jochen

jetzt gemeint ist. Und das ist manchmal ein bisschen

Jochen

nervtötend.

Jochen

Aber

Jochen

solange man nicht, also Datum ist immer etwas, was

Jochen

meistens dann Probleme macht, aber einfach

Jochen

so Listen,

Jochen

Dicts, Strings,

Jochen

das funktioniert ganz gut.

Jochen

Und ja, also für diese

Jochen

einfachen Fälle ist JSON

Jochen

ganz gut geeignet.

Jochen

Da da auch mittlerweile so viel verwendet wird, ist da auch viel Arbeit

Jochen

reingeflossen, die Parser und

Jochen

Rausschreibdinger

Jochen

halt schnell zu machen und das geht eigentlich

Jochen

alles ziemlich gut.

Jochen

Es ist halt auch halbwegs sparsam,

Jochen

was halt sozusagen den Platz angeht.

Jochen

Wenn du jetzt eben sowas wie XML nimmst,

Jochen

XML ist halt da, kannst du mehr mitmachen,

Jochen

aber es ist halt komplizierter,

Jochen

viele Dinge sind da schon gedacht worden,

Jochen

aber das ist halt einfach,

Jochen

es wird oft riesig.

Jochen

Was heißt mehr kann man damit machen?

Jochen

Warum? Ja, da kannst du halt,

Jochen

du kannst da ja ein Format dann definieren,

Jochen

Du kannst ja halt irgendwie auch

Jochen

definieren, wie die Daten aussehen.

Jochen

Du kannst beschreiben, wie das, was du

Jochen

reinschreibst, wann das

Jochen

okay ist. Du kannst halt eine DTD

Jochen

Data, wie heißt das?

Jochen

Data Type Definition zu deinem

Jochen

XML dazuschreiben, das halt sozusagen

Jochen

definiert, wie das Format von deinem

Jochen

XML aussieht. Und dann kannst du das validieren

Jochen

dagegen und so.

Jochen

Ja.

Jochen

Ein heimlicher

Jochen

XML-Fan? Nein.

Jochen

Nein, das ist alles sehr

Jochen

schrecklich. Also ich meine, man kann

Jochen

das machen, aber das ist alles...

Jochen

Nee, es gibt auch einen Grund, warum das quasi

Jochen

niemand... also niemand

Jochen

tut.

Jochen

Das ist...

Jochen

Ja, also

Jochen

in der Anfangszeit war das...

Jochen

Also mittlerweile ist das auch alles nicht mehr so

Jochen

schlimm. Es gibt gute Bibliotheken, aber

Jochen

es war schon nicht so einfach

Jochen

manchmal. Und was halt an XML nervtötend

Jochen

ist es halt, du kannst es als Mensch nicht gut lesen,

Jochen

es ist halt gigantisch groß.

Jochen

Hässlich. Hässlich,

Jochen

ja.

Jochen

Ja, und

Jochen

dann gibt es natürlich noch sowas wie Jammel oder so,

Jochen

heute irgendwie so ein bisschen auch wieder

Jochen

en vogue. Auch hässlich.

Jochen

Ist aber auch, ja, ist auch ein bisschen hässlich,

Jochen

muss man leider sagen, ja.

Jochen

Wie hat das dann jemand

Jochen

formuliert, ne, so irgendwie Jammel,

Jochen

das, was dabei rauskommt,

Jochen

wenn man irgendwie alle Fehler ignoriert,

Jochen

die bei JSON gemacht worden sind.

Jochen

Und JSON ist das, was rauskommt,

Jochen

wenn alle viele kreative XML gemacht worden sind.

Jochen

Und die Geschichte wiederholt sich immer und immer wieder.

Dominik

Irgendwie das nächste Format heißt,

Dominik

was man nicht gebrauchen kann.

Dominik

Genau, das ist halt echt so ein,

Dominik

aber XML ist auch so ein bisschen,

Jochen

das wurde früher immer gespottet,

Jochen

dass man dem Format ansieht,

Jochen

dass es irgendwie von Juristen

Jochen

und nicht von Informatikern konzipiert wurde.

Jochen

Und dass man irgendwie solche Sachen nicht hat,

Jochen

wie, also, du kannst es nicht ordentlich quoten.

Jochen

Wenn du jetzt zum Beispiel,

Jochen

innerhalb von XML gibt es halt so was

Jochen

wie Kommentare. Wie willst du XML-Kommentare

Jochen

quoten? Das geht überhaupt gar nicht.

Jochen

Und das heißt, wenn du jetzt zum Beispiel

Jochen

in einem XML-Dokument

Jochen

beschreiben willst, wie denn jetzt XML auszusehen

Jochen

hat mit XML-Kommentaren,

Jochen

da passieren ganz schreckliche Sachen. Das geht alles überhaupt

Jochen

gar nicht. Und das ist halt so.

Jochen

Es kann auch nicht sein, dass daran keiner gedacht hat,

Jochen

dass das jetzt nicht geht. Das geht einfach nicht.

Jochen

Und ja, es ist nicht so,

Jochen

dass man sich sagt, das ist voll super elegant,

Jochen

total gut, nehmen wir jetzt sofort.

Jochen

Sondern es ist mehr so, oh,

Jochen

oh, schrecklich.

Jochen

Und JSON ist aus dieser Perspektive

Jochen

für mich weniger schrecklich. Also es ist halt,

Jochen

es kann deutlich weniger, aber

Jochen

okay, dafür ist es halt alles

Dominik

nicht so schlimm. Ist ja zum Serialisieren da, also dass man

Dominik

Daten irgendwo hinlegt als Pfeil

Jochen

oder sowas. Aber es gibt natürlich dann gewisse

Jochen

Begrenzungen, was halt dann nicht gut

Jochen

funktioniert. Eben, ja, Datum oder

Jochen

alles, was irgendwie komplizierte Objekte sind und Code

Jochen

kannst du da auch nicht mit reinpacken.

Jochen

Das geht alles nicht.

Jochen

Und auch dann für die Übertragung

Jochen

im Netz ist halt auch teilweise nicht so gut,

Jochen

weil das halt dann Text ist und

Jochen

das hat also bestimmte schlechte Eigenschaften.

Jochen

Du möchtest eigentlich,

Jochen

naja, da gibt es dann sowas, da gibt es dann ein etwas

Jochen

besseres Format, Message Pack nennt sich das,

Jochen

das kann man halt, das ist so ähnlich wie JSON, bloß

Jochen

binär so,

Jochen

dass das halt irgendwie

Jochen

nicht kaputt gehen kann bei der Übertragung

Jochen

oder nicht so leicht kaputt gehen kann wie JSON.

Jochen

Ja,

Jochen

und, naja,

Jochen

aber JSON ist eigentlich schon, würde ich sagen,

Jochen

für viele Fälle so das, was man eigentlich

Jochen

haben will. Und

Jochen

wenn es dann noch viel komplizierter wird, kann man auch

Jochen

sowas nehmen wie Pickle, da muss man aufpassen.

Jochen

Ja, es gibt noch

Jochen

in Python selber,

Jochen

wenn ich jetzt überlege, gibt es noch eingebaute

Jochen

Geschichten. Es gibt noch Marshall, das Modul, das macht sowas

Jochen

ähnliches wie JSON,

Jochen

bloß halt binär. Das ist auch noch ein Stückchen

Jochen

schneller. Und dann gibt es noch

Jochen

Shelf, glaube ich. Das weiß ich aber nicht.

Jochen

Das habe ich schon ganz lange nicht mehr verwendet.

Jochen

Und eben, wenn man jetzt

Jochen

aber nicht nur Daten

Jochen

serialisieren will, sondern vielleicht

Jochen

auch Code mit, also komplette Objekte

Jochen

mit Funktionalität,

Jochen

dann sowas wie Pickle.

Dominik

Und Pickle kann man auch schicken als Binär-File,

Dominik

dann über das Netz. Genau, man kann

Jochen

verwandelt halt ein komplettes Objekt

Jochen

zum Beispiel in einen binären String

Jochen

und dann schickt man den irgendwie über das Netz.

Jochen

Auf der anderen Seite deserialisiert man den

Jochen

und dann hat man dieses Objekt wieder da.

Jochen

Das ist natürlich sehr praktisch.

Jochen

Was ein bisschen schlecht dran ist, ist, man muss halt sehr aufpassen,

Jochen

dass man dann führt der Code aus.

Jochen

Also wenn

Jochen

einem jemand irgendwie, der nicht

Jochen

vertrauenswürdig ist,

Jochen

irgendwas Gepickeltes schickt,

Jochen

da kann ein beliebiger Code drin sein.

Jochen

Also wenn man das anpickelt,

Jochen

dann führt man das aus, was da drin steht.

Jochen

Das heißt,

Jochen

das sollte man sich klar machen.

Jochen

Hier ist eine Bombe.

Jochen

Genau.

Jochen

Also irgendwas

Jochen

anpickeln, was einem jemand

Jochen

gibt, ist so wie Code ausführen,

Jochen

wenn es jemand gibt.

Dominik

Wenn ich ein Paket öffne, was man nach Hause geschickt bekommen hat,

Dominik

da kann auch eine Briefbombe drin sein.

Dominik

Das ist immer auch beim Essen,

Dominik

Wenn man isst, was man nicht kennt, dann immer Vorkost

Dominik

da daneben.

Dominik

Ja.

Dominik

Man weiß nicht so genau.

Dominik

Die Paranoia kann ja beliebig weit getrieben werden.

Dominik

Genau, genau, genau.

Dominik

Pickel, lass mal überlegen. Es gibt da noch

Jochen

diverse, es gibt da noch für den

Jochen

wissenschaftlichen Bereich ein paar Sachen. Es gibt noch

Jochen

HDF 5,

Jochen

Net, wie heißt das Ding, Net CD.

Jochen

Ich hab's

Jochen

jetzt wieder vergessen.

Jochen

Wie der Standard ist.

Jochen

Es gibt so eben für wissenschaftliche

Jochen

Daten, da gibt es noch Standards,

Jochen

wie man Sachen speichert,

Jochen

die noch so ein bisschen anders sind.

Jochen

Eine CDF, glaube ich,

Jochen

ist das. Ja, so ein HDF5

Jochen

ist einer der, das gehört

Jochen

da irgendwie mit rein in diese Reihenfolge.

Jochen

Ja, hört sich irgendwie total kaputt an.

Jochen

Ja, und

Jochen

NumPy-Arrays haben auch noch mal eine eigene

Jochen

Möglichkeit, wie man sie serialisieren kann.

Jochen

Man kann die auch Memory mappen.

Jochen

Ja, oder ich meine, CSV ist auch eine Möglichkeit,

Jochen

Sachen zu serialisieren. CSV ist auch wieder so ein Format,

Jochen

so eigene, fürchterliche,

Jochen

schreckliche Sachen mit sich bringt.

Jochen

Aber

Jochen

also in anderer Sicht

Jochen

ist es auch wieder ganz gut. Also oft

Jochen

würde ich sagen, wenn man

Jochen

die Wahl hat zwischen CSV und XML, ist CSV

Jochen

die bessere Wahl.

Jochen

Aber ja.

Jochen

Tja.

Jochen

Ja, aber das

Jochen

war es im Grunde eigentlich. Haben wir noch

Jochen

eine wichtige Serialisierungsgeschichte?

Dominik

Ja, ich glaube, wir wollen ja auch, eigentlich wollen wir ja nur eine Minute

Dominik

reden. Ich glaube, das halten wir jetzt.

Dominik

Ui, ui, ui, ui.

Dominik

Ja, ich habe jetzt noch so ein paar Themen, die sind irgendwie jetzt alle aber sehr unzusammenhängend

Dominik

auch. Ich überlege gerade,

Dominik

wo ich damit jetzt noch anfangen soll. Ich glaube,

Dominik

Memory Management hatten wir schon mal gesprochen. Ich glaube, in einer der ersten

Dominik

Folgen haben wir ja über den JIT und den GIL gesprochen.

Dominik

An den Just-in-Time-Compiler

Dominik

und an den Global Interpreter-Log.

Dominik

Dann habe ich

Dominik

jetzt noch das Konzept von MapReduce, aber ich weiß

Dominik

nicht, ob das jetzt hier zugehört, dass das irgendwie

Jochen

nicht ganz da reinpasst. Nee, ich glaube, es ist auch so ein bisschen veraltet.

Jochen

Also inzwischen macht das keiner mehr.

Dominik

Und dann, was mich aber natürlich noch

Dominik

interessiert, wenn man halt debuggen möchte, was da irgendwie

Dominik

der Zeug ist, dann gibt es irgendwie so ein bisschen

Dominik

so, ich nenne es jetzt mal Deep Debugging.

Dominik

Das heißt, man kann Deer auf irgendwelche

Dominik

Fehler spawnen oder Help aufrufen

Dominik

und so. Was gibt es denn da noch? Und wie würde man

Dominik

sich dann angucken, was überhaupt möglich ist

Dominik

mit so Objekten, die man da zurückbekommt,

Dominik

wo man nicht genau weiß, woran liegt denn das jetzt?

Dominik

Guckt man denn da genauer rein?

Jochen

Naja, ich glaube, das ist schon, also Help zeigt halt den

Dominik

Also macht man Help, das ist eine Funktion,

Dominik

die man außen rum schmeißt und was, was zurückkommt?

Dominik

Ja, aber das

Jochen

also an den Objekten hängen halt

Jochen

auch immer Dinge dran, also zum Beispiel man an den

Jochen

Funktionsobjekt hängt da halt auch mal die Dokumentation,

Jochen

also der Dockstring hängt da halt mit dran, den man sich dann

Jochen

angucken kann. Und ich weiß nicht genau, was Help macht, aber

Jochen

Help, glaube ich, wird sowas tun, wie

Jochen

die Dockstrings nehmen und anzeigen,

Jochen

mehr oder weniger.

Jochen

Und dir zeigt

Jochen

halt alle Attribute und Methoden

Jochen

oder so an einem Objekt,

Jochen

die da so dranhängen.

Jochen

Und dann, ja,

Jochen

also zumindest kann man sich dann,

Jochen

zeigt es auch die Funktion Signature, glaube ich, an

Jochen

noch. Was gibt es denn noch?

Jochen

Nee, mehr verwende ich eigentlich auch

Jochen

praktisch nicht.

Dominik

Dieses MRO, dieses Basis,

Dominik

also wenn man so eine von diesen Objekten, die man mit dir

Dominik

dann rausbekommt, sich anguckt, dann

Dominik

bekommt man natürlich noch viel mehr Informationen, weil diese ganzen

Dominik

Magic Methods, so Meta-Attribute

Dominik

irgendwie von den Klassen dranhängen, dass man

Dominik

zum Beispiel jetzt mit Basis sehen kann,

Dominik

welche Oberklassen hat denn überhaupt

Dominik

das Ding, wo ich dann drin bin. Ah, okay, cool.

Jochen

Nee, hab ich noch nie verwendet, glaube ich.

Dominik

So kann man halt noch ein bisschen tiefer reingucken in dieses

Dominik

Vererbungshierarchie-Ding und dieses

Dominik

MRO, also diese Method Resolution Order, zeigt dann

Dominik

dann vielleicht genau, welches von den

Dominik

Dingen aufgerufen worden ist,

Dominik

von den Methoden, die man jetzt in reiner

Dominik

Weise überschrieben hat und was da eigentlich hintersteckt,

Dominik

damit man vielleicht weiß, oh, es wurde etwas Falsches

Dominik

aufgerufen. Also so kann man so ein bisschen immer gucken,

Dominik

wenn irgendwas schief geht, wo man überhaupt nicht weiß, was man

Dominik

da gemacht hat, dass man nicht mehr irgendeinen Komma vergessen hat,

Dominik

wie man dann da reinkommt.

Dominik

Wobei da dann vielleicht auch

Jochen

eine bessere Wahl wäre, einfach direkt

Jochen

einen T-Bugger zu verwenden.

Jochen

Ja, welchen würdest du da empfehlen?

Jochen

Ja, PDB ist halt so das, was

Jochen

und man kann ja auch inzwischen...

Dominik

was macht PDB? Also der stoppt den Code

Dominik

zur Ausführzeiten, man hat eine Shell und kann dann

Dominik

da hochgehen.

Jochen

Du kannst halt auch irgendwie, genau,

Jochen

im Code halt rein

Jochen

Set Trace,

Jochen

da muss ich mal nachgucken,

Jochen

schreibst halt einfach deinen Code rein

Jochen

und dann hast du da halt

Jochen

ein, stoppt halt

Jochen

die Ausführungen an der Stelle

Jochen

und du kriegst halt ein interaktives Prompt,

Jochen

an dem du halt gucken kannst, was steht denn zum Beispiel in den Variablen

Jochen

drin und dann kannst du halt auch

Jochen

sagen, okay, ich gehe jetzt hier weiter oder ich überspringe

Jochen

das und gucke dann wieder, was ist denn da los

Jochen

und genau, also

Jochen

und dann weißt du ja genau, wo du bist.

Jochen

Also

Jochen

das ist eine schöne Geschichte, ich weiß jetzt nicht,

Jochen

seit wann das

Jochen

Tracing eingebaut ist, das müsste jetzt auch irgendwann,

Jochen

das ist noch nicht so lange her, glaube ich.

Jochen

Ja, aber

Jochen

Debugger hilft einem da schon

Jochen

deutlich, ja.

Jochen

Funktioniert halt auch in Django oder

Jochen

so, kriegt man das über

Jochen

die Webseite halt dann entsprechend schnell.

Dominik

Ich glaube, das gehört auch mit der VSCode, also der Enito, der hat das

Dominik

irgendwie auch implementiert. Ja, das muss ich mir auch nochmal angucken,

Dominik

auch noch gar nicht richtig genutzt.

Dominik

Man kann halt dann so Debug-Stops

Dominik

setzen und so.

Dominik

Ja, Breakpoints.

Dominik

Introspection, ja genau.

Dominik

Ja, ich habe jetzt noch

Dominik

zwei andere wieder. Punkt drauf, die haben nichts mehr zu tun.

Dominik

Zwar einmal, wie löst man Multithreading in Python?

Dominik

Ja, das

Jochen

funktioniert so wie sonst auch.

Jochen

Also tatsächlich sind auch Threads in

Jochen

Python halt tatsächlich ganz normale,

Jochen

bilden sich ab auf Threads im

Jochen

Betriebssystem.

Jochen

Es ist halt nur so, dass

Jochen

die nicht wirklich parallel

Jochen

Dinge tun können

Jochen

auf unterschiedlichen CPUs sozusagen. Sie können schon

Jochen

parallel Sachen machen, aber halt natürlich dann

Jochen

nicht so wirklich, weil

Jochen

nicht gleichzeitig,

Jochen

weil Sachen auf einer CPU

Jochen

natürlich doch dann irgendwie immer sequenziell

Jochen

abgearbeitet werden, aber

Jochen

man benutzt die aber,

Jochen

also daher kann man sie nicht dafür

Jochen

verwenden, um

Jochen

Berechnungen zu parallelisieren,

Jochen

weil eben dafür müsste man es ja auf Prozessoren

Jochen

aufteilen können. Das geht nicht.

Jochen

Aber um

Jochen

I.O. zu multiplexen,

Jochen

geht das ganz hervorragend und das

Jochen

funktioniert gut, kann man

Jochen

dafür benutzen.

Jochen

Ist jetzt nicht so die

Jochen

moderne Art,

Jochen

das zu tun.

Jochen

Da würde man wahrscheinlich eher sowas wie Async.io

Jochen

nehmen oder so. Aber

Jochen

man kann auch FETs benutzen,

Jochen

ist völlig okay.

Dominik

Also Async.io macht dann echt das Multithreading auf Multiprozessor?

Dominik

Nee, das macht kein Threading.

Jochen

Async.io ist wieder eine andere Geschichte.

Jochen

Was ist das?

Jochen

Async.io ist, ja, kann man sagen, einmal eine Event-Loop,

Jochen

sozusagen so ähnlich wie in Node.js oder so auch,

Jochen

wo halt immer geguckt wird, was gibt es denn jetzt gerade zu tun oder so,

Jochen

und dann macht man halt an einer bestimmten Stelle weiter.

Jochen

Aber vor allen Dingen halt auch eine Syntax,

Jochen

wie man das so hinschreibt, dass das automatisch gehandelt werden kann.

Jochen

Also ich kann halt sozusagen

Jochen

in Python Funktionen als async

Jochen

deklarieren und dann

Jochen

kann ich halt die Ausführungen,

Jochen

wenn die zum Beispiel blockieren, halt

Jochen

unterbrechen. Die werden dann später weiter ausgeführt, wenn es

Jochen

halt wieder was zu tun gibt.

Jochen

Und ja,

Jochen

das,

Jochen

aber das müssten wir, wenn man das wirklich erklären

Jochen

will, wie das funktioniert, müssen wir noch mal eine Folge

Jochen

zu machen.

Jochen

Eben, damit kann man halt auch IOMultiplexen

Jochen

und das

Jochen

Ganze in einer etwas intuitiveren

Jochen

Art hinschreiben, als wenn man das jetzt mit

Jochen

Threading machen würde. Weil wenn man das mit Threading

Jochen

mit dem Threading-Modul macht, dann

Jochen

wird es sehr schnell auch sehr

Jochen

unintuitiv. Und was man auch

Jochen

irgendwie dabei beachten muss,

Jochen

ist halt, wenn man

Jochen

Tracebacks kriegt irgendwo

Jochen

in Workern, die halt in unterschiedlichen

Jochen

Threads laufen, das kann sehr

Jochen

und also man,

Jochen

das ist halt sowieso das Problem, wenn man jetzt irgendwie Dinge

Jochen

asynchron tut oder so, die halt so

Jochen

irgendwie,

Jochen

Man hat nicht mehr so wirklich

Jochen

einen linearen, der Code läuft

Jochen

nicht mehr so linear durch, sondern man weiß

Jochen

halt nie so genau, wo man gerade ist und was da gerade

Jochen

passiert. Und wenn man da Tracebacks kriegt

Jochen

und viele Threads verwendet

Jochen

und dann weiß man manchmal echt

Jochen

gar nicht, was da gerade passiert ist.

Jochen

Manchmal kommt man in Zuständen raus, die sehr eigenartig sind

Jochen

und das ist dann immer sehr hässlich zu debuggen.

Jochen

Und das geht mit AsyncIO

Jochen

deutlich besser. Also es ist halt

Jochen

deutlich eher so, dass man

Jochen

Code so hinschreibt, als wäre

Jochen

er synchron quasi, aber

Jochen

er dann halt automatisch mehr oder weniger

Jochen

Async, also so ist das

Jochen

halt in den Stellen, wo man auf

Jochen

ein Syscall wartet oder so, wo es blockiert,

Jochen

da macht man dann halt

Jochen

an einer anderen Stelle, wo man halt

Jochen

weitermachen kann, weiter. Und erst dann, wenn dann

Jochen

irgendein

Jochen

Lese, irgendein Read von

Jochen

irgendwie Netzwerkgeschichte zurückkommt, dann geht's

Jochen

halt dann da wieder weiter.

Jochen

Ja, also insofern

Jochen

würde ich sagen, also wenn man jetzt erst damit

Jochen

anfängt, dann ist Async.io wahrscheinlich die

Jochen

interessantere Geschichte, die man sich angucken sollte,

Jochen

weil es mehr aussieht

Jochen

wie ein normales Programm.

Jochen

Aber Threading kann man durchaus

Jochen

auch machen und ist wahrscheinlich sogar

Jochen

ein bisschen schneller, wenn man wenig Threads hat.

Jochen

Aber das ist eigentlich auch

Jochen

furchtbar, das spielt alles keine große Rolle.

Dominik

Okay. Ja, dann

Dominik

was ist Coverage?

Dominik

Oh, wuh!

Dominik

Ganz anderes Thema.

Jochen

Ja, meinst du das

Jochen

Paket oder das Modul? Die Testabdeckung. Achso, die Coverage.

Jochen

Ja, sozusagen wie viel

Jochen

ja, damit gibt man sozusagen an, wie viel

Jochen

Prozent des

Jochen

Codes

Jochen

durchlaufen wird, den man geschrieben hat,

Jochen

wenn man die Tests, also man kann ja halt

Jochen

gucken, auch das geht natürlich in Python ganz gut,

Jochen

es gibt auch ein Module-Coverage-PUI,

Jochen

das das macht, das halt guckt,

Jochen

wie viele von den Zeilen wurden

Jochen

denn aufgerufen, wenn ich jetzt

Jochen

die Tests durchlaufen lasse von meinem Gesamtding

Jochen

und das ist dann halt sozusagen, die Coverage ist halt sozusagen

Jochen

die Prozentzahl und wenn ich halt 70%

Jochen

habe, dann ist es halt

Jochen

besser, als wenn ich 50% habe.

Jochen

Wie viel sollte man denn davon haben?

Jochen

Es gibt Leute, die sagen, man sollte 100% haben.

Jochen

150?

Jochen

Weiß ich nicht so genau,

Jochen

ob das ein sinnvolles Ziel ist,

Jochen

weil es dann manche Sachen sind einfach schwer zu testen

Jochen

und

Jochen

irgendwann wird es halt dann sehr

Jochen

aufwendig und also

Jochen

die ersten 80% sind es, wie das so immer ist,

Jochen

die gehen relativ einfach und dann die letzten

Jochen

20% brauchen dann nochmal

Jochen

80% der Zeit

Jochen

irgendwie, weil das halt alles so

Jochen

fiese Fälle sind, die man nicht gut testen kann.

Jochen

Und dann ist halt die Frage, ist es noch sinnvoll, da so viel Zeit

Jochen

reinzustecken, weil den größten Nutzen

Jochen

hat man dann vielleicht schon gehabt, irgendwie

Jochen

in dem Code,

Jochen

der halt einfach zu testen war. Aber

Jochen

auch da kann man das natürlich vereinfachen, indem man

Jochen

einen Code so schreibt, dass man ihn einfach testen kann.

Jochen

Also manchmal mache ich Funktionen, schreibe ich Funktionen nur

Jochen

deswegen, um

Jochen

diese Funktionen einzeln testen zu können.

Jochen

Und

Jochen

ja, oder manchmal

Jochen

macht es Sinn, Dinge auf eine bestimmte Art

Jochen

zu strukturieren, sodass man sie halt leichter testen kann,

Jochen

als wenn man jetzt irgendwie alles in einer Funktion hat

Jochen

oder so, dann ist halt einfach schwer, die zu testen.

Jochen

Ja, und

Jochen

möglichst hohe Coverage ist natürlich gut.

Jochen

Also ich bin jetzt nicht so,

Jochen

ich will jetzt nicht sagen, dass 100% unbedingt notwendig ist,

Jochen

aber viel wäre schon gut.

Jochen

Und dann gibt es natürlich nochmal

Jochen

auch feine Unterschiede, ob man jetzt nur

Jochen

irgendwie durch den Code

Jochen

durchgelaufen ist, hat man aber auch wirklich alle,

Jochen

gibt es für jede unterschiedliche,

Jochen

also wenn man sowas wie

Jochen

Condition, so

Jochen

Also, if-else-Geschichten hat man sichergestellt,

Jochen

dass man alle Branches, die dann passieren können,

Jochen

durchlaufen hat und so.

Jochen

Insofern ist nicht mehr so ganz klar, was gemeint ist,

Jochen

wenn man jetzt Coverage sagt.

Jochen

Und ja, das kann man dann auch noch mal ...

Jochen

Also, ich glaube, die ursprüngliche Geschichte ist nur so,

Jochen

es ist egal, es müssen nicht alle Branches durchlaufen werden.

Jochen

Und das will man vielleicht auch anders haben.

Jochen

Also, ich glaube, das kann man auch bei Coverage noch einstellen.

Jochen

Etwas feiner.

Jochen

ja, genau. Das Test-Coverage ist halt

Jochen

sozusagen ein Maß dafür, wie viel

Jochen

von dem Code, der

Jochen

in deiner Bibliothek ist oder so, wie viel davon

Jochen

ist eigentlich durch Tests überprüft

Jochen

oder ist überhaupt mal

Jochen

ausgeführt worden bei einem Test.

Dominik

Ja, dann haben wir fast

Dominik

ja schon die letzte Frage. Ich glaube, wir sind da schon ziemlich lange wieder

Dominik

heute dabei. Und zwar

Dominik

auch wieder eine Hörerfrage.

Dominik

Wie man die Performance, die Speichernutzung

Dominik

der Codes prüfen und vergleichen kann?

Dominik

Ja, also

Jochen

was ich oft mache, ist tatsächlich

Jochen

aber das, ich meine, ist ja die Frage, wann das

Jochen

Sinn macht. Das macht eigentlich erst dann Sinn, wenn man

Jochen

viel Hauptspeicher verbraucht.

Jochen

Und ich mache das tatsächlich oft so,

Jochen

dass ich einfach mir

Jochen

die Ausgabe von Top angucke.

Jochen

Und dann sehe ich schon

Dominik

Systemausgabe, wie viel Speicher

Dominik

noch frei ist. Ja, und wie viel

Jochen

Speicher verbraucht ein Prozess.

Jochen

Und wenn dann halt

Jochen

irgendwas läuft, dann weiß ich ungefähr,

Jochen

wie viel Speicher das verbrauchen sollte.

Jochen

Und wenn das doppelt oder dreimal so viel verbraucht, dann

Jochen

weiß ich, dass ich da ein Problem

Jochen

habe und vielleicht nochmal irgendwas machen muss.

Jochen

Es gibt aber auch systematische

Jochen

Ansätze. Also es gibt

Jochen

zum Beispiel auch eingebauten Profiler

Jochen

in Python.

Jochen

C-Profile heißt, glaube ich, das Modul.

Jochen

Genau. Das kann

Jochen

aber mit Memory-Geschichten nicht so viel machen.

Jochen

Für Memory-Sachen

Jochen

glaube ich, da nimmt man dann eher so ein bisschen

Jochen

K-Cache-Grind oder sowas. Aber das

Jochen

ist, ich hab das...

Dominik

Aber wenn man das jetzt im Jupyter-Notebook machen möchte, weil man jetzt

Jochen

keinen Pop hat oder sowas und...

Jochen

Naja, du kannst dir halt von den Datenstrukturen

Jochen

anzeigen lassen, wie viel

Jochen

Speicher sie verbrauchen.

Jochen

Da hab ich jetzt auch wieder vergessen, das wusste ich.

Jochen

Also du kannst in dem Panas-Data-Frame

Jochen

sagen, irgendwie meminfo oder info

Jochen

oder sowas und dann deep gleich true

Jochen

oder sowas, dann geht das halt, macht das

Jochen

rekursiv, geht das durch

Jochen

diesen Data-Frame durch und guckt halt, wie viel

Jochen

Hauptspeicher brauchen da

Jochen

all die Dinge, die da drin sind und sagt dir halt am Ende

Jochen

eine Zahl. Und dann weißt du halt, okay, in diesem Ding

Jochen

stecken jetzt noch so viele Speicher drin.

Jochen

Dein ganzes

Jochen

Jupyter-Notebook, also so kannst du deine einzelnen

Jochen

Datenstrukturen angucken. Bei

Jochen

NumPy-Arrays ist es halt viel einfacher noch.

Jochen

Ich glaube, da gibt es auch eine Funktion, die einem sagt,

Jochen

wie ich den Hauptspeicher irgendwie in Array verwendet.

Jochen

Aber da ist es ja einfach, du kannst dir den D-Type

Jochen

angucken von dem Ding und du kannst

Jochen

ja auch angucken mit Shape, wie viel da drin liegt.

Jochen

Und dann multiplizierst du das einfach mit,

Jochen

wie viel Bit hat halt irgendwie

Jochen

der Typ, den ich da verwende, mal Anzahl Einträge

Jochen

und dann weißt du, wie groß es ist, weil da ist es halt sehr

Jochen

einfach.

Jochen

Also

Jochen

so kann man bei einzelnen Sachen rausfinden, wie viel

Jochen

Hauptspeicher die verbrauchen, weil das, wie viel das

Jochen

ein Jupyter-Notebook insgesamt verbraucht, siehst du halt

Jochen

im Top.

Jochen

Und der Speed?

Jochen

Ja, da brauchst du wahrscheinlich auch ein,

Jochen

also kannst du natürlich auch global

Jochen

das bestimmen,

Jochen

indem du halt, also auf der Shell schreibe ich auf

Jochen

Time einfach davor und dann

Jochen

kriege ich halt dann eine Ausgabe, wie viel,

Jochen

wie lange es gedauert hat

Jochen

bei Jupyter-Notebook-Zellen

Jochen

es gibt es auch halt irgendwie so eine Prozent-Time-Magie.

Jochen

Du kannst aber, wenn du

Jochen

jetzt einen Benchmark machen möchtest, dafür ist es natürlich nicht gut,

Jochen

das einmal auszuführen oder zweimal,

Jochen

sondern da möchte man das halt ein paar Mal

Jochen

ausführen, sodass halt dann auch so Cache-Effekte

Jochen

und so nicht so eine Rolle spielen.

Jochen

Und da gibt es dann halt auch

Jochen

Prozent-Time-It-Magie,

Jochen

wo das dann halt 10.000 Mal ausgeführt wird und dann

Jochen

wird dann halt Durchschnitt berechnet und dann

Jochen

ist es okay, diese Funktion dauert irgendwie

Jochen

üblicherweise 1,7

Jochen

Nanosekunden,

Jochen

äh, Millisekunden, Nanosekunden

Jochen

mehr schnell für die Funktion.

Jochen

Und dann weiß man halt, okay, wenn ich die jetzt

Jochen

so und so oft aufrufe, dann dauert das halt.

Jochen

Ja.

Jochen

Okay.

Jochen

Genau. Und ansonsten eben

Jochen

C-Profile kann man verwenden,

Jochen

wenn man jetzt noch gar keine Ahnung hat,

Jochen

wenn man nachgucken möchte und dann

Jochen

rauskriegen möchte, welche Funktion wird eigentlich am häufigsten

Jochen

aufgerufen und wie lange verbringt

Jochen

mein System sozusagen

Jochen

in welchen Funktionen, dann

Jochen

ist halt so ein Profile eine

Jochen

ganz hilfreiche Geschichte.

Jochen

Und dann, wenn man weiß, wo man Zeit verbringt,

Jochen

dann kann man halt mit TimeIt zum Beispiel

Jochen

in der Notebook-Zelle halt dann irgendwie

Jochen

gucken, ob man das irgendwie optimiert kriegt.

Jochen

Und dann kann man so die heißen

Jochen

Funktionen ein bisschen

Jochen

optimieren und dann sollte

Jochen

das schneller werden.

Dominik

Ja.

Dominik

Ja.

Dominik

Das war die letzte Frage, glaube ich, für heute. Ich glaube, wir sind tatsächlich

Dominik

irgendwie durch. Wir haben viel geredet

Dominik

über Python selbst irgendwie.

Dominik

Ich hoffe, das fandet ihr wieder interessant.

Dominik

Genau.

Jochen

Genau, haben wir noch irgendwie Picks oder sowas?

Jochen

Pick der Woche? Ja.

Jochen

Bis Monats.

Jochen

Ja.

Jochen

Also ich hätte da noch was.

Dominik

Ja, was ist dein Pick der Monats?

Jochen

Und zwar, ich habe

Jochen

mich letztens wieder damit

Jochen

beschäftigt, eine Rechnung neu aufzusetzen

Jochen

und

Jochen

habe dann nochmal so

Jochen

irgendwie angeguckt, ob es nicht, wie macht man

Jochen

das eigentlich vernünftige Python-Entwicklungsumgebung

Jochen

aufsetzen. Dazu gab es

Jochen

einen

Jochen

Artikel von

Jochen

Jacob Kaplan-Moss, glaube ich,

Jochen

einer der Django

Jochen

Gründer

Jochen

da, hat dazu

Jochen

irgendwie meine Python-Entwicklungsumgebung

Jochen

2020 Edition oder so ein Artikel

Jochen

geschrieben, das sollte ich mal verlinken.

Jochen

Und da dachte ich so, ah gut, dann gucke ich doch mal, was der so

Jochen

macht und wie ich das so mache

Jochen

und das, worauf

Jochen

eine Geschichte, auf die ich da gestoßen bin, die ich

Jochen

vorher nicht so verwendet habe, weiß gar nicht genau

Jochen

warum. Ich habe schon davon gehört und haben mir Leute

Jochen

davon erzählt, aber habe es irgendwie nicht benutzt, ist

Jochen

PyEnv.

Jochen

Und das war so eine der Geschichten,

Jochen

die ich, also genau, das wäre jetzt beim

Jochen

Tick PyEnv. Und das

Jochen

ist eigentlich ziemlich cool, weil

Jochen

das ist halt

Jochen

ein kleines

Jochen

Tool, was einem

Jochen

dabei hilft, halt Python zu installieren,

Jochen

was überraschend schwer ist. Es sollte eigentlich nicht so schwer sein,

Jochen

aber es ist halt

Jochen

ganz schön ätzend.

Jochen

Vor allen Dingen braucht man Python oft

Jochen

in sehr unterschiedlichen Versionen,

Jochen

unterschiedlichen Arten, wie man es installiert.

Jochen

Für manche Projekte brauche ich halt

Jochen

Minikonda oder Konda

Jochen

und

Jochen

benutze auch Konda zum Installieren

Jochen

von irgendwelchen Abhängigkeiten und so

Jochen

und Paketen. In anderen Webentwicklungsgeschichten

Jochen

wieder Virtual Envs und

Jochen

da auch wieder

Jochen

einen anderen Python-Interpreter,

Jochen

möglicherweise halt einfach einen, der über

Jochen

Homebrew gekommen ist oder

Jochen

den ich einfach so installiert habe oder sowas.

Jochen

Ja, und

Jochen

ja, also

Jochen

das war immer so ein bisschen

Jochen

doof und mit PyInf ist das eigentlich relativ

Jochen

einfach. Da sagt man dann halt, okay, ich hätte

Jochen

gern, also der

Jochen

installiert dann halt auch, PyInf installiert halt auch

Jochen

Miniconda und sowas.

Jochen

Und dann kann man halt sagen, okay,

Jochen

PyInf install Miniconda latest

Jochen

und dann hat man halt die, muss man

Jochen

nicht mehr sich damit beschäftigen, da irgendwie dieses

Jochen

Shell-Skript, also die

Jochen

Curl in irgendwie

Jochen

Shellscript zu pipen und dann

Jochen

Minicon dazu installieren, sondern das passiert

Jochen

alles für einen automatisch

Jochen

und

Jochen

man kann halt auch pro Verzeichnis dann definieren,

Jochen

was denn jetzt der Interpreter

Jochen

ist, der ausgeführt werden soll, wenn man jetzt da

Jochen

Python eingibt. Da gibt es dann so

Jochen

einen Punkt Python-Version-File

Jochen

und da steht das dann halt einfach drin. Und das kann halt

Jochen

auch ein

Jochen

Name von einem Virtual Env sein. Dann ist man halt

Jochen

in diesem Virtual Env.

Jochen

Oder es kann halt der Name sein

Jochen

von einem Condor-Environment.

Jochen

Und das ist halt sehr, sehr cool.

Jochen

Das heißt, ich hatte vorher sonst immer

Jochen

einen Virtual-Env-Wrapper verwendet

Jochen

und dann immer so Post-Activate-Skripten.

Jochen

Einmal dann halt,

Jochen

ich überlege gerade,

Jochen

ob das nicht ein anderes Thema ist,

Jochen

aber nee, ins Verzeichnis gewechselt

Jochen

und dann noch so Dinge gemacht und so.

Jochen

Und das geht eigentlich quasi mittlerweile

Jochen

alles relativ automatisch

Jochen

und man muss halt auch nicht mehr

Jochen

work on irgendwas sagen,

Jochen

sondern man geht einfach in das Verzeichnis und dann ist

Jochen

gut. Also es funktioniert noch nicht alles

Jochen

hundertprozentig. Das ist auch noch so eine Idee.

Jochen

Ich glaube, ich packe das irgendwo

Jochen

wo packe ich denn das am besten hin? Ich habe mir das

Jochen

mal versucht irgendwann aufzuschreiben sozusagen, was ich

Jochen

da alles tue

Jochen

und was man so an hilfreichen Tools

Jochen

da verwenden kann. Vielleicht packe

Jochen

ich das irgendwo auf GitHub in Gist oder so.

Jochen

Vielleicht haben andere Leute ja auch noch Ideen,

Jochen

was man da an tollen Dingen machen kann.

Jochen

Und vor allen Dingen, manche Sachen funktionieren auch nicht so ganz

Jochen

sauber. Also von irgendwie

Jochen

Virtual-Env nach Conda wechseln, das geht irgendwie,

Jochen

aber umgekehrt geht irgendwie nicht oder so.

Jochen

Weiß nicht genau, warum.

Jochen

Ja, und

Jochen

vielleicht wäre das mal eine sinnvolle Geschichte, das mal zusammen

Jochen

zu tragen. Was muss man eigentlich machen, um halt eine ordentliche

Jochen

Python-Entwicklungsumgebung

Jochen

irgendwie aufzusetzen? Ja, das klingt auf jeden Fall

Dominik

nach einer guten Sache. Genau.

Jochen

Ja. Ja, und

Jochen

genau, Python

Jochen

fand ich jetzt sehr, sehr

Jochen

überzeugend eigentlich und

Jochen

bin ich eigentlich

Jochen

dachte ich mir, warum fände ich das jetzt eigentlich

Jochen

nicht schon immer sozusagen, weil das

Jochen

vereinfacht doch eine Menge Sachen deutlich.

Jochen

Ja, ich habe auch einen kleinen

Dominik

Pick der Woche. Ich nehme diesmal

Dominik

Turtle, diese kleine Bibliothek, mit der man

Dominik

kleine Sachen zeichnen kann auf einer Kenntnis.

Dominik

Ach, Turtle-Grafik, ja. Ja, weil da kann man tatsächlich

Dominik

ganz lustige Sachen machen, zum Beispiel Kunst.

Dominik

Man kann sich Algorithmen in die Mandelbrotmengen

Dominik

berechnen lassen, Funktionen, und der zeichnet

Dominik

dann ganz tolle, witzige Bilder,

Dominik

mit denen man Computerkunst macht.

Dominik

Also, unabhängig davon, dass man jetzt

Dominik

eine kleine Schildkröte über den Bildschirm bewegen kann,

Dominik

um einfache grafische Spielchen zu bauen.

Dominik

Das fand ich sehr witzig, deswegen wollte ich das noch mal

Dominik

picken. Ja, cool, cool,

Dominik

cool. Ja, vielen Dank

Dominik

fürs Zuhören. Egal wann ihr hört,

Dominik

montags, mittags,

Dominik

abends, nachts. Bleibt uns gewogen,

Dominik

habt viel Spaß und wir hören uns bald wieder.

Dominik

Ja, bis zum nächsten Mal. Tschüss. Tschüss.

Dominik

Auf Takt

Dominik

Intakt

Dominik

Im Viertag soll es klingeln.

Dominik

Dreiklangs, Dimensionen sind taktvoll.

Dominik

Lichtspiel, Impressionen, die Farbfarbe.

Dominik

Farbton, Halbton.

Dominik

Und Synchron, da zu schwingen.

Dominik

Drei Klangs, Dimensionen, so taktvoll.

Dominik

Lichtspiel, Impressionen, so fassvoll.

Dominik

Wohlklamm, Illusionen, die um uns herum tanzen.

Dominik

Drei Glanzdimensionen, so taktvoll.

Dominik

Licht spielt Impressionen, so farbvoll.

Dominik

Klänge für Millionen überwinden die Distanzen.

Dominik

Drei Klangsdimensionen, so taktvoll.

Dominik

Licht spielt Impressionen, so fachvoll.

Dominik

Bis zum nächsten Mal.

Dominik

Bis zum nächsten Mal.

Dominik

Ausgang

Dominik

Abgang

Dominik

Sequenzen, ohne Grenzen.

Dominik

Dreiklangs, Dimensionen, so taktvoll.

Dominik

Lichtspiel, Impressionen, so farbvoll.

Dominik

Dreiklangs, Dimensionen, so taktvoll.

Dominik

Lichtspiel, Impressionen, so farbvoll, Dreiklangs, Dimensionen, so taktvoll.

Dominik

Lichtspiel, Impressionen, so farbvoll, Dreiklangs, Dimensionen, so taktvoll.

Dominik

Licht spielt, Impressionen, so farbvoll, drei Klangs-Dimensionen, so taktvoll.

Dominik

Licht spielt, Impressionen, so farbvoll, drei Klangs-Dimensionen, so taktvoll.