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 2er-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 da 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,

Dominik

also ich habe noch eine Basisfrage bekommen von Olli,

Dominik

die hat ja noch geschrieben, Tipps für eine gute Syntax,

Dominik

dein Top 5 oder so.

Dominik

Ich, heute,

Jochen

heutzutage würde ich sagen, Black verwenden und nicht mehr

Jochen

drüber nachdenken.

Jochen

Also einfach Black, bumm.

Jochen

Also Namen vielleicht auch.

Jochen

Namen sind natürlich, das sind ganz,

Jochen

eine ganz schwierige Sache. Also wie kommt

Jochen

man da auf gute Namen? Da muss man auch lange drüber nachdenken

Jochen

oft. Also

Jochen

ja, da gibt es ja auch mal den bekannten

Jochen

Witz, was sind die zwei schwierigen

Jochen

Sachen?

Jochen

Ja,

Jochen

in der Informatik irgendwie

Jochen

Dinge benennen, Caching und

Jochen

oft bei One Error

Jochen

Errors. Ja, aber

Jochen

genau. Also Dinge benennen

Jochen

ist schwierig, ist eine Kunst und

Jochen

ja, wo man sich da auch dran

Jochen

orientieren kann, ist so ein bisschen wie bei

Jochen

guten Kommentaren, sollte er

Jochen

darauf achten, hinzuschreiben,

Jochen

warum man das macht oder was das macht.

Jochen

Nicht so sehr, wie da

Jochen

irgendwas passiert oder so.

Jochen

Ja, und

Jochen

halt dabei, wenn man verschreibt,

Jochen

dran denken, dass

Jochen

das, wenn das

Jochen

jemand liest, dann halt verständlich

Jochen

sein sollte, weil Code viel öfter gelesen wird,

Jochen

als geschrieben.

Jochen

Ja, okay.

Dominik

Was ist mit sowas wie List Comprehensions?

Dominik

Würdest du das bevorzugen gegenüber klassischen

Jochen

loben. Nö, kommt drauf an.

Jochen

Also ich würde sogar eher ein bisschen

Jochen

die andere, ich würde sagen

Jochen

lieber eine Vorschleife

Jochen

verwenden und List Comprehension

Jochen

halt eher dann, wenn es halt irgendwas

Jochen

einfacheres ist, wo

Jochen

ja, wenn es halt offensichtlich und einfach ist,

Jochen

dann kann man auch gerne List Comprehension

Jochen

verwenden, aber wenn man, also

Jochen

ich meine,

Jochen

auch da, das ist halt,

Jochen

wenn man irgendwas entdeckt, wie es funktioniert

Jochen

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

Jochen

und ich habe dann auch schon nicht List Comprehensions

Jochen

gebaut, irgendwie, wo ich dann

Jochen

halt mehrfach

Jochen

verschachtelt irgendwie über Dinge iteriert habe

Jochen

und das wird bei List Comprehension sehr, sehr

Jochen

schnell, sehr, sehr unübersichtlich,

Jochen

wo ich dann halt irgendwie stolz darauf war, so ein Statement

Jochen

hingekriegt zu haben.

Jochen

Nicht in einer Zeile, das geht dann halt

Jochen

nicht mehr in einer Zeile, aber dann so drei Zeilen

Jochen

List Comprehension irgendwie

Jochen

mit Bedingungen drin und verschachtelt

Jochen

und so lange getüftelt, bis es

Jochen

irgendwie ordentlich funktioniert hat. Das macht ja dann

Jochen

auch irgendwie Spaß. Das ist halt so ein bisschen wie puzzeln,

Jochen

aber ich fürchte, wenn da jemand

Jochen

dann drauf guckt, der das

Jochen

verstehen muss und das

Jochen

unter einem gewissen Zeitdruck tut, dann

Jochen

würde der sich wahrscheinlich irgendwie

Jochen

Rot vor Wut.

Jochen

Spaß zur Ärger.

Jochen

Da gibt es

Jochen

das Remote Strangulation Protocol

Jochen

irgendwie zur 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 SysAdmin,

Jochen

also es gibt die SysAdmin

Jochen

ManPages oder die

Jochen

SysAdmin Recovery,

Jochen

gab es eine News Group

Jochen

und dann ASR,

Jochen

Alt SysAdmin Recovery,

Jochen

das war die News Group und dann gab es die ASR

Jochen

ManPages und Tools.

Jochen

Ich glaube, wenn man ManASR

Jochen

sagt oder ManKnife oder

Jochen

Mansnip oder so, dann

Jochen

kriegt man das auch noch irgendwie auf dem Linux

Jochen

zu sehen. Da gibt es dann Tools,

Jochen

mit denen man irgendwie Usern

Jochen

die

Jochen

Attitüde von Usern

Jochen

wieder rejustieren kann

Jochen

und diese Tools sind halt sowas wie

Jochen

Snip

Jochen

oder Knife

Jochen

mit der Axt

Jochen

irgendwie mal dazwischen geht und

Jochen

Dinge gerade richtet.

Jochen

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

Jochen

Ja, das klingt

Jochen

nach Spaß an, wenn man auf der

Jochen

richtigen Seite steht.

Jochen

Ja, ist natürlich so ein bisschen,

Jochen

ich meine, das Mindset dahinter ist auch etwas fragwürdig,

Jochen

aber es ist damals was irgendwie lustig.

Jochen

Und da gab es auch Protokolle

Jochen

und eines der Protokolle in dem Zusammenhang ist halt,

Jochen

dass RSTP, RS, weiß nicht,

Jochen

eben Remote Strangulation Protokoll

Jochen

über Fernverbindungen.

Jochen

Sehr gut, sehr gut.

Dominik

Ja, das ist das, was man in Startorganisationen gerne hätte

Dominik

oder wo man dran arbeitet, das automatisch zu bekommen.

Dominik

Also ihr braucht gute Admins für den Start,

Dominik

damit das funktioniert.

Dominik

Ja, also okay, ein bisschen

Dominik

Syntax haben wir gemacht, ja, also die Frage wäre

Dominik

jetzt noch, was gehört als zu Python Fullstack

Dominik

dann, also wenn man jetzt schon ganz viel kann und so,

Dominik

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

Jochen

hieße ja, dass du quasi alles machen kannst,

Jochen

von unten bis Frontend.

Jochen

Also Full-Second-Python geht gar nicht, weil

Jochen

das geht nicht richtig, genau, weil du mit Frontend

Jochen

bist du halt nicht, da brauchst

Jochen

du halt dann schon JavaScript für

Jochen

und ja, oder

Jochen

es ginge theoretisch auch, aber das ist halt

Jochen

ein Bereich, der schön wäre, wenn das mit Python

Jochen

funktionieren würde, aber momentan geht das nicht richtig.

Jochen

Also man könnte natürlich Python auch irgendwie Richtung

Jochen

WebAssembly kompilieren

Jochen

und dann halt im Frontend verwenden, aber es gibt

Jochen

keine, es gibt

Jochen

eben nicht so viel wie für JavaScript die ganzen

Jochen

UI-Bibliotheken, die man da so braucht,

Jochen

um halt Dinge irgendwie auszumachen.

Jochen

Also, schwierig.

Jochen

Ja, okay.

Dominik

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

Dominik

Und mit nur 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 nicht andere Sachen

Dominik

wie Data und Backend so gut kann?

Jochen

Naja, also wenn du eine Webseite machst, hast du halt sofort

Jochen

diesen ganzen Kram, wobei du da möglicherweise

Jochen

eben auch ohne JavaScript oder ohne viel

Jochen

JavaScript auskommen kannst.

Jochen

So eine ganz stinknormale

Jochen

Webseite, so.

Dominik

Ein bisschen CSS könntest du vielleicht schon machen oder sowas.

Dominik

Ja, auch kein Python.

Jochen

auch wieder kein Python, genau. Aber das

Jochen

geht natürlich auch immer noch und ist eigentlich auch

Jochen

für viele Anwendungen irgendwie

Jochen

gar nicht so schlecht. Aber

Jochen

ja. Ja, gibt es ja so ein paar Framework, ne?

Jochen

Grid, Materialize und so.

Jochen

Naja, also ohne da was. Aber das ist

Dominik

ja was anderes. Ja, also Fullstack geht gar nicht

Jochen

nur mit Python. Ja, und das

Jochen

ist tatsächlich auch einer der großen

Jochen

Risiken irgendwie

Jochen

für die Zukunft von Python, wenn das halt

Jochen

quasi so aus dem Wettding, weil

Jochen

die Frage ist jetzt, kommt Python

Jochen

nochmal ins Frontend oder

Jochen

geht JavaScript ins Backend

Jochen

und wenn der Weg in die Zukunft so aussieht,

Jochen

das wird dann JavaScript, weil das natürlich auch gewisse

Jochen

Vorteile bringt. Du kannst, Marcel, dann

Jochen

schreibst du 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 bei Anfängern gerade ein bisschen beliebter.

Dominik

Vielleicht bedeutet das, dass das irgendwann dann auch in diese Richtung driftet.

Dominik

Ja, mal schauen.

Dominik

Wer weiß.

Dominik

Ja, noch ein Import-Sys.

Dominik

Import-Sys, Son of Python.

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, den Interpreter öffnen, einfach Import-Sys eingeben und abschicken.

Dominik

dann seht ihr das. Then of Python, also die Prinzipien,

Dominik

die man sich

Dominik

darauf geeinigt hat, die in Python gelten, sollen

Dominik

auch sein, wenn man die Anwendung versteht.

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

Dominik

PEP 8. Ich glaube, das hatten wir dann auch schon mal kurz erwähnt.

Jochen

Ja, das ist sozusagen einfach nur die

Jochen

Art, wie man

Jochen

relativ minimalistischer

Jochen

Konsens

Jochen

darüber, wie man Python-Code formatieren

Jochen

sollte, vielleicht.

Jochen

Wer macht das nicht, dann kommt

Jochen

hier in die Python. Ja, aber

Jochen

auch innerhalb von Tab 8 gibt es ja so Dinge,

Jochen

die dann nicht geklärt sind dadurch

Jochen

und

Jochen

Black hat halt zum Beispiel eben eine Meinung

Jochen

dazu, wie das sein soll. Du kannst ja Dinge machen, die

Jochen

Ich finde bei einigen Sachen total furchtbar, das sieht

Jochen

scheußlich aus. Okay, was denn?

Dominik

Ja, wenn ich zum Beispiel Argumente

Dominik

in Funktionen packe oder

Dominik

längere Print Statements schreibe,

Dominik

wie er die dann umbricht,

Dominik

dann macht er die Klammer auf

Dominik

in eine Zeile, dann nächste Zeile den

Dominik

String aus dem Print Statement und dann da drunter

Dominik

die Klammer wieder zu, wo ich dann

Dominik

sagen würde, hey, für die fünf Zeilen extra, wenn

Dominik

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

Dominik

Zeile sind, dann bricht ja dann trotzdem

Dominik

die ganze Funktion auseinander, obwohl sie noch reinpassen würde.

Dominik

Oder wenn

Dominik

Black sagt,

Dominik

ganz viele Argumente in einer Funktion,

Dominik

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

Dominik

auf jeder Zeile ein Argument zu haben.

Dominik

Das sieht auch ganz furchtbar aus.

Dominik

Und dann ist dann der, Klammer zu, mit dem Doppelpunkt

Dominik

dann am Anfang von einer Zeile

Dominik

irgendwie drei Zeilen

Dominik

Funktionsdefinition. Das finde ich total

Dominik

furchtbar. Ich bin eh nicht so ein Freund

Dominik

von diesem 89 Zeichen

Dominik

Editor-Quatsch, weil ganz ehrlich,

Dominik

so Enzien, dass wir nur

Dominik

89 Zeichen auf dem Bildschirm haben.

Dominik

79. Ja, 79. Entschuldigung.

Dominik

Ich entwickle nicht die ganze Zeit mit meinem Telefon.

Dominik

Nee, das ist für Konsolen eigentlich.

Dominik

Die haben halt bloß 80

Jochen

Zeilen, also 24 Zeilen

Jochen

80

Jochen

Spalten.

Jochen

Und es gibt natürlich,

Jochen

oder ich weiß nicht. Ja, die alten, aber nur

Jochen

also die neuen.

Jochen

Weiß ich nicht, ob es da, ne, ne, der Standard ist immer noch so.

Jochen

Also wenn, ist auch so, wenn du, wenn du

Jochen

jetzt auf dem Linux oder so bist, dann hast du ja nicht unbedingt immer

Jochen

ein grafisches System und deine Konsole sieht halt

Jochen

so aus. Da gibt es keinen.

Jochen

Ja, aber auch bei VI hast du ja mehr.

Jochen

Auf einer Konsole?

Jochen

Ja, ich,

Jochen

also ohne grafische Benutzeroberfläche

Jochen

glaube ich, ist schwierig. Aber auf der anderen Seite

Jochen

wahrscheinlich gibt es diesen Fall,

Jochen

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

Jochen

praktisch gar nicht mehr so gut.

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 Rechnerzentrum, an eine serielle Konsole?

Jochen

Ich glaube, da hast du genau die 80 Spalten und 24...

Jochen

Das ist ja uralt, DOS.

Jochen

Ja, bei DOS war das auch so, genau.

Jochen

Ja, ich weiß auch nicht.

Jochen

Also ich glaube auch nicht,

Jochen

das ist eigentlich nicht mehr relevant,

Jochen

aber da kommt das halt her.

Dominik

Das heißt, wenn, dann sieht man da halt, muss man kurz

Dominik

drauf aufpassen, dass es dann umgebrochene Zeilen

Dominik

gibt, die automatisch vielleicht

Dominik

eingruckt werden oder so. Ich weiß gar nicht,

Jochen

auf was ich es gestellt habe bei mir. Das ist ja auch

Jochen

ein Ding, das man bei Black tatsächlich einstellen kann.

Jochen

Also da, das

Jochen

muss man nicht so auf 79

Jochen

zeichnen lassen. Also 79 zeichnen deswegen, weil man halt

Jochen

noch eins braucht von den Zeilen.

Jochen

Aber wenn,

Jochen

also ich glaube, ich habe es auch irgendwo auf

Jochen

einer 10 stehen, aber ich weiß es nicht.

Jochen

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

Jochen

so schlimm. Also ich finde auch ein bisschen mehr als 80 geht

Jochen

schon. Irgendwann ist es natürlich auch wieder doof,

Jochen

wenn das halt zu lang wird.

Dominik

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

Dominik

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

Dominik

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

Dominik

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

Dominik

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

Dominik

wenn es halt dann, beispielsweise

Dominik

du hast drei Debug-Statements hintereinander, das eine

Dominik

ist vier Zeichen zu lang, dann bricht der jetzt ganz komisch rum

Dominik

irgendwie und die anderen darunter

Dominik

sehen nicht so aus.

Dominik

Das ist irgendwie komisch.

Dominik

Also ich finde das

Dominik

wo mein ästhetisches Empfinden wird, da immer so ein bisschen

Dominik

angehört. Naja, gut.

Dominik

Wann ist man

Dominik

Amnesie-Syndrom erkrankt?

Jochen

Ah, not invented

Jochen

hier, ja.

Jochen

Das, äh,

Jochen

ja, ja, ja.

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, dass man

Jochen

halt versucht, alles selber zu machen und

Jochen

wenn es halt nicht von hier kommt, oder so viele

Jochen

Firmen haben das auch, die ja alles

Jochen

alles 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 damit lernen.

Dominik

Also die Grundlagen zu verstehen, ist gar nicht so

Dominik

schlicht und hat man irgendwann nicht

Dominik

keinen mehr, der versteht, wie es irgendwann mal gebaut worden ist.

Dominik

Es sind nur noch Leute, die dann irgendwie auf dem

Dominik

Sand und der Asche von alten versunkenen

Dominik

Stieten versuchen, neue Gebäude zu errichten.

Dominik

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

Dominik

Und dann steht es ja Palast zusammen.

Dominik

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 halt eine richtige

Jochen

Balance finden. Es ist manchmal gut,

Jochen

Dinge, also ein Beispiel dafür

Jochen

wäre auch dieses Timestamp-Modell

Jochen

aus den Model-Utils. Ja, deswegen haben alle

Jochen

als Abhängigkeit Model-Utils drin.

Jochen

Dabei, ja,

Jochen

ist dann auch so,

Jochen

wie meinte ich, über Django 3 kurz

Jochen

auch

Jochen

gesprochen und

Jochen

Und dann hat er dann so, naja, das sind halt eigentlich zwei Zeilen irgendwie in einem Modell, wenn man das selber macht.

Jochen

Vielleicht wäre es besser gewesen, die beiden Zeilen dann selber hinzuschreiben und dann diese Abhängigkeit nicht zu haben, weil jetzt hat man halt das Problem, dass wenn man, das ist ja auch wieder blöd, wenn man nichts selber macht.

Jochen

Ganz schlimmen NPM hat das ja auch so bei JavaScript-Geschichten.

Jochen

Dann hast du halt, musst du dich halt viel mit dieser Maintenance von diesem Kram beschäftigen, was ja auch blöd ist.

Dominik

Ja, Parc-V-Resonierung muss immer stimmen und genau dem Zustand bleiben und wenn du irgendwelche Bugs hast, musst du dann irgendwas updaten, weil irgendwas kritisch war und das hat dann andere Abhängigkeiten und dann fliegt dir irgendwas auseinander, weil das inkompatibel ist mit irgendeiner neuen Implementierung von irgendeiner, ja.

Jochen

Also man kann nicht sagen, das eine ist super schlecht, das andere ist, sondern man muss halt irgendwie einen Weg finden, der für den Anwendungsfall, den man hat, den besten Trade-Off bietet. Aber tatsächlich ist es so, dass die meisten Leute eher zu viel Richtung Not-Invented hier gehen.

Dominik

Ja, manchmal ist das praktisch.

Dominik

Ich glaube, manchmal ist es auch gar nicht so schlecht,

Dominik

wenn man einfach coole Sachen, die cool funktionieren,

Dominik

einfach benutzen kann und die dann cool weiter funktionieren

Dominik

und dann auch einem schnell irgendwas ermöglichen zu entwickeln.

Dominik

Ich glaube, gerade für Anfänger ist das gar nicht so schlecht,

Dominik

wenn man halt nicht von ganz immer anfängt.

Dominik

Obwohl es natürlich auch nett ist,

Dominik

wenn man vielleicht erst mal Assembler lernt und dann C

Dominik

und dann irgendwie guckt, wie es alles so funktioniert.

Dominik

Aber es ist auch vielleicht ein bisschen aufwendig.

Dominik

Man kann vielleicht auch ab und zu mal eine High-Level-Bibliothek

Dominik

einfach benutzen, um zu gucken, wie man Dinge damit anstellt,

Dominik

ohne direkt alles zu verstehen und das selber zu implementieren.

Jochen

Ja, über die Zeit ist es natürlich so, dass auch der Level an Abstraktion, auf dem man arbeitet, wird immer höher eigentlich, weil halt immer mehr wird Commodity, also die Sachen, die früher der interessante Bereich war, in dem man irgendwas gemacht hat, die werden halt zunehmend Community und wandern halt sozusagen aus dem interessanten Feld raus und das, wo man die interessanten Sachen machen kann, das geht über die Zeit immer in abstrakter Geschichten.

Jochen

Das ist halt auch die Frage, inwiefern das nicht unter Umständen, also auf der einen Seite kann man sagen, man kann halt mit viel weniger Zeilencode irgendwie viel kompliziertere Dinge und tollere Sachen bauen, auf der anderen Seite ist es halt, wenn man sich das manchmal genauer anguckt, steht das alles so ein bisschen auf tönernen Füßen, das ist halt so Kartenhaus über Kartenhaus geschichtet und irgendwie auf den unteren Ebenen stimmen schon viele Sachen nicht mehr so richtig, aber dann baut man halt so lange Abstraktionen drüber, bis es wieder, also ja, aber in Wirklichkeit hat man diese Probleme nicht wirklich gelöst.

Dominik

Wenn man halt das Gebäude, den Palast aus der Sandgrube

Dominik

baut, man kann tatsächlich noch ein paar Stahlträger einziehen,

Dominik

das dann zu tun hat, könnte der Palast auch gehalten werden.

Dominik

Das ist halt dann, ja.

Dominik

Ja.

Dominik

Aha. Ja, aber jetzt gehen wir, glaube ich,

Dominik

jetzt haben wir so ein bisschen generell darüber gesprochen,

Dominik

was so, ne, Python generell,

Dominik

was das so ausmacht. Jetzt gehen wir so ein bisschen tiefer

Dominik

in die Probleme der,

Dominik

oder was heißt die Probleme, die Ideen, die Konzepte

Dominik

der eigentlichen Sprache, so, was man auch vielleicht

Dominik

achten muss. Also, falls ihr noch Fragen habt, die ich nicht beantwortet

Dominik

hatte, ne, schreibt uns wieder, wie immer,

Dominik

hallo at pythonpodcast.de, so.

Dominik

Wofür ist die InetPy?

Dominik

Das ist eine gute Frage.

Dominik

Ja, man braucht das irgendwie,

Jochen

damit es ein Paket ist.

Jochen

Ein Modul, wo ist der Unterschied zwischen Modulen und Paketen?

Jochen

Oh mein Gott.

Jochen

Ich glaube, das muss ich ja selber nochmal nachlesen.

Dominik

Damit der Namespace irgendwie vernünftig zugegriffen werden kann.

Dominik

Also alles, was man da irgendwie reinpackt,

Dominik

das sitzt dann im Namespace dieses Moduls,

Dominik

wenn man es importiert, direkt drin.

Dominik

Irgendwie so.

Dominik

Und dann kann man da direkt aktiv drauf zugreifen.

Dominik

Aber die Frage ist halt,

Dominik

warum man das dann nicht mit den Submodulen macht.

Jochen

Du kannst das ja auch

Jochen

reinschreiben, was du

Jochen

exportieren willst, welche Symbole.

Jochen

Interessanter Fall 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

Dominik

muss, ist halt ein Folder importieren.

Dominik

Also, indem man halt relativ

Dominik

Zugriff drauf hat und dann einfach

Dominik

sagen, Import-Folder-Name

Dominik

oder sowas. Und wenn da eine Inis-Pi drin ist,

Dominik

dann kann man die Module, die da drin sind,

Dominik

einfach aufrufen mit

Dominik

seinem Import-Teil. Und dann kann man

Dominik

Modul-Verzeichnis-Name, 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.

Jochen

Ja, aber es ist jetzt nicht so total privat.

Jochen

Ja, also es ist eine Konvention.

Jochen

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 habe ich 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,

Dominik

um 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 umfummeln, ich fasse meine Klassen nicht an.

Jochen

Alles, was man selber schreibt,

Dominik

kann man immer anders kaufordern, wie man anderes

Dominik

anfasst.

Jochen

Ich versuche 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

den gecacheten Wert zurück

Jochen

und ansonsten rechnest du es halt neu aus,

Jochen

unter bestimmten Bedingungen.

Jochen

Und den Cache selber, den legt man oft dann in so einem Underscore-Attribut ab.

Jochen

Underscore-Cache.

Jochen

Ja, oder Underscore, dieser Name dieses Attributes oder so.

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.

Jochen

Aber ich kenne ja jetzt gar nicht die Bedingungen,

Jochen

unter denen das vielleicht den Cache invalidieren müsste oder so.

Jochen

Und wenn ich da jetzt einfach so drauf zugreife,

Jochen

dann kann sein, dass Dinge schief gehen.

Jochen

Und

Jochen

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

Jochen

für das Ding hier bitte nicht direkt

Jochen

verwenden, sondern dann gibt es ja meistens

Jochen

ein öffentliches

Jochen

Attribut, was man benutzen

Jochen

kann und dann kann die Klasse das intern

Jochen

handeln, wie sie das integriert.

Jochen

Ja, im Grunde

Jochen

eine Schnittstelle,

Jochen

die Schnittstelle zu irgendwas.

Jochen

Das gibt es 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,

Jochen

was 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.

Jochen

Das ist halt der öffentliche. Intern macht

Jochen

das dann unter Umständen noch eine ganze Menge anderer

Jochen

Funktionsaufrufe und Dinge und weiß

Jochen

der Teufel. Und die sind aber intern

Jochen

gar nicht alle mit einem Underscore.

Jochen

Nö, also manche von denen kann ich auch einfach so verwenden, das ist ja

Jochen

auch kein Problem, aber andere wahrscheinlich

Jochen

auch eher nicht. Und die, die ich nicht unbedingt

Jochen

verwenden sollte von außen, die

Jochen

sind halt dann so markiert als

Jochen

für intern gebraucht.

Dominik

Ja. Was ist eine private

Dominik

und eine globale Variable und was ist der Unterschied

Dominik

und wofür braucht man das?

Jochen

Global, privat. Also privat, öffentlich,

Jochen

das ist halt so ein bisschen, aber das hat man

Jochen

in Python eigentlich auch gar nicht so wahnsinnig

Jochen

viel. Also in anderen Programmiersprachen gibt es da

Jochen

eine stärkere Unterscheidung,

Jochen

aber im Grunde ist es einfach so.

Dominik

Also ich hatte es gerade so in den Anfängertagen

Dominik

ganz oft so, dass ich irgendwie mir dachte,

Dominik

private Variablen, das ist alles irgendwie

Dominik

ein bisschen blöd. Ich muss ja irgendwie von der Funktion immer

Dominik

irgendwie so einen Wert returnen und damit das dann, also ich glaube

Dominik

im Kontext einer Funktion sind ja eigentlich die Variablen

Dominik

immer privat. Nein, nein, nein, nee,

Jochen

das ist eine Verwechslung. Also du meinst lokal.

Jochen

Lokal und global.

Jochen

Privat und öffentlich, das ist halt genau

Jochen

diese Geschichte mit dem Double Underscore.

Dominik

Ja, okay. Dann meinte ich lokal

Dominik

Und global, ja. Also lokal heißt, Variablen sind halt quasi in dem Block gültig. Und ich habe immer gehört, man braucht keine globalen, man darf die nicht nehmen oder es ist total nicht so backrested.

Dominik

Kann man schon.

Dominik

An einigen Stellen habe ich halt gemerkt, also gerade ich habe mal so Spielereien gemacht, Spiele gebaut oder sowas, da hat es immer total super geholfen, weiß ich nicht, die Lebensenergie des kleinen Männchens global zu definieren, anstatt in einer Funktion oder so.

Jochen

Ja, kann man durchaus machen. Es gibt auch Fälle, wo das durchaus praktische Anwendungsfälle hat. Es kommt halt darauf an, was man damit machen möchte. Man muss das halt explizit als global markieren, wenn man das tun möchte.

Jochen

und dann gibt es auch 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

Jochen

hat da irgendwie State, auf den man zugreift

Jochen

von unterschiedlichen Stellen, also es wird dann halt sehr schwer

Jochen

zu debuggen und sehr schwer vorauszusagen,

Jochen

was da eigentlich passiert, wenn man das einfach so verwendet

Jochen

und an 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 Stellen

Jochen

im Code, an dem an diesem Ding

Jochen

irgendwie rumgeschraubt wird, auch passiert.

Dominik

Warum? Also ich nehme jetzt mal so ein Beispiel, wo ich

Dominik

jetzt intuitiv sagen würde, das wäre jetzt

Dominik

für mich das, was ich jetzt als globale Variable

Dominik

haben würde. Ich habe jetzt ein Spiel,

Dominik

mein Barbar hat Lebensenergie von 100.

Dominik

Und es gibt bestimmte Funktionen, die

Dominik

aufgerufen werden, wenn der Barbar irgendwas

Dominik

macht, falsch macht, richtig macht, runterfällt,

Dominik

gegen einen anderen, gegen einen Monster kämpft,

Dominik

dann würde ich von dieser globalen Lebensenergie

Dominik

irgendwas abziehen.

Dominik

Wofür muss ich

Dominik

denn dann an der einen Stelle, wenn er jetzt,

Dominik

weiß ich nicht, auf ein Skelett trifft, dem Zehn

Dominik

Lebensenergie abzieht, wissen, was an der anderen Stelle

Dominik

die Falle mit ihm gemacht hat?

Dominik

Naja, also, weil du,

Dominik

weil ja, naja, lass mal überlegen,

Jochen

kann ich irgendwas konstruieren, was

Jochen

dann problematisch wird?

Jochen

Ich meine, es kann ja auch Dinge geben, die die Lebensenergie wieder erhöhen.

Jochen

Ein Trank.

Jochen

Ja, und du musst halt zum Beispiel, du musst halt

Jochen

wissen, dass das jetzt schon nicht unter

Jochen

Null gefallen ist, wenn du jetzt,

Jochen

sonst könntest du dich ja auch wieder

Jochen

lebendig machen, sozusagen,

Jochen

wenn du tot bist, eigentlich.

Jochen

Ein Lifehack, ja.

Jochen

Irgendwas muss diesen State verwalten.

Jochen

Irgendwas muss halt sagen, okay, jetzt bist du aber tot.

Jochen

Und dann darfst du nicht

Jochen

durch, darf nicht irgendein anderer Teil des

Jochen

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

Jochen

einfach deine Lebensenergie

Jochen

oder deine Lebenspunkte erhöhen, weil

Jochen

das macht dich ja eventuell wieder lebendig in einer Situation,

Jochen

wo das gar nicht gehen darf.

Jochen

Also, sozusagen,

Dominik

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

Dominik

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

Dominik

einen Ansatz nehmen, wo man irgendwie sowas

Dominik

machen wie erhöhe Lebenspunkte und reduziere Lebenspunkte

Dominik

und der macht das halt dann nur dann, wenn man noch nicht tot ist

Jochen

oder so. Genau, und das erhöhe

Jochen

Lebenspunkte geht halt nur, solange man nicht tot ist zum Beispiel

Jochen

und so. Aber diese Logik, wie

Jochen

das funktioniert, wäre dann halt an einem

Jochen

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

Jochen

Klassen.

Jochen

Hinter Objektorientierter Programmierung, dass du

Jochen

halt die ganze Komplexität

Jochen

irgendwie verbirgst.

Jochen

Hinter

Jochen

ja, hinter dieser

Jochen

in diesem Objekt hinter einer API

Jochen

und dann das halt alles nicht mehr wissen

Jochen

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

Jochen

die da 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

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 Singleton nehmen,

Jochen

beziehungsweise in Python eher Borg-Pattern.

Dominik

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

Dominik

Ja. 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

Dominik

Singleton

Dominik

ist, wenn

Jochen

garantiert sein soll, dass es von einer bestimmten

Jochen

Geschichte nur eine Instanz gibt. Also wenn ich

Jochen

zum Beispiel eben

Jochen

Spiel

Jochen

die Spielfigur oder so, die dann bestimmte

Jochen

Eigenschaften hat, wie eben sowas wie Lebensenergie

Jochen

oder so, wenn ich garantieren

Jochen

möchte, dass alle, die damit interagieren,

Jochen

immer die gleiche Instanz sehen.

Jochen

Es gibt nur einen, es wäre jetzt blöd, wenn ich zwei

Jochen

davon erzeuge und dann in dem einen

Jochen

Objekt verlinke ich die Lebensenergie

Jochen

und beim anderen nicht oder so. Wie macht man das denn?

Dominik

Überschreibt man dann die New-Methode und sagt dann so,

Dominik

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

Jochen

Ja, das ist, nee, eigentlich

Jochen

so, weil dann kommen wir zu dem Borg-Pattern,

Jochen

so wird das üblicherweise dann in Python implementiert,

Jochen

ist, man macht es einfach so, dass

Jochen

wie ging das da?

Jochen

Also ich glaube, der Trick ist,

Jochen

aber das muss man mal nachgucken, also mit Vorsicht genießen,

Jochen

ist, dass sozusagen

Jochen

den State innerhalb

Jochen

von der, eines Objekts

Jochen

sozusagen in der

Jochen

Klassenvariable zu halten, die halt bei allen Instanzen

Jochen

gleich ist. Und dann können die Instanzen

Jochen

zwar unterschiedlich sein, aber der State ist immer gleich.

Jochen

Und dann

Jochen

ist es zwar kein Singleton in dem Sinne,

Jochen

wie man das vielleicht ursprünglich mal

Jochen

so definiert hat. Im Gänger-Vorbuch gibt es

Jochen

halt das Pattern Singleton,

Jochen

weil man eben nicht immer

Jochen

tatsächlich, also ich glaube, die

Jochen

ursprünglichen Singleton-Beschreibungen, das wird einfach immer

Jochen

die gleiche Instanz

Jochen

retornt, wenn man halt die...

Dominik

Also das heißt nie überschreiben. Das würde halt bedeuten, wenn

Dominik

schon ein anderes gibt, retornt es halt das.

Dominik

Retornt es 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

Jochen

verhält sich ähnlich und hat noch ein paar andere nette

Jochen

Vorteile.

Jochen

Dass du halt sozusagen sagst, der State ist

Jochen

über alle Instanzen verteilt,

Jochen

bleibt über alle Instanzen von diesem Objekt

Jochen

gleich und ich muss da nicht kompliziert

Jochen

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

Jochen

weil wen interessiert's?

Jochen

Ja.

Jochen

Ja, aber genau, das sind alles,

Jochen

es geht immer so um State Handling

Jochen

im Grunde. Das ist immer so das, und

Jochen

wer manipuliert den und wie kann man

Jochen

dafür sorgen, dass der, dass man

Jochen

die,

Jochen

den Code, der den State manipuliert,

Jochen

an einer Stelle behält und so.

Jochen

Weil das sind immer so, das ist was, was halt

Jochen

man am Anfang, das ist ein bisschen unintuitiv,

Jochen

das denkt man sich so,

Jochen

naja, das ist ja kein Problem, State kann

Jochen

irgendwo sein, egal, ist in einer Variable,

Jochen

in einer globalen Variable oder so, oder

Jochen

halt auch oft verteilt

Jochen

oder man hat die Klassen,

Jochen

sich mal irgendwie überlegt, wie so eine

Jochen

Klassenhierarchie aussehen soll oder so, aber

Jochen

und zieht das dann durch,

Jochen

unabhängig davon, wie das Problem eigentlich ist

Jochen

und das fiese,

Jochen

was manchmal dann oder fast immer passiert

Jochen

irgendwie, ist, dass man dann halt den

Jochen

State verteilt über viel Code

Jochen

und dass man dann halt... Was ist überhaupt State?

Jochen

Das, was ich,

Jochen

das, was du speichern musst,

Jochen

was sich irgendwie ändert.

Jochen

Der Status.

Jochen

Ja.

Jochen

Also sagen wir mal so, bei einer Web-Applikation

Jochen

würde man sagen, das ist der State

Jochen

einer Web-Applikation, liegt üblicherweise dann eben

Jochen

in der Datenbank.

Jochen

Das ist so eine klassische...

Dominik

Ja, was bedeutet das? Also was ist denn überhaupt dann der State? Sagt der, wie der Nutzer gerade aussehen soll, wie der heißt und was er für Daten gespeichert hat für sein Profil, was er sehen soll. Und das ist halt nicht dynamisch generiert, sondern das liegt dann irgendwo rum. Das heißt, wenn man das ändern möchte, dann muss man ja erst die Daten anfragen oder sowas. Das macht man dann gar nicht woanders.

Dominik

Ja genau, also

Dominik

so

Jochen

ja, also das, was

Jochen

halt sozusagen

Jochen

beschreibt, in welchem Zustand deine Applikation ist.

Jochen

Gehen wir jetzt nochmal aufs Spiel kurz.

Dominik

Was mit der Figur ist. Was hat die gerade

Dominik

für eine Waffe in der Hand? Was für Lebensenergie

Dominik

hat die? Wie viel 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

Jochen

magische Sonstwas-Schwert, Feuerschwert,

Jochen

mit dem du irgendwie alle platt machen kannst.

Jochen

Dann muss ja irgendwo gespeichert werden, dass du

Jochen

das jetzt hast, dass das eine Adventure ist.

Dominik

Und ich darf aber auch keine zwei gleichzeitigen Sachen

Dominik

dann irgendwie haben. Also damit das sich jetzt nicht widerspricht,

Dominik

darf es immer noch ein State geben.

Dominik

Das, was dahinter steckt.

Jochen

Die interessante Frage ist, wie verwaltet man diesen

Jochen

State sozusagen?

Jochen

naiv wäre halt,

Jochen

man hat halt zum Beispiel,

Jochen

Held ist halt in irgendwelchen globalen Variablen.

Jochen

Man hat halt eine Liste, die ist halt

Jochen

global und genau, da steht halt

Jochen

drin, ja, hier ist halt

Jochen

das Flammenschwert und das ist da jetzt

Jochen

in dieser Liste der Items drin und

Jochen

alle manipulieren diese Liste von Items

Jochen

irgendwie, aber das

Jochen

macht dann halt Probleme, weil dann

Jochen

ist Logik, die jetzt irgendwie

Jochen

solche Sachen abbildet, wie

Jochen

das Flammenschmerz macht jetzt plus 10

Jochen

Angriff, aber auf der anderen Seite

Jochen

wird dir heiß, das heißt,

Jochen

wird dir die Hand heiß und du verlierst irgendwie

Jochen

alle halbe Stunde ein paar Lebenspunkte oder sowas, keine Ahnung.

Jochen

Das ist ja

Jochen

ein Code, der irgendwie

Jochen

diese Business-Logik, wenn man das so sagen kann,

Jochen

in dem Spiel halt implementiert

Jochen

Und das kann ja sein, dass da unterschiedlicher Code an unterschiedlichen Stellen steht. Und wenn du jetzt überall das gleiche globale Variable hast, auf die du zugreifst, dann musst du dafür sorgen, dass dieser gesamte Code, der halt über dein Projekt verteilt sein kann, dass der immer weiß, was alle anderen Sachen machen. Und das geht ab einer gewissen Größe nicht mehr. Am Anfang geht das, solange es alles sehr klein ist, kriegt man das auch noch hin, dass man das alles im Kopf behält.

Dominik

Ja, also du musst halt jedes Mal zumindest diese Überprüfung machen. Du musst halt jedes Mal gucken, hat denn jemand irgendwas geändert an der Stelle, das nicht sein darf. Das heißt, jede dieser Logiken müsstest du bei jeder Stelle, wo diese globale Variable geändert wird, erneut machen, was halt dem Don't Repeat Yourself widerspricht und so.

Jochen

Das kann schon durchaus so sein, dass man sich da nicht wiederholt, aber du kannst halt Änderungen machen, die dann nicht lokale Auswirkungen haben.

Jochen

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

Jochen

Du machst jetzt halt ein neues Item, das irgendwelche Spezialgeschichten hat, schreibst da Code für, dass das halt irgendwie tut.

Jochen

Und dabei bedenkst du aber nicht, dass unter bestimmten Umständen irgendwelcher anderer Code irgendwas anderes tut.

Jochen

Und dann passieren halt Fehler und seltsame Effekte.

Jochen

Und solange man halt von dem ganzen anderen Code,

Jochen

der irgendwie daran rumanipuliert, irgendwie weiß, ist das ja okay.

Jochen

Aber sobald das Projekt irgendwie größer wird,

Jochen

geht das irgendwann nicht mehr.

Jochen

Und dann kann man überhaupt nicht vorhersagen,

Jochen

was passieren wird, wenn man jetzt irgendwie Dinge ändert.

Jochen

Wie man manipuliert irgendwas an den Lebenspunkten oder so.

Jochen

Und dann gibt es irgendwas anderes,

Jochen

was wiederum nochmal was anderes macht.

Dominik

Der Invincible Geist.

Jochen

Ja, und das Mittel dagegen ist halt,

Jochen

dass du eben nicht direkt die Daten anfasst,

Jochen

sondern dass du sagst, okay, wir haben hier eine Klasse oder so

Jochen

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

Jochen

und die Logik, die jetzt irgendwas damit macht

Jochen

und haben dann 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

Jochen

in Python? 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

einer Klasse.

Jochen

Also mit einer Klasse

Jochen

definiert man sozusagen

Jochen

eben eine Zusammenfassung

Jochen

von Code, der was tut

Jochen

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 sage nicht so besonders an von dem Brot, der irgendwie

Dominik

Beschreibung von irgendwelchen Sachen...

Jochen

Ja, also man könnte das vielleicht

Jochen

also...

Dominik

Also ein Objekt 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. Ein Objekt ist immer

Dominik

eine Instanz einer Klasse,

Dominik

wenn man das so sagt. Ja.

Dominik

Das heißt, alles, was ihr habt

Dominik

in Python, sind tatsächlich Instanzen von irgendwelchen

Dominik

Klassen, von irgendwelchen Dingen.

Dominik

Die nächste Frage war, was ist Self?

Dominik

Self ist immer das Objekt selbst.

Dominik

Ja, es ist auch eine

Jochen

Konvention, dass man das so nennt, aber

Jochen

sehr sinnvoll,

Jochen

das so zu machen. Außer es gibt

Jochen

wiederum Spezialfälle, bei denen man das ein bisschen anders macht.

Jochen

Also wenn man

Jochen

eine Methode

Jochen

hat, also Methode ist nichts weiter als eine

Jochen

Funktion, die sozusagen

Jochen

an so eine

Jochen

Instanz an so ein Objekt gebunden

Jochen

ist. Und

Jochen

jetzt möchte man halt, um

Jochen

zum Beispiel auf die Daten, die man halten möchte, in so

Jochen

einem Objekt, um da drauf

Jochen

zuzugreifen, muss man ja irgendwie sich selbst referenzieren

Jochen

können. Deswegen wird immer als erstes Argument

Jochen

in Methoden,

Jochen

das ist halt auch das, was dann Methoden von Funktionen

Jochen

unterscheidet, immer

Jochen

eine Referenz auf

Jochen

sich selbst

Jochen

sozusagen mit übergeben. Man könnte das auch

Jochen

anders nennen. Man kann auch sagen,

Jochen

A statt self, dann

Jochen

ist es A, aber es ist schon sinnvoll,

Jochen

das Self zu nennen, damit man weiß, dass es halt eine

Jochen

Referenz auf sich selbst ist, sozusagen

Jochen

auf das Objekt, was gerade, was man

Jochen

gerade ist. Und dann kann man halt auf

Jochen

Self-Punkt irgendwelche Daten zugreifen.

Jochen

Da fangen wir jetzt direkt ein paar andere

Dominik

Sachen ein, weil wir jetzt gerade so hatten mit Objekt.

Dominik

Was ist denn ein Objekt? Es ist eine Klasse und

Dominik

jetzt gibt es irgendwie drei Dekoratoren.

Dominik

Wir müssen auch gleich darüber sprechen, was ein Dekorator ist.

Dominik

Aber es gibt drei Dekoratoren, die

Dominik

Python verwendet, die da

Dominik

immer so drüber stehen. Das StaticMessage,

Dominik

ClassMessage und

Dominik

Property, über Property

Dominik

hattest du eben auch schon. Was ist denn

Dominik

jetzt da irgendwie so der kleine

Dominik

Haken? Also wann dachte man jetzt zum Beispiel,

Dominik

das ist eine statische Methode und

Dominik

wann dachte man, das ist eine Klassenmethode? Was heißt

Dominik

das denn in dem Kontext zu Self und Objekt

Jochen

und... Ja, also

Jochen

ich würde eigentlich am liebsten

Jochen

mit der Klassenmethode

Jochen

anfangen. Also... Class Method.

Jochen

Class Method ist

Jochen

halt eine

Jochen

Methode, die

Jochen

eben nicht eine konkrete Instanz.

Jochen

Das heißt, da fehlt auch Self bei.

Jochen

Genau, da könnte man jetzt auch Self

Jochen

übergeben, das wäre dann sehr verwirrend.

Jochen

Sondern was man da üblicherweise übergibt

Jochen

ist ein CLS oder so

Jochen

und bekommt man die Klasse übergeben.

Jochen

Die Klasse ist auch wieder ein Objekt.

Jochen

Man kann das dann auch ein Stückchen weiter treiben,

Jochen

auch dann mit dem Meta-Klassenanschluss.

Dominik

Also das kleinste Objekt, also jede Klasse

Dominik

ist irgendwie ein Objekt und das Objekt-Objekt-Objekt

Dominik

selber ist ein Objekt vom Typ-Typ.

Dominik

Ja, okay.

Dominik

Ja, okay.

Jochen

Ja, also jedenfalls in der Klassenmethode übergibt man halt CLS und nicht Self, weil man damit halt weiß, dass man jetzt gerade die Klasse in der Hand hat und nicht eine Referenz auf die Instanz.

Jochen

Und es gibt halt, das verwendet man vor allen Dingen dafür, dass man, es gibt halt bestimmte Methoden, die brauchen eben nicht, die müssen nicht auf irgendwelche internen Daten oder so zugreifen, weil die hat man ja nicht.

Jochen

Sondern die gehören zwar vielleicht irgendwie in die Klasse rein, weil die Funktionalität, die sie bieten, halt sehr viel zu tun hat mit der Klasse.

Jochen

Aber die verhalten sich in gewisser Weise natürlich dann so wie eine normale Funktion.

Jochen

Und vielleicht können sie auch auf Daten, die halt für alle Instanzen dieser Klasse gleich sind, zugreifen eben über die Klasse.

Jochen

Aber die brauchen jetzt nicht irgendwie eine konkrete Instanz, auf der sie irgendwas machen.

Jochen

Also ein Beispiel für

Jochen

sowas sind, was ist denn

Jochen

ein gutes Beispiel für?

Jochen

Jetzt bin ich schon aus dem Spiel.

Jochen

Also zwei Beispiele, die ich ganz

Dominik

gut zu visualisieren finde. Entweder hat man

Dominik

so ein Spiel mit so Charakteren

Dominik

oder man hat so ein Universum mit Planeten

Dominik

und Dingen, die umeinander kreisen oder sowas.

Dominik

Zwei verschiedene Sonnensysteme als

Dominik

zwei Klassen. Okay, lass mir das.

Dominik

Ich weiß nicht so genau, ob ich das da

Dominik

irgendwie, also

Jochen

mir fällt da jetzt gar nichts, also

Jochen

es sind oft irgendwelche Hilfsfunktionen

Jochen

oder so, die was machen,

Jochen

was logisch dann in der Klasse gehört, aber

Jochen

wo man nicht mit einer konkreten Instanz irgendwas zu tun

Jochen

hat. Mir fällt jetzt tatsächlich

Jochen

kein super tolles Beispiel

Dominik

ein. Was ist denn der beste und fließende Static Method?

Dominik

Was wäre das denn jetzt so als?

Dominik

Ja, Static Method.

Dominik

Die bekommt halt

Jochen

einfach 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 draußen hinschreiben.

Dominik

Genau.

Dominik

Der einzige Unterschied bei der Static-Method ist halt,

Dominik

dass sie dann im Namespace der Klasse

Dominik

oder des Objekts aufrufbar ist oder so.

Dominik

Ja, was ist jetzt in dem Vergleich eine Static-Method?

Dominik

Okay.

Jochen

Ja, also Static-Method

Jochen

bekommt gar kein

Jochen

automatisches Argument

Jochen

mit, sozusagen.

Jochen

Also 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

Jochen

von draußen, genau.

Jochen

Ah, richtig, jetzt

Jochen

fällt 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

sag 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, das mit dem Manager lassen wir jetzt mal kurz

Jochen

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

Jochen

komplizierter, aber dieses Objects ist auf jeden Fall

Jochen

Dingen, was an der Klasse hängt

Jochen

von

Jochen

und

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

ranzählen 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 hash mir mal das

Jochen

Passwort. Also hier hast du einen String,

Jochen

mach mir mal einen Hash davon, den ich dann irgendwie in die Datenbank

Jochen

schreibe. Das braucht

Jochen

gar keinen Kontext. Das nimmt irgendwie einen String

Jochen

und gibt einen anderen String raus. Das braucht aber sonst

Jochen

überhaupt nichts zu wissen.

Jochen

Und das könnte dann ein Static Method sein, zum Beispiel.

Jochen

Aber es gehört halt logisch vielleicht schon in die

Jochen

User-Klasse, weil es halt irgendwie um

Jochen

Passwörter geht, die ein User

Jochen

eingibt und die dann halt irgendwie gehashed werden sollen.

Jochen

Also das könnte man... Jetzt haben wir noch Property.

Jochen

Property-Dekorator, ja.

Jochen

Und da geht es eigentlich nur darum, dass man, ja, so ein bisschen Convenience, dass man nicht eine Methode aufruft, sondern, also man schreibt halt, also der häufigste Fall ist, man hat eine Methode, die nennt man so wie ein Attribut und schreibt dann AddProperty drüber.

Jochen

Und dann wird halt diese Methode aufgerufen, wenn man irgendwo sagt Instanz.Fubar.

Jochen

Also braucht man eigentlich nicht, man könnte auch eine Methode schreiben.

Jochen

Ja, aber dann müsste man halt dann an der Stelle, wo man

Jochen

es 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 und

Jochen

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 auf Python steht ja sowas

Jochen

explizites besser als implizit und das ist halt

Jochen

schon ganz schön implizit, dass wenn man

Jochen

jetzt irgendwo

Jochen

eben Instanz

Jochen

x.huber sagt

Jochen

halt dann irgendwie Code ausgeführt wird,

Jochen

der irgendwas ausrechnet und dann unter Umständen auch sehr langsam

Jochen

sein kann oder was auch immer, das ist halt nicht unbedingt,

Jochen

also in dem Moment, wo man das halt lokal liest,

Jochen

weiß man nicht, was passiert,

Jochen

was immer so ein bisschen schlecht ist, aber

Jochen

ja, es ist

Jochen

eigentlich normalerweise, wenn man dann

Jochen

komplizierte Sachen macht, dann sollte man das

Jochen

vielleicht dann auch eher als Methode hinschreiben

Jochen

und dann wird das dann vielleicht

Dominik

klarer. Aber wenn man kurz vielleicht

Dominik

zwei Attribute hat, wie das eine ist

Dominik

Kosten, das andere ist Umsatz

Dominik

und dann will man den Gewinn ausrechnen, dann kann man

Dominik

vielleicht schon eine Funktion machen, die dann einfach kurz

Dominik

als Property sagt, hier

Dominik

Umsatz gewinnen und dann

Dominik

geht das einfach schnell aus.

Jochen

Also das

Jochen

Get zu implementieren ist sehr, sehr leicht.

Jochen

Man schreibt irgendwie der Property drüber und dann war's das.

Jochen

Das Set geht auch, also man kann

Jochen

das auch so machen, dass dann halt ein Setter aufgerufen wird,

Jochen

wenn man sagt, irgendwas, InstanceX.fuba

Jochen

gleich irgendwie.

Jochen

Das ist ein bisschen komplizierter, aber

Jochen

ja, geht auch so ähnlich.

Jochen

Ja, also

Jochen

man kann, ich weiß nicht genau, man kann mit dem Property-Dekorator

Jochen

irgendwie sagen, so, das ist hier der Getter, das ist hier

Jochen

der Setter oder was, ich weiß nicht genau.

Jochen

Kann man dann nachgucken, wie man es braucht. Braucht man

Jochen

selten. Also ich habe es ein paar Mal benutzt,

Jochen

aber nicht oft.

Jochen

Aber überhaupt das Konzept von Dekoratoren.

Dominik

Das ist mal ganz gut. Getter-Setter bedeutet halt, dass

Dominik

mal die Attribute irgendwie von außen dann

Dominik

beeinflussen, setzen. Von einer Instanz

Jochen

bekommt oder setzt

Jochen

und zwar nicht direkt

Jochen

manipuliert, sondern

Jochen

Methoden dafür aufruft, die dann noch

Jochen

irgendwas vorher und hinterher tun. Jetzt haben wir schon ungefähr 50 Mal

Dominik

Dekorator gesagt und du wolltest eigentlich noch irgendwas anderes

Jochen

vorher sagen. Dann muss man vielleicht nochmal erklären, was

Jochen

Dekorator eigentlich ist. Eigentlich ist es

Jochen

eine sehr, eigentlich nicht so

Jochen

es kann leicht

Jochen

kompliziert werden.

Jochen

Ja, es ist auf der einen Seite ein bisschen

Jochen

Spezialsyntax.

Jochen

Diese Geschichte mit dem Ad-Symbol, dass man halt

Jochen

über Klassen und über

Jochen

Methoden, Funktionen schreiben kann.

Jochen

Auf der anderen Seite ist es,

Jochen

man könnte es auch anders hinschreiben.

Jochen

Da bräuchte man diese Spezialsyntax

Jochen

nicht, also die haben das so ein bisschen

Jochen

vereinfacht. Man könnte halt auch hinschreiben

Jochen

irgendwie x gleich

Jochen

wrap mir mal eine andere Funktion,

Jochen

wrap, Klammer auf, irgendwie eine andere Funktion,

Jochen

Klammer zu. Und dann wäre das

Jochen

die dekorierte, wäre x die dekorierte Funktion.

Jochen

Und man macht sich eine Tapete auf die Wand

Dominik

und unter der sieht man halt hier Sachen anders.

Dominik

Ah, die Form bleibt erhalten,

Dominik

aber die ist dann vielleicht rot oder blau.

Jochen

Ja, also die Idee ist sozusagen,

Jochen

dass man

Jochen

etwas macht, also man halt Code hat,

Jochen

der, ja man

Jochen

packt, deswegen ist Dekorator eigentlich

Jochen

auch ein, der zeichnet ziemlich genau, was es tut.

Jochen

Man hat halt...

Dominik

Input und Output, der rauskommt oder beziehungsweise

Dominik

reingeht, wird...

Jochen

geht nochmal durch anderen Code durch und

Jochen

dann

Jochen

sozusagen man kann halt, bevor

Jochen

die Funktion aufgerufen wird, irgendwie Dinge damit

Jochen

tun und hinterher

Jochen

Dinge mit dem... Das wird aber ganz schön langsam,

Dominik

wenn das durch einen Dekorator hat, der einen Dekorator hat,

Dominik

der einen Dekorator hat, dann...

Jochen

Ja, aber normale Funktionsaufrufe

Jochen

macht man ja auch, ist auch

Jochen

okay, also das ist ja auch nichts anderes

Dominik

im Grunde. Das heißt, wenn man einen Dekorator selber schreibt,

Dominik

dann baut man quasi einen eigenen Rapper und sagt halt, was

Dominik

passiert, bevor der da reingeht und wann der wieder rauskommt.

Jochen

Ja, man sollte auch tatsächlich, genau, nicht wirklich, wenn man Dekoratoren schreibt,

Jochen

nicht das selber machen eigentlich, sondern man sollte für den Functools Reps oder so nehmen.

Jochen

Und weil es gibt noch so ein paar Hakeligkeiten mit den Funktionsnamen zum Beispiel,

Jochen

die sonst verschwinden, wenn man, die sieht man in Tracebacks nicht mehr

Jochen

und da muss man so ein bisschen, und dann gibt es halt eben in den Functools,

Jochen

gibt es da, glaube ich, irgendwie

Jochen

Funktionen,

Jochen

die, wenn man die benutzt, um den Rekord-Dekorator

Jochen

zu bauen, dann kümmern die sich um diesen Kram,

Jochen

sodass halt dann man in Traceworks weiterhin die Namen sieht und so.

Jochen

Also das ist ein bisschen... Was hat denn das jetzt mit so einem Kontext

Dominik

zu tun? Kontextmanager oder sowas? Oh, nee.

Jochen

Das hat aber nichts zu tun. Das ist eine andere Geschichte.

Jochen

Das hört er sich so ein bisschen an, als

Dominik

macht man irgendwie so einen Kontext auf und rappt irgendwas und

Dominik

baut das dann am Ende wieder auseinander.

Dominik

Hm, also

Jochen

ja, also was

Jochen

eventuell irgendwie

Jochen

eine Gemeinsamkeit

Jochen

ist, dass beides irgendwie unten drunter vielleicht

Jochen

Closures verwendet, wie das

Jochen

umgesetzt ist, aber

Jochen

das ist sozusagen

Jochen

eine interne Funktion, die halt

Jochen

zurückgegeben wird.

Jochen

Und die halt,

Jochen

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, ein Tipp ist,

Jochen

wenn man Dekoratoren schreiben

Jochen

will, aus den Funktools

Jochen

die Wraps-Funktion zu nehmen

Jochen

und

Jochen

einfach mal so ein bisschen damit rumzuspielen.

Jochen

Man braucht ein bisschen, bis das irgendwie,

Jochen

bis man das so raus hat.

Jochen

Ja.

Jochen

Genau, aber dafür sind Dekoratoren

Jochen

da. Man kann damit ganz nette

Jochen

Sachen machen, wie zum Beispiel,

Jochen

also wenn man einfach nur wissen will, wofür braucht man

Jochen

solche Sachen eigentlich, wenn man

Jochen

zum Beispiel eben

Jochen

wie der Datenbankgeschichte, kann man sagen,

Jochen

okay, gibt es einen Transaktions-Dekorator.

Jochen

Da schreibt man einfach drüber.

Jochen

Transaction Atomic. Genau.

Jochen

Das hier ist jetzt alles in

Jochen

einer Transaktion und alle Schritte gehen

Jochen

zusammen gut oder gar nicht. Und wenn halt

Jochen

zwischendurch irgendwas nicht

Jochen

funktioniert hat, dann rollt das automatisch

Jochen

die Datenbank in den ursprünglichen Zustand zurück, als wäre

Dominik

nichts passiert. Das ist ein tolles Beispiel, weil da gibt es nämlich auch

Dominik

den Kontextmanager. Man kann auch sagen, with a Transaction

Dominik

Atomic. Ja, ja, ja, genau.

Jochen

Ja, es ist, klar, kann man auch

Jochen

machen, ja.

Jochen

Ja.

Jochen

Das, genau, das ist eine

Jochen

Geschichte. Ansonsten,

Jochen

ja, man kann auch Dekoratoren dafür benutzen,

Jochen

um sich jetzt eine bestimmte Datenbankverwendung

Jochen

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

Dominik

Benutzer sein muss. Das heißt,

Dominik

die Frage ist halt, was er dann macht. Das kann man

Dominik

auch als Mix-In benutzen, das heißt, auch das

Dominik

wäre eine ähnliche Methode. Ein Mixin

Dominik

ist eine Subklasse,

Dominik

eine Klasse, die man benutzt, um bestimmte

Dominik

Attribute zusätzlich... Mixin sind so ein bisschen

Dominik

eben, wie man

Dominik

Code

Jochen

wiederverwenden kann in

Jochen

Klassen, ohne erben zu müssen. Weil erben

Jochen

macht natürlich, das ist ja sozusagen ein ganz klassischer

Jochen

Weg und das kann man natürlich auch tun. Ja, also in gewisser Weise

Dominik

ist es ja eine Form von vererben, aber eine generalisierte

Dominik

Form, die irgendwie jetzt nicht genau mit der

Dominik

ursprünglichen Klasse zu tun hat, sondern...

Jochen

Ja, genau. Also du kannst halt, ist es nicht so, dass

Jochen

du, ja, also zwei unterschiedliche

Jochen

Klassen, die nichts miteinander zu tun haben, ganz unterschiedliche

Jochen

Stellen in der Klassengereiche sind,

Jochen

können halt das gleiche Mix-In verwenden.

Dominik

Cool, das ist so ein bisschen wie Genetik. Du kannst

Dominik

dem Frosch Flügel geben oder so.

Dominik

Ja.

Dominik

Das ist, äh,

Jochen

ja, ja, warum auch nicht?

Jochen

Ja, wenn

Dominik

man sagt, man hat die Flügel haben wollen, man hat irgendwie eine

Dominik

Klasse, die Flügel bereitstellt, dann kann man diese Flügel

Dominik

jeder Klasse geben und jetzt.

Jochen

Ja, macht natürlich

Jochen

auch nicht immer irgendwie Sinn, aber

Jochen

also, also

Jochen

Vererbung ist auch so ein problematisches

Jochen

Gefühl. Das ist immer das, was einem, wenn man

Jochen

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

Jochen

geworden, dass man halt

Jochen

Sachen von Dingen dann erbt, dass man halt

Jochen

keine Ahnung,

Jochen

ja,

Jochen

weiß ich nicht, da wird immer mit solchen

Jochen

Beispielen gearbeitet,

Jochen

was

Jochen

dass man

Jochen

irgendwie, keine Ahnung, meistens irgendwelche geometrischen Formen

Jochen

oder sowas, ne? Irgendwie, wenn man

Jochen

jetzt ein rechtwinkliges Dreieck hat, dann ist das

Jochen

auf jeden Fall schon mal ein Dreieck, ne? Und ein Dreieck

Jochen

ist irgendwas, was halt irgendwie...

Dominik

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

Dominik

auch vorzustellen, ne? Also die Geometrische Formen sind

Dominik

ganz okay, aber

Dominik

vielleicht auch mit dieser

Dominik

Universumsgeschichte. Du hast irgendwo

Dominik

ein großes schwarzes Loch, so

Dominik

den Urknall oder sowas, und ein Objekt

Dominik

orbitet da irgendwie herum. Das ist

Dominik

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 Mixin 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.

Jochen

Es geht alles nicht so richtig schön.

Jochen

Und am Anfang zu sehen, wie das richtig wäre

Jochen

für das Problem, was man eigentlich lösen will,

Jochen

ist sehr schwer.

Jochen

Ja, weil man das Problem meistens gar nicht genau kennt.

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,

Jochen

wenn ich ohne Objektorientierung programmiere,

Jochen

dann habe ich halt Funktionen, die ich aufrufe.

Jochen

Und wenn ich jetzt merke,

Jochen

ich benutze den gleichen Code an drei, vier unterschiedlichen Stellen,

Jochen

dann mache ich halt

Jochen

eine Funktion draus und rufe den

Jochen

an den Stellen, wo ich sozusagen

Jochen

das verwenden möchte, den Code einfach

Jochen

auf, anstelle, dass ich den Code

Jochen

daraus entstehen habe. Und genauso kann man das mit

Jochen

Klassen im Grunde auch machen und Code,

Jochen

den ich in mehreren Klassen benutze, den ziehe ich halt in Mixins

Jochen

raus. Und dann

Jochen

ist es relativ easy, weil

Jochen

ja,

Jochen

diese Mixins machen halt nichts anderes, außer

Jochen

irgendwie halt eine Methode sozusagen

Jochen

hinzuzufügen zu einer Klasse.

Jochen

Und ja,

Jochen

ja und so

Jochen

Vererbungen,

Jochen

das macht halt mehr.

Jochen

Das tut mehr, also es gibt halt

Dominik

diese Basis, Basisklassen,

Dominik

Basis oder sowas, da gibt es noch sowas wie

Dominik

Message Resolution Order, MROs,

Dominik

wo man dann gucken kann, welche Methoden in welcher Reihenfolge

Dominik

aufrufen werden, weil die sich ja gegenseitig überschreiben

Dominik

können und das Problem, was man

Dominik

dann hat irgendwann ist, dass wenn man da, wie du sagst,

Dominik

einen Fehler macht, dann hat man

Dominik

Circle-Vererbung oder sowas.

Dominik

Ja, das passiert halt, genau,

Jochen

wenn man irgendwas falsch macht, dann passieren

Jochen

unerwartete Dinge, die man auch nicht so,

Jochen

die nicht so offensichtlich sind und

Jochen

ja, und es kann auch sehr schnell

Jochen

sehr hässlich werden, also

Jochen

es gibt wenig Fälle, wo das eine super

Jochen

sinnvolle Geschichte ist, das ist immer so, es ist halt so ein bisschen

Jochen

auch wieder wie bei den Dekoratoren, auch wenn man

Jochen

das am Anfang mal verstanden hat, wie das

Jochen

funktioniert, also ich meine, auch wenn man das mit der Vererbung

Jochen

verstanden hat, wie das funktioniert,

Jochen

dann ist das, dann fühlt sich das so toll an,

Jochen

dass man da ganz viele Dekoratoren machen will,

Jochen

ganz viele Vererbungen und am besten das

Jochen

Ganze irgendwie in verschachtelte List Comprehensions

Dominik

zackt oder so. Und mit Abzug Meta-Klassen

Jochen

bitte? Ja, Meta-Klassen, oh ja.

Jochen

Aber, ich weiß nicht,

Jochen

vielleicht keine gute Idee. Also jedenfalls nicht am Anfang.

Jochen

Also, wenn man

Jochen

dann irgendwann genau weiß, welches Problem man lösen

Jochen

möchte und man möchte halt ein Framework bauen,

Jochen

das halt, wo man dann, also nehmen wir

Jochen

sowas wie General REST Framework, finde ich das relativ gelungen.

Jochen

Da

Jochen

kann man oft viel Funktionalität

Jochen

abbilden, dadurch, dass man jetzt sozusagen von

Jochen

irgendeinem Viewset

Jochen

oder so erbt und dann überschreibt man noch

Jochen

zwei, drei Methoden, passt ein bisschen was an und dann macht das

Jochen

ganz viel. Sehr schön, aber

Jochen

dafür muss man sehr, sehr genau verstanden haben, welches

Jochen

Problem man hat und

Jochen

wenn man so anfängt,

Jochen

dann üblicherweise landet man

Jochen

relativ schnell

Jochen

in einem ziemlich üblen Zustand.

Jochen

Teufelsküche in der Schlangengrube.

Jochen

Man kann das ja immer noch machen

Jochen

am Schluss, wenn man dann irgendwie wirklich verstanden hat, was man tut

Jochen

und so, dann kann man ja immer noch dann irgendwie

Jochen

Klassengereiche hinbauen und so, aber am Anfang

Jochen

lieber nicht. Ich glaube, das ist jetzt der richtige Ort

Dominik

für die nächste Frage, die wäre, was ist ein

Dominik

Monkey-Patch.

Jochen

Ja, das ist, da das

Jochen

alles Objekte sind in Python, kann man

Jochen

die natürlich, und die alle

Jochen

dynamisch änderbar sind,

Jochen

kann man ja auch sozusagen einfach

Jochen

die Methode

Jochen

eines Objektes einfach, man kann ja sagen,

Jochen

zum Beispiel, wenn ich ja

Jochen

nicht nur Attribute setze, sondern ich kann auch die Methode einfach

Jochen

überschreiben. Ich könnte zum Beispiel sagen, wenn ich meinen

Dominik

Barbaren habe, von dem wir eben geredet haben,

Dominik

und er hat ein Attribut, das heißt Attacke,

Dominik

und da ist immer irgendwas drauf,

Dominik

dann kann ich einfach die überschreiben. Dann macht er bei der Attacke

Dominik

irgendwas anderes, zum Beispiel heilte ich oder so. Genau, genau.

Dominik

Und ich könnte einfach sagen,

Dominik

ja,

Jochen

barbar.attack gleich lambda x

Jochen

y z, was auch immer da übergeben wird.

Jochen

Das wäre zum Beispiel wahrscheinlich

Jochen

die Möglichkeit, wie man

Dominik

Vererbung bei Klassen richtig macht,

Dominik

indem man die Basisklasse hat, die wäre jetzt

Dominik

wahrscheinlich in so einem Rollenspiel

Dominik

sowas wie eine Person

Dominik

und dann vererbt man dann auch verschiedene

Dominik

weiß ich nicht, Rassen, zum Beispiel

Dominik

Echse oder Mensch oder sowas.

Dominik

naja, nee, ich bin 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 das 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-Zeit 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 hinauszuzö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 Weltformel 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.

Jochen

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.

Jochen

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, man kann die aber auch insgesamt übergeben.

Jochen

mit Stähnchen dann bei Argumenten oder mit

Jochen

Stähnchen, Stähnchen bei Keyword-Argumenten. Also wenn man

Jochen

die Liste hat in der Hand, wenn man

Jochen

eine Liste hat oder Tupel, dann kann man einfach einen Stern

Jochen

davor schreiben und dann

Jochen

wird das automatisch sozusagen als

Jochen

ja

Jochen

Argumente dann übergeben.

Jochen

Als Impact dann als Argument. Genau.

Jochen

Man sagt dann irgendwie

Jochen

Funktion, Klammer auf, Stern

Jochen

und dann eben

Jochen

Args, Argumente oder

Jochen

wie auch immer das die Items, die Struktur

Jochen

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

Jochen

Klammer zu und dann kann man in der Funktionsdefinition

Jochen

drinstehen haben, so was,

Jochen

Def-Funktion, Klammer auf, A, B,

Jochen

C und

Jochen

muss dann natürlich alles irgendwie stimmen von der Anzahl

Jochen

und so, aber das passiert dann automatisch.

Dominik

Ich finde das bei Keyword-Argumenten relativ nützlich, weil

Dominik

da kann man alle viele Sachen, die man irgendwie zugewiesen hat,

Dominik

irgendwie in eine Liste packen

Dominik

und dann kann man die einfach alles mit

Dominik

Sternchen übergeben und hat dann seine Keywords.

Dominik

Genau, das eben

Jochen

bei normalen Positionsargumenten ist es halt

Jochen

entweder man übergibt sie

Jochen

Perposition oder Stern

Jochen

kann auch eben in der Funktionsdefinition

Jochen

sagen, das können jetzt hier beliebig viele sein,

Jochen

dann schreibt man halt nicht a, b, c rein, sondern

Jochen

Stern, args,

Jochen

Komma, und dann da

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

Sternstern. 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 erspart.

Jochen

Cool.

Jochen

Jetzt haben wir noch zwei Sachen, die noch

Dominik

ein bisschen in diese Funktion reingehen. Wir haben ja

Dominik

Funktionen, jetzt jede Menge so Sachen.

Dominik

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

Dominik

Haben wir, glaube ich, auch schon einmal kurz besprochen.

Dominik

Ist eigentlich nichts Besonderes.

Dominik

Es 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 so

Jochen

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 über

Jochen

mehrere Zeilen oder sowas.

Jochen

Sondern da gibt es halt Lambda.

Jochen

Warum muss das überhaupt sein?

Jochen

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 in Python.

Jochen

Und was jetzt nicht heißen soll, Vorschleifen sind halt schon gut, aber wenn man jetzt über ein Array mit ein paar Millionen Einträgen iteriert, dann will man das vielleicht nicht als Vorschleife hinschreiben, sondern was man dann hinschreibt, ist halt irgendwas DataFrame.apply und dann übergibt man eine Funktion, die dann halt das macht, was man jetzt eigentlich im Body einer Vorschleife gerne gemacht hätte, aber die man ja nicht hinschreiben kann.

Jochen

Diese Funktion hat aber sonst keinen

Jochen

Zweck. Die ist nicht, an anderer Stelle

Jochen

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

Jochen

wollen, wäre eine Vorschleife gewesen und dann

Jochen

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

Jochen

Aber das geht halt nicht.

Jochen

Daher

Jochen

braucht man halt jetzt diese temporäre

Jochen

Funktion, der man jetzt auch gar keinen, gar nicht unbedingt

Dominik

Namen 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

Jochen

zum Quadrat oder sowas,

Jochen

würde halt ein Argument

Jochen

nehmen und dieses Argument mit sich

Jochen

selbst multiplizieren und dann wieder zurückgeben.

Jochen

Nur dass man halt das Return

Jochen

weglassen muss, also

Jochen

Return kann man nicht hinschreiben in der Lambda,

Jochen

sondern es ist halt das, was

Jochen

halt man, das Letzte, was irgendwie

Jochen

Es ist implizit, nicht explizit.

Jochen

Implizit wird das halt einfach zurückgegeben.

Jochen

Und ja,

Jochen

auch die Argumentübergabe

Jochen

ist ein bisschen anders. Es ist halt nicht irgendwie Klammer

Jochen

auf und dann irgendwas, sondern es ist halt einfach

Jochen

Leerzeichen und dann Liste der

Jochen

Argumente, Doppelpunkt

Jochen

und das wird halt implizit

Jochen

passiert. Und es kann alles nur in einer Zeile stehen.

Jochen

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

Jochen

komplizierter wird, man muss das ja nicht so machen.

Jochen

Man kann auch tatsächlich eine Funktion hinschreiben, die man

Jochen

einfach irgendwie nennt.

Jochen

Kann man ja auch sagen, irgendwie

Jochen

rechne mir irgendwie das

Jochen

Quadrat aus oder so Funktion

Jochen

und dann schreibt man halt in diese Funktion,

Jochen

da kann man ja auch mehrere Zeilen schreiben, die schreibt man dann da rein

Jochen

und dann übergibt man das Ding halt.

Jochen

Der Lambda-Funktion.

Jochen

Nicht der Lambda, sondern übergibt das statt der Lambda-Funktion,

Jochen

weil es ist genau das Gleiche.

Jochen

Das, was man zurückbekommt von diesem Lambda, ist auch nichts.

Dominik

Das heißt, Lambda braucht man eigentlich überhaupt nicht.

Dominik

Nee, man braucht es nicht.

Jochen

Es ist halt manchmal auch nett,

Jochen

das so hinschreiben zu können, aber wirklich brauchen

Jochen

tut man es nicht.

Dominik

Spart ein bisschen Schreibarbeit für zum Beispiel so einfache Operationen

Dominik

wie einfach Quadrat zu geben, dann kann man einfach das Lambda

Dominik

in die Zeile schreiben, wenn man es nicht wieder sonst braucht.

Jochen

Genau, weil du hast halt, wenn du

Jochen

Funktionen hinschreibst in Python, immer

Jochen

einen gewissen Zeilen-Overhead, weil

Jochen

naja, da die

Jochen

Umbrüche syntaktisch

Jochen

relevant sind und die Eindrückung, ist es halt

Jochen

so, dass du da auf jeden Fall immer mehrere,

Jochen

mindestens mal zwei Zeilen für hinschreiben musst.

Jochen

Ja, und mit Lambda kannst

Jochen

du es auch in einer Zeile hinschreiben. Und wenn das wirklich

Jochen

eine ganz simple Geschichte ist, dann willst du

Jochen

vielleicht nicht deswegen eine Funktion definieren,

Jochen

sondern, ja, aber

Jochen

letztlich kann man dafür auch ganz normale

Jochen

Funktionen verwenden

Jochen

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

Jochen

du kannst halt innerhalb von Funktionen

Jochen

auch wieder Funktionen definieren. Also du musst ja

Jochen

nicht die Funktionen dann außerhalb der Funktionen, das heißt, du kannst

Jochen

die Funktionen auch direkt da an die Stelle schreiben, wo

Jochen

du sie verwenden willst. Wann macht man das

Dominik

denn alle, dass man so schachtelte Funktionen macht?

Jochen

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

Jochen

sonst nirgendwo verwenden möchtest und

Jochen

möchtest 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

Jochen

halt 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

Jochen

Zum Beispiel können wir mal nehmen, sagen wir mal, def, zähle ab, Klammer auf, x, Klammer zu, Doppelpunkt, counter gleich x und dann def inner, Klammer auf, y, Klammer zu, Doppelpunkt 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 irgendwo

Jochen

und du möchtest ihn irgendwo halten, wo jetzt

Jochen

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 sozusagen, gib mir einen Counter, der ab 5 zählt immer.

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

Jochen

und so funktionieren, die machen da

Jochen

Dinge in der Richtung.

Jochen

Ja.

Jochen

Genau. Aber

Jochen

das finde ich auch

Jochen

sehr schön, dass man halt in Funktionen auch locker

Jochen

irgendwie Funktionen definieren kann und man kann auch

Jochen

Klassen innerhalb von Klassen definieren und so.

Jochen

Also das geht einfach problemlos.

Jochen

Klingt nach

Dominik

viel Konfusion für die Anfänger,

Dominik

die jetzt gerade da sind.

Jochen

Vielleicht sollte man das mal

Jochen

doch nicht machen.

Jochen

Ich habe jetzt noch

Dominik

eine 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

Dominik

A gleich gleich B, A ist B.

Dominik

Etwas ist gleich gleich none, ist none.

Dominik

Ja.

Dominik

Also

Dominik

wenn

Jochen

ich gleich gleich verwendere,

Jochen

also gleich ist natürlich irgendwie Zuweisung,

Jochen

aber gleich gleich, da wird halt

Jochen

der Wert verglichen.

Jochen

Und bei is wird verglichen,

Jochen

ob es das gleiche Objekt ist.

Jochen

Und deswegen sagt man zum Beispiel bei

Dominik

none, sagt man immer is none, weil es nur

Dominik

ein none-Objekt gibt. Genau, none ist ein

Dominik

Singleton.

Jochen

Und deswegen kann ich halt so testen,

Jochen

ob es wirklich none ist.

Jochen

True und false sind auch Singleton.

Jochen

Ja, bin ich mir jetzt nicht so

Jochen

ganz sicher, aber ich glaube schon.

Jochen

Ich weiß aber

Jochen

nicht genau. Ja, so müsste wahrscheinlich so sein.

Jochen

Das könnte eigentlich gar nicht anders.

Jochen

Okay, das heißt, ihr müsst halt tatsächlich,

Jochen

wenn es ist, immer genau das Objekt.

Jochen

Ich weiß nicht, man kann das

Jochen

auch zuweisen. Also es ist auch

Jochen

ganz böse. Man kann True und False

Jochen

auch noch anders belegen. Also

Jochen

müsste man mal nachgucken.

Dominik

Ja, das, was irgendwie spannend ist, weil jetzt, wir haben ja so ein paar Mal über so Sachen geredet, was jetzt irgendwie Klassen sind und Objekte und Typen, dass alle Sachen in Python irgendwelche Objekte sind, irgendwelche Typen sind und dann habe ich mich irgendwie gefragt, ob jetzt nicht die ganzen Zuweisungen, also man kann jetzt irgendwie Typen umwandeln, ja, also von Integer auf String oder sowas, ob das nicht halt auch eine Klasse dann eigentlich ist, die man dann halt nimmt, weil das halt ein Typ ist, ein Objekt ist und deswegen müsste das eigentlich groß geschrieben werden, weil man halt eine Instanz eines Objektes ändert und eine Instanz eines Objektes erzeugt.

Dominik

Zum Beispiel von einer Instanz eines Objektes

Dominik

String, eine Instanz eines Objektes Integer wechselt.

Dominik

Wenn man ein Int 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

Jochen

in Python ist so, wenn es eine Klasse ist, dann schreibt man

Jochen

das halt groß.

Jochen

Aber

Jochen

ich glaube, alle Build-Ins sind klein.

Jochen

Und da das Build-Ins

Jochen

sind,

Jochen

sagt man eher,

Jochen

das ist wichtiger, weil es gibt nicht so viele Build-Ins.

Jochen

Aber richtig wäre es tatsächlich, dass man,

Dominik

zum Verständnis vielleicht, dass man irgendwie,

Dominik

wenn man einen Typ ändert,

Dominik

einer Variable beispielsweise, dass man einen neuen

Dominik

Instanz, eine neue oder eine andere Klasse erzeugt.

Jochen

Ja, ja, das ist so. Aber das passiert

Jochen

auch tatsächlich. Also wenn ich sage int

Jochen

Klammer auf 5, Klammer zu,

Jochen

dann wird ein neues Integer-Objekt

Jochen

erzeugt. Genau, mit dem Word 5.

Jochen

Also es ist tatsächlich

Jochen

ja,

Jochen

auch Dict ist ja

Jochen

eine Klasse tatsächlich.

Jochen

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

Jochen

aber ich

Jochen

kann davon erben und das funktioniert auch.

Jochen

Aber

Jochen

ja, ich denke, das hängt damit

Jochen

zusammen, dass die Build Insights so Spezialfälle

Jochen

sind. Wenn ich die Klassen verwenden möchte,

Jochen

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

Jochen

Zum Beispiel

Jochen

für

Jochen

Dict und List und so gibt es

Jochen

UserDict und UserList.

Jochen

Und auch wenn ich jetzt irgendwie

Jochen

selber ein eigenes Dict, das Dinge

Jochen

ein bisschen anders macht als ein normales Dict

Jochen

verwenden möchte, dann

Jochen

sollte ich halt irgendwie von UserDict

Jochen

erben und nicht von einfach nur

Jochen

kleingeschriebenem Dict.

Jochen

Das ist wieder wie du das nie, weil sich

Dominik

schon Leute rumgekümmert haben, bestimmte Probleme zu umgehen,

Dominik

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

Dominik

Ja, genau, genau.

Dominik

Ja.

Dominik

Ja, jetzt haben wir, wir haben noch jede Menge,

Dominik

ich weiß gar nicht, ob wir das heute in der Folge alles irgendwie unterkriegen,

Dominik

noch einer hat gefragt, was denn eine

Dominik

Shallow-Copy ist.

Dominik

Wie arbeitet man richtig mit Listen

Dominik

im Zusammenhang mit Funktionen, oder gibt man eine Kopie

Dominik

und retournt eine neue Liste, oder gibt man eine

Dominik

Liste und ändert die quasi in Plays?

Dominik

Was hat das damit zu tun?

Dominik

Also irgendwie.

Dominik

Ja,

Jochen

das ist auch eine unter Umständen

Jochen

Stilfrage, was man da machen

Jochen

möchte.

Jochen

Also einmal

Jochen

vielleicht zuerst das mit der

Jochen

Shallow-Kopie, also

Jochen

die Frage ist, was passiert eigentlich,

Jochen

wenn ich jetzt sozusagen

Jochen

eine Kopie von irgendwas machen möchte und

Jochen

weil ich

Jochen

warum auch immer irgendwie eine zweite

Jochen

Version von irgendeiner Datenstruktur brauche oder so,

Jochen

da ist es, wenn ich jetzt

Jochen

die einfach nur kopiere, also

Jochen

wenn ich jetzt, also

Jochen

in Python habe ich eigentlich meine Referenzen auf solche

Jochen

Datenstrukturen in der Hand, also

Jochen

auch die Übergabe von Sachen

Jochen

ist immer bei Referenz, also es gibt ja

Jochen

ein C, es ist unter Umständen anders, da gibt es halt

Jochen

kann ich Argumente übergeben

Jochen

als Referenz oder

Jochen

halt als

Jochen

Wert, also

Jochen

direkt den Wert einfach so

Jochen

und in Python ist es immer

Jochen

per Referenz, also

Jochen

in der Variable, die ich übergebe

Jochen

steht immer sozusagen einfach eine Speicheradresse

Jochen

drin, die halt auf das Objekt zeigt, das ich übergebe

Jochen

und ich übergebe immer nur die Adresse, ich

Jochen

übergebe nicht der Funktion, das

Jochen

Objekt selbst

Jochen

und jetzt ist es halt so, wenn ich

Jochen

einfach nur

Jochen

bestimmte Operationen duplizieren mir halt

Jochen

jetzt diese Adresse, aber nicht den Inhalt

Jochen

dahinter. Das heißt, wenn ich jetzt

Jochen

ich mache eine Kopie davon, ich muss

Jochen

mal überlegen, in welchen Umständen ich das hinkriege.

Jochen

Wenn ich jetzt

Jochen

wenn ich jetzt einfach

Jochen

nur copy

Jochen

ich weiß nicht, ob

Jochen

copy in built-in ist, aber wenn ich

Jochen

einfach nur sage, kopier mir das mal,

Jochen

dann kann es sein, dass mir nur die Referenz kopiert wird.

Jochen

Das heißt, mir wird halt die Speicheradresse

Jochen

in eine andere Variable kopiert, aber wenn ich jetzt

Jochen

irgendwas am Inhalt einer Liste oder so ändere,

Jochen

dann ist das in beiden Listen geändert.

Jochen

Und das ist unter Umständen nicht so intuitiv.

Jochen

Vielleicht hätte man jetzt nicht

Jochen

so mit gerechnet, sondern

Jochen

man hätte damit gerechnet, dass ich jetzt zwei Listen habe,

Jochen

die im Hauptspeicher an zwei unterschiedlichen

Jochen

Stellen liegen.

Jochen

Und eine Shallow-Copy ist halt eine,

Jochen

die nur sozusagen

Jochen

also bei einer Liste

Jochen

könnte ich mir jetzt sogar vorstellen, dass es oft,

Jochen

wenn ich jetzt nochmal Lists drumherum schreibe oder so,

Jochen

dass dann tatsächlich eine Kopie erzeugt wird.

Jochen

Also eine Nicht-Cello-Kopie, aber

Jochen

wenn ich jetzt eine komplizierte

Jochen

Datenstruktur habe in irgendeinem Dikt oder so,

Jochen

wo viele Sachen ineinander

Jochen

verschachtelt drin liegen, dann ist es so, wenn ich

Jochen

jetzt sage Dikt von dem Ding, dann ist

Jochen

es eine, oder wenn ich sage Kopie,

Jochen

dann ist das eine Cello-Kopie

Jochen

und

Jochen

sozusagen. Warum brauche ich dann überhaupt

Dominik

eine Cello-Kopie? 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 zum Beispiel eine Funktion aus dem Copy.

Jochen

Ich glaube, das ist Standardbibliothek.

Jochen

Dann sagt man immer Form Copy, Import Deep Copy.

Jochen

Und dann sagt man Deep Copy,

Jochen

irgendwie komplizierte, dick verschattelte Datenstruktur.

Jochen

Und die geht dann rekursiv da durch

Jochen

und kopiert den ganzen Kram da raus in eine andere Datenstruktur.

Jochen

Und dann habe ich das tatsächlich getrennt voneinander.

Jochen

Aber ansonsten ist das halt nicht so einfach.

Jochen

wenn ich da Dict drumherum mache,

Jochen

dann kann es zwar auch sein,

Jochen

dass es ein neues Dict ist an einer anderen Speicheradresse

Jochen

und dass ich die Keys und Values kopiert habe,

Jochen

aber die Values waren halt Referenzen auf irgendwas

Jochen

und die Objekte hinter diesen Referenzen

Jochen

haben sich halt nicht geändert.

Jochen

Und das kann halt sehr...

Jochen

Da kann man sich ein bisschen mit in den Fuß schießen,

Dominik

wenn man sowas übergibt wie leere Listen

Dominik

als Standardwert vom Keyword.

Jochen

Ja, da kann man sich böse in den Fuß schießen mit.

Dominik

Weil dann, also das ist, glaube ich, generell das Problem.

Dominik

Also bei so ein paar Sachen, die man als Keyword setzt,

Dominik

wenn man jetzt irgendwie eine Funktion hat,

Dominik

Da wird ein Keyword übergeben, das setzt man einem Default-Wert, indem es zum Beispiel eine leere Liste hat oder einen random initialisierten Wert oder sowas.

Dominik

Der wird halt beim ersten Mal dann initialisiert und dann steht dann halt aber in der Speicheradresse dieser Wert drin, der dann halt dem zugewiesen ist schon.

Dominik

Weil das halt dann nur darauf zeigt und halt nicht jedes Mal ein neues Objekt generiert.

Dominik

Und das heißt, man hat immer dieselbe leere Liste, die dann vielleicht nicht mehr leer ist, nachdem man die Funktion einmal aufgerufen hat.

Jochen

Und dann ist es immer die gleiche und dann funktioniert es sogar oft und dann irgendwann fällt es einem ganz 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

ob es None ist und dann setzt man die Liste

Jochen

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

Jochen

Also das kann

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

Dominik

oder sowas, 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, sondern immer

Dominik

dasselbe. Also das ist an der Stelle

Dominik

nicht intuitiv. Also fand ich auch sehr

Dominik

komisch, dass er dann nicht einfach jedes Mal beim Aufrufen

Dominik

das neu initialisiert, sondern dass er halt dann die Objekte

Dominik

nimmt, die er einmal schon irgendwo liegen hat.

Dominik

Ja,

Jochen

also wie man, also eine

Jochen

Geschichte, wie man, also List Comprehension

Jochen

macht immer eine Kopie, wenn man zum Beispiel

Jochen

erzeugt immer eine neue Liste.

Jochen

Ansonsten, ja, die Kopie aus dem Kopiemodul,

Jochen

wenn es kompliziertere Datenstrukturen sind, dann muss man

Jochen

sich das nicht selber, also oft ist es ja, ich meine, es ist ja

Jochen

wirklich kompliziert, wenn man da halt

Jochen

was, ja, man muss halt

Jochen

rekursiv durchgehen und das will man ja vielleicht auch nicht selber

Jochen

schreiben und da gibt es halt schon ein Ding für,

Jochen

was man da benutzen kann. Dann

Jochen

ist es so, naja, was diese unterschiedlichen

Jochen

Stile angeht, also

Jochen

wenn man sich so ein bisschen

Jochen

anguckt, was in den, es gibt ja

Jochen

unterschiedliche Arten zu programmieren,

Jochen

ja, so imperativ. Ich würde auch Python

Jochen

eher, auch wenn man es auch mit Berechtigung

Jochen

sagen kann, es ist auch irgendwie eine funktionale

Jochen

Programmiersprache,

Jochen

ist es doch eher, die meisten Leute verwenden es halt

Jochen

irgendwie imperativ.

Jochen

Und

Jochen

in dem Lager sozusagen

Jochen

Paradigma der funktionalen Programmiersprachen

Jochen

ist es aber eher so, dass man halt da

Jochen

und nicht nur da, das setzt

Jochen

sich auch in anderen Bereichen durch. In JavaScript

Jochen

sehen wir das in letzter Zeit oft,

Jochen

auch wenn es um so State-Handling-Geschichten geht,

Jochen

da gibt es dann Redux und so,

Jochen

dass man, wenn man jetzt solche Sachen handelt,

Jochen

versucht immer nur mit Datenstrukturen zu arbeiten,

Jochen

die nicht veränderbar sind, also die mutable sind

Jochen

und immer nur Kopien erzeugt, wenn man irgendwas ändert.

Jochen

Also man ändert nichts in einer bestimmten Datenstruktur,

Jochen

sondern man erzeugt eine neue Kopie

Jochen

und

Jochen

an der ändert man dann halt

Jochen

irgendwas, beziehungsweise man ändert nichts, sondern

Jochen

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 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

Jochen

halt irgendwie ein Dikt übergeben bekommt,

Jochen

das dann irgendwie dann ändert

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 Funktion

Jochen

nehmen, da irgendwas dran ändern und das Ding

Jochen

dann wieder zurückgeben oder so oder am besten gar nicht

Jochen

zurückgeben, sondern einfach nur ändern,

Jochen

sondern man würde immer, wenn man was ändert,

Jochen

eine neue Kopie zurückgeben.

Jochen

Weil man dann halt diesen ganzen schönen Effekt

Jochen

hat, was, wenn man das nicht tut,

Jochen

was, würde ich sagen, aber in

Jochen

Python oft so ist, also man

Jochen

übergibt irgendwo eine Liste

Jochen

und dann ändert man irgendwie ein Element in dieser

Jochen

Liste und dann gibt man die Liste wieder zurück.

Jochen

Dann gehen ganz viele schöne Sachen

Jochen

nicht mehr, weil dann ist es halt,

Jochen

ja.

Jochen

Man hat vielleicht irgendwas kaputt gemacht.

Jochen

Ja. Was auf der anderen

Jochen

Seite manchmal halt auch total viel einfacher

Jochen

macht, als wenn man es funktional

Jochen

schreibt und auch effizienter,

Jochen

weil einmal ist es so, man kann halt

Jochen

Dinge nicht mehr so richtig direkt beeinflussen

Jochen

und es ist halt so, man muss halt,

Jochen

wenn man alles immer kopiert und jetzt

Jochen

man aber jetzt große Datenmengen hat, zum Beispiel

Jochen

im Data-Science-Bereich ist es halt, wenn deine Datenstrukturen

Jochen

alle hunderte Megabyte groß sind und du machst

Jochen

immer Kopien von allem, was auch,

Jochen

also tatsächlich, Pandas macht das auch

Jochen

per Default, wenn irgendwelche, alle

Jochen

Operationen geben immer Kopien zurück,

Jochen

aber das kann auch ganz schön in den Hauptspeicher

Jochen

gehen und manchmal muss man dann schon sagen, so, ja,

Jochen

hier bitte nicht kopieren. Das geht einfach nicht, passt da nicht

Jochen

mehr. Und dann

Jochen

muss man halt

Jochen

Sachen direkt in place

Jochen

ändern oder so. Und das ist natürlich immer ein bisschen schmutzig,

Jochen

aber ja.

Jochen

Weekend Dirty. Ja, ja.

Jochen

Dunkle Magie wieder.

Jochen

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

Jochen

für ein Problem hat. Und also

Jochen

wenn man das nicht kennt, dann sich mal so anzugucken,

Jochen

wie man mit alten Datenstrukturen einfach

Jochen

nur immutable irgendwie hält und immer

Jochen

kopieren soll. Das ist eigentlich schon sehr

Jochen

schick. Also dann kommen wir direkt

Dominik

das gekonnt, schließt 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, aber

Dominik

ich auch, also vielleicht ein bisschen

Dominik

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, ja, ist halt sehr effizientes

Jochen

Ding und einen Riesenhaufen

Jochen

Probleme lassen sich dadurch schon lösen.

Jochen

Also wenn man das ordentlich verwendet,

Jochen

dann kriegt man da so ein sehr

Jochen

großen Teil der so 0815

Jochen

Programmiergeschichten, die man so macht, kriegt man halt mit Listen

Jochen

und Dicts irgendwie abgebildet.

Jochen

Listen braucht man auch,

Jochen

halt gerade, wenn man irgendwelche Dinge iteriert

Jochen

und so, aber Dicts ist halt

Jochen

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

Jochen

beliebige Dinge irgendwie speichern kann

Jochen

und man kann die

Jochen

Namen, unter denen

Jochen

man das findet, dann halt irgendwie dynamisch generieren

Jochen

und muss das halt nicht vorher definiert haben

Jochen

in Code.

Jochen

Und wann nutzt

Dominik

man denn Tupel, das Datenschutz, wenn man eine Listen hat?

Dominik

Also warum ist das überhaupt?

Jochen

Ja, Tuppel sind halt immutable, ja genau.

Jochen

Das ist halt der Grund.

Jochen

Deswegen an den Stellen, wo man es halt immutable haben will,

Jochen

dann kann man die halt gut nehmen.

Jochen

Unter anderem zum Beispiel, wenn du halt möchtest,

Jochen

dass etwas Key in einem Dikt sein kann.

Jochen

Das geht halt mit einer Liste nicht.

Jochen

Da musst du halt einen Tuppel nehmen.

Jochen

Oder halt bei so Geschichten wie Tuppel, Unpacking und so,

Jochen

das geht auch nur mit Listen.

Jochen

Klar, das geht auch mit Listen, aber ich weiß nicht,

Jochen

ich überlege jetzt gerade, ob es einen tieferen Grund gibt,

Jochen

warum Argumente

Jochen

ein Doppel sind.

Jochen

Also,

Jochen

ja,

Jochen

generell. Also, Dicky war

Jochen

vielleicht eine gute Idee, ja.

Jochen

Es gibt schon

Jochen

den Fall öfter mal, dass man das halt nicht

Jochen

änderbar haben will und dann nimmt man halt ein Doppel

Jochen

statt eine Liste. Aber

Jochen

tatsächlich ist es so, es gibt auch

Jochen

Skalare, sozusagen einfache

Jochen

Werte irgendwie, also sowas wie eine 5

Jochen

oder wie String, wobei Listen und Dicts ist halt auch so das,

Jochen

was man in allen Programmiersprachen irgendwie

Jochen

oder vor allen Dingen in allen Skriptsprachen

Jochen

irgendwie eingebaut findet.

Jochen

Das hast du halt auch in Perl und in PHP und in JavaScript.

Jochen

Die heißen halt in allen diesen Programmiersprachen

Jochen

irgendwie ein bisschen anders.

Jochen

In Perl heißt es halt Hash und Array.

Jochen

In PHP heißt es Assoziatives Array.

Jochen

Und weiß ich nicht,

Jochen

JavaScript heißt es halt Object

Jochen

und

Jochen

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

Jochen

Ja, naja. Aber

Jochen

diese Grunddatentypen hast du halt

Jochen

überall, deswegen, weil das halt,

Jochen

damit kannst du halt schon eine Menge machen.

Jochen

Und Tuple 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, ein integrierter

Jochen

Datentyp ist, ist halt Z in Python.

Jochen

Ja. Das ist auch

Jochen

eine Datenstruktur, die wir relativ häufig

Jochen

oder ich benutze sie relativ häufig

Jochen

und von denen gibt es halt dann auch immutable

Jochen

Varianten. Ich weiß jetzt gar nicht, ob es immutable Dicts

Jochen

gibt, aber

Jochen

zum Beispiel von Z gibt es halt Frozen Z, eben

Jochen

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

Jochen

irgendwie als Key in Dict ist oder so.

Jochen

Und den kannst

Jochen

du halt dann nicht mehr verändern.

Jochen

Vielleicht gibt es auch so etwas wie eine Frozen-List, ich weiß nicht genau.

Jochen

Aber

Jochen

Frozen-Set benutze ich tatsächlich ab und zu.

Jochen

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

Jochen

Frozen-List ist Tupel, ja, genau.

Dominik

Okay, wann nutzt man denn

Dominik

NumPy-Arrays? Ja,

Dominik

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 verschicken 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 definieren,

Jochen

wie die Daten aussehen.

Jochen

Du kannst beschreiben, wie das, was du

Jochen

reinschreibst, wann das okay ist.

Jochen

Du kannst halt eine DTD

Jochen

zu deinem XML

Jochen

dazuschreiben, das halt sozusagen definiert,

Jochen

wie das Format von deinem XML aussieht.

Jochen

Und dann kannst du das validieren dagegen

Jochen

und so.

Jochen

Ja.

Jochen

Ein heimlicher XML-Fan?

Jochen

Nein.

Jochen

Nein, das ist alles sehr schrecklich, also ich meine, man kann das machen, aber das ist alles, nee, es gibt auch einen Grund, warum das quasi niemand, also niemand tut, das ist einfach, das ist, ja, also in der Anfangszeit war das, also mittlerweile ist das auch alles nicht mehr so schlimm, es gibt gute Bibliotheken, aber es war schon nicht so einfach manchmal.

Jochen

Und was halt an XML nervtötend ist, ist halt, du kannst

Jochen

es als Mensch nicht gut lesen, es ist halt

Jochen

gigantisch groß.

Jochen

Hässlich. Hässlich, ja.

Jochen

Ja, und dann gibt es natürlich noch

Jochen

sowas wie Jammel oder so, heute

Jochen

so ein bisschen auch wieder en vogue.

Jochen

Auch hässlich.

Jochen

Ist aber 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, wenn man

Jochen

irgendwie alle Fehler ignoriert,

Jochen

die bei Jason gemacht worden sind. Und Jason ist

Jochen

das, was rauskommt, wenn man alle Fehler ignoriert,

Jochen

die bei XML gemacht worden sind.

Jochen

Und die Geschichte

Jochen

wiederholt sich immer und immer wieder.

Dominik

Irgendwie das nächste Format heißt, was man nicht gebrauchen kann.

Dominik

Genau, das ist halt echt so ein, aber

Dominik

XML ist auch so ein bisschen,

Jochen

da wurde früher immer gespottet, dass man dem

Jochen

Format ansieht, dass es irgendwie von Juristen und nicht

Jochen

von Informatikern konzipiert wurde.

Jochen

Und dass man irgendwie solche Sachen nicht hat, wie

Jochen

also, du kannst es nicht ordentlich quoten.

Jochen

Wenn du jetzt zum Beispiel, du kannst halt innerhalb von XML, gibt es halt sowas wie Kommentare, wie willst du XML-Kommentare quoten? Das geht überhaupt gar nicht. Und das heißt, wenn du jetzt zum Beispiel in XML, in einem XML-Dokument beschreiben willst, wie denn jetzt XML auszusehen hat mit XML-Kommentaren, da passieren ganz schreckliche Sachen, das geht alles überhaupt gar nicht.

Jochen

Und es ist halt so, es kann doch nicht sein, dass daran keiner gedacht hat, dass das jetzt nicht geht. Es geht einfach nicht. Und ja, es ist nicht so, dass man sich sagt, das ist voll super elegant, total gut, nehmen wir jetzt sofort. Sondern es ist mehr so, oh, schrecklich. Und Jason ist aus dieser Perspektive für mich weniger schrecklich. Also es kann deutlich weniger. Aber okay, dafür ist es halt alles nicht so schlimm.

Dominik

Ist ja zum Serialisieren da, also dass man Daten irgendwo hinlegt

Dominik

als Pfeil oder sowas.

Jochen

Aber es gibt natürlich dann gewisse Begrenzungen,

Jochen

was halt dann nicht gut funktioniert.

Jochen

Eben, ja, Datum oder alles, was irgendwie

Jochen

komplizierte Objekte sind und Code kannst du da auch nicht

Jochen

mit reinpacken. Das geht

Jochen

alles nicht. Und

Jochen

auch dann für die Übertragung im Netz ist

Jochen

halt auch teilweise nicht so gut, weil das

Jochen

halt dann Text ist und

Jochen

das hat also bestimmte schlechte Eigenschaften.

Jochen

Du möchtest eigentlich,

Jochen

da gibt es dann sowas, da gibt es ein etwas besseres Format,

Jochen

Message Pack nennt sich das, das kann man halt so

Jochen

ähnlich wie Jason, bloß

Jochen

binär so, dass

Jochen

das halt irgendwie

Jochen

nicht kaputt gehen kann bei der Übertragung oder nicht so

Jochen

leicht kaputt gehen kann wie Jason.

Jochen

Ja,

Jochen

und naja,

Jochen

aber Jason ist eigentlich schon, würde ich sagen, für viele

Jochen

Fälle so das, was man eigentlich haben will

Jochen

und wenn es dann noch

Jochen

viel komplizierter wird, kann man auch sowas nehmen wie Pickle,

Jochen

da muss man aufpassen.

Jochen

Es gibt noch in

Jochen

Python selber, wenn ich jetzt überlege,

Jochen

gibt es noch eingebaute Geschichten, es gibt noch

Jochen

Marshall das Modul ist, macht sowas ähnliches wie

Jochen

JSON, bloß halt

Jochen

binär. Das ist auch ein Stückchen schneller.

Jochen

Und dann gibt es noch Shelf,

Jochen

glaube ich. Das weiß ich aber nicht. Das habe ich schon ganz lange

Jochen

nicht mehr verwendet.

Jochen

Und eben, wenn man jetzt aber nicht nur

Jochen

Daten

Jochen

serialisieren will, sondern vielleicht auch Code

Jochen

mit, also komplette Objekte mit Funktionalität,

Jochen

dann

Jochen

ja sowas wie Pickle.

Dominik

Und Pickle kann man auch schicken als binär-File.

Dominik

Genau, man kann

Jochen

verwandelt halt ein komplettes Objekt

Jochen

zum Beispiel in einen Binären-String

Jochen

und dann schickt man den irgendwie übers 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, halt irgendwie

Jochen

irgendwas Gepickeltes schickt, da kann

Jochen

beliebiger Code drin sein.

Jochen

Also wenn man das anpickelt, dann

Jochen

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

Jochen

Das heißt, ja, das sollte

Jochen

das sollte man sich

Jochen

klar machen, dass das...

Jochen

Genau, dass man

Jochen

also, ja, irgendwas

Jochen

anpickeln,

Jochen

was einem jemand gibt, ist so wie irgendwie

Jochen

Code ausführen, die einem jemand gibt.

Dominik

Ein Paket öffnen, was man nach Hause geschickt bekommen hat, da kann auch

Dominik

eine Briefbombe drin sein, man weiß es nie so genau.

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ß es nie so genau.

Dominik

Die Paranoia kann ja beliebig weit getrieben

Dominik

werden. Genau, genau, genau.

Dominik

Pickel, lass mal überlegen, gibt es noch, es gibt

Jochen

dann noch diverse, es gibt dann noch

Jochen

für den wissenschaftlichen Bereich ein paar Sachen, es gibt noch

Jochen

HDF5,

Jochen

Net, wie heißt das Ding, NetCD,

Jochen

ich habe es jetzt wieder vergessen,

Jochen

wie der Standard ist,

Jochen

also wie, ja, es gibt so eben für

Jochen

wissenschaftliche Daten, gibt es noch Standards,

Jochen

wie man, wie man

Jochen

Sachen speichert, die noch so ein bisschen anders sind.

Jochen

Eine CDF, glaube ich, ist das.

Jochen

Und HDF5 ist einer der,

Jochen

das gehört da irgendwie mit rein in diese Reihenfolge.

Jochen

Ja, hört sich irgendwie total kaputt an.

Jochen

Ja, und

Jochen

NumPy-Arrays haben auch

Jochen

nochmal eine eigene Möglichkeit, wie man sie serialisieren kann.

Jochen

Man kann die auch Memory-Mappen

Jochen

ähm,

Jochen

ja, oder ich meine, CSV

Jochen

ist auch eine Möglichkeit, Sachen zu serialisieren.

Jochen

CSV ist auch wieder so ein Format,

Jochen

so eigene, fürchterliche, schreckliche Sachen

Jochen

mit sich bringen.

Jochen

Aber, äh, also

Jochen

in anderer Sicht ist es auch

Jochen

wieder ganz gut. Also oft

Jochen

würde ich sagen, wenn man die Wahl hat

Jochen

zwischen CSV und XML, ist CSV die bessere

Jochen

Wahl. Aber

Jochen

ja.

Jochen

Tja.

Jochen

Ja, aber das war es

Jochen

im Grunde eigentlich. Haben wir noch eine wichtige

Jochen

Serialisierungsgeschichte? Ja, ich glaube,

Dominik

wir wollen ja auch, eigentlich wollen wir ja nur eine Minute reden.

Dominik

Ich glaube, das halten wir jetzt.

Dominik

Ja, ich habe jetzt noch so ein paar Themen, die sind

Dominik

irgendwie jetzt alle aber sehr unzusammenhängend auch.

Dominik

Ich überlege gerade, wo ich damit jetzt noch anfangen

Dominik

soll. Ich glaube, am Memory Management hatten wir schon mal

Dominik

gesprochen, ich glaube, in einer der ersten Folgen, da haben wir ja über den JIT

Dominik

und den GIL gesprochen, an den

Dominik

Just-in-Time-Compiler und den

Dominik

Interpreter-Log.

Dominik

Dann habe ich jetzt noch das Konzept von

Dominik

MapReduce, aber ich weiß nicht, ob das jetzt hier zugehört,

Dominik

dass das irgendwie nicht ganz...

Jochen

Es ist auch so ein bisschen veraltet, also inzwischen macht das

Dominik

keiner mehr. Und dann, was

Dominik

mich aber natürlich noch interessiert, wenn man halt debuggen

Dominik

möchte, was da irgendwie der Zeug ist, dann

Dominik

gibt es irgendwie so ein bisschen, ich nenne es jetzt mal

Dominik

Deep-Debugging, das heißt, man kann

Dominik

Deer auf irgendwelche

Dominik

Spawn oder Help aufrufen und so, was

Dominik

gibt es denn da noch und wie würde man sich dann angucken,

Dominik

was überhaupt möglich ist mit so Objekten, die

Dominik

man da zurückbekommt, wo man

Dominik

nicht genau weiß, woran liegt denn das jetzt,

Dominik

guckt man dann da genauer rein. Naja, ich glaube, das ist schon,

Jochen

also Help zeigt halt den...

Dominik

Also was macht man, Help ist eine Funktion, die man

Dominik

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

Dominik

Ja, aber das,

Jochen

also an den Objekten hängen halt auch immer Dinge

Jochen

dran, also zum Beispiel man an dem Funktionsobjekt

Jochen

hängt halt auch immer die Dokumentation, also

Jochen

der Dockstring hängt da halt mit dran, den man sich dann angucken kann.

Jochen

Und ich weiß nicht genau, was Help macht, aber Help, glaube ich,

Jochen

wird sowas tun, wie

Jochen

die Dockstrings nehmen und anzeigen.

Jochen

Mehr oder weniger.

Jochen

Und dir zeigt halt alle

Jochen

Attribute und Methoden oder so

Jochen

an einem Objekt, die da so

Jochen

dranhängen und dann

Jochen

ja,

Jochen

zumindest kann man sich dann, zeigt es auch

Jochen

die Funktion Signature, glaube ich, an noch.

Jochen

Was gibt es denn noch?

Jochen

Mehr verwende ich eigentlich auch

Jochen

praktisch nicht.

Jochen

Die ist MRO, ne?

Dominik

dieses Basis, also wenn man so eine von diesen Objekten,

Dominik

die man mit dir dann rausbekommt, sich anguckt,

Dominik

dann bekommt man natürlich noch viel mehr Informationen,

Dominik

weil diese ganzen Magic Methods,

Dominik

Meta-Attribute irgendwie von den Klassen dran hängen,

Dominik

dass man zum Beispiel jetzt mit Basis

Dominik

sehen kann, welche Oberklassen

Dominik

hat denn überhaupt das Ding, wo ich dann drin bin.

Jochen

Ah, okay, cool. 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,

Dominik

zeigt dann vielleicht genau, welches von den

Dominik

Dingen aufgerufen worden ist,

Dominik

von den Methoden, die man jetzt in reiner Weise überschrieben hat

Dominik

und was da eigentlich hinter steckt, damit man vielleicht

Dominik

weiß, oh, es wurde etwas Falsches aufgerufen. Also so

Dominik

kann man so ein bisschen immer gucken, wenn irgendwas schief geht,

Dominik

wo man überhaupt nicht weiß, was man da gemacht hat, dass man

Dominik

nicht mehr irgendeinen Komma vergessen hat,

Dominik

wie man dann da reinkommt. Wobei da dann vielleicht

Jochen

auch eine bessere Wahl wäre,

Jochen

einfach direkt einen

Jochen

Debugger zu verwenden.

Jochen

Ja, welchen würdest du da empfehlen?

Jochen

PDB ist halt so das, was, und man kann ja auch

Dominik

inzwischen... Was macht PDB? Also der stoppt

Dominik

den Code zur Ausführzeit, man hat eine Shell

Dominik

und kann dann 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 du halt einfach deinen Code rein

Jochen

und dann hast du da halt ein,

Jochen

stoppt halt die

Jochen

Ausführungen an der Stelle und du hast halt,

Jochen

kriegst halt ein interaktives Prompt, an dem du halt gucken kannst,

Jochen

was steht denn zum Beispiel in den Variablen drin

Jochen

und dann kannst du halt auch sagen, okay, ich gehe jetzt hier

Jochen

weiter oder ich überspringe das und

Jochen

gucke dann wieder, was ist denn da los und

Jochen

genau, also und dann

Jochen

weißt du ja genau, wo du bist

Jochen

also das ist

Jochen

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

Jochen

eingebaut ist, seit wann das Tracing

Jochen

eingebaut ist, das müsste jetzt auch irgendwann,

Jochen

das ist noch nicht so lange her, glaube ich.

Jochen

Ja, aber Debugger

Jochen

hilft einem da schon

Jochen

deutlich, ja.

Jochen

Funktioniert halt auch in Django oder so,

Jochen

kriegt man das über die Webseite

Jochen

halt dann entsprechend schnell.

Dominik

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

Dominik

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

Dominik

Gar nicht richtig genutzt, man kann halt

Dominik

dann so Debug-Stops setzen und so.

Dominik

Ja, Breakpoints.

Dominik

Introspection, ja genau.

Dominik

Ja, ich habe jetzt noch

Dominik

zwei andere wieder. Punkt drauf, die nicht 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 Python

Jochen

halt tatsächlich ganz normale, bilden

Jochen

sich ab auf Threads im Betriebssystem.

Jochen

Es ist halt nur so, dass

Jochen

die nicht wirklich

Jochen

parallel Dinge tun können.

Jochen

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 aufteilen

Jochen

können. Das geht nicht.

Jochen

Aber um I.O.

Jochen

zu multiplexen, geht das

Jochen

ganz hervorragend und das

Jochen

funktioniert gut, kann man dafür

Jochen

benutzen.

Jochen

Ist jetzt nicht so die

Jochen

moderne Art, das zu tun.

Jochen

Da würde man

Jochen

wahrscheinlich eher sowas wie Async I.O. nehmen oder so.

Jochen

Aber man kann

Jochen

auch ZSATs benutzen, ist völlig

Dominik

okay. Also Async I.O. macht dann echt

Dominik

das Multithreading auf Multiprozessor? Nein, das macht kein

Jochen

Threading. Async I.O. ist wieder eine andere

Jochen

Geschichte. Was ist das? Async.io

Jochen

ist, ja,

Jochen

kann man sagen, einmal eine Event-Loop,

Jochen

sozusagen so ähnlich wie

Jochen

in Node.js oder so auch,

Jochen

wo halt immer geguckt wird, was gibt es denn jetzt

Jochen

gerade zu tun oder so, und dann macht man halt an einer bestimmten Stelle

Jochen

weiter. Aber

Jochen

vor allen Dingen halt auch eine Syntax, wie man das

Jochen

so hinschreibt, dass das automatisch

Jochen

gehandelt

Jochen

werden kann. Also ich kann halt

Jochen

sozusagen in Python Funktionen

Jochen

als Async deklarieren

Jochen

und dann kann ich halt

Jochen

die Ausführungen, wenn die zum Beispiel

Jochen

blockieren, halt unterbrechen. Die werden dann später weiter

Jochen

ausgeführt, wenn es halt wieder was zu tun gibt.

Jochen

Und

Jochen

ja,

Jochen

das

Jochen

aber das müssten wir, wenn man das

Jochen

wirklich erklären will, wie das funktioniert,

Jochen

eine Folge zu machen,

Jochen

eben, damit kann man halt auch

Jochen

IO multiplexen

Jochen

und das Ganze in einer etwas

Jochen

intuitiveren Art hinschreiben, als wenn man

Jochen

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

Jochen

Modul macht, dann wird es sehr schnell

Jochen

auch sehr unintuitiv

Jochen

und was man auch irgendwie dabei

Jochen

beachten muss, ist halt, wenn man

Jochen

Tracebacks

Jochen

kriegt irgendwo in

Jochen

Workern, die halt in unterschiedlichen Threads laufen,

Jochen

das kann sehr, also

Jochen

das ist halt sowieso das Problem,

Jochen

wenn man jetzt irgendwie Dinge asynchron tut

Jochen

oder so, die halt so irgendwie

Jochen

man hat nicht mehr so

Jochen

wirklich einen linearen,

Jochen

der Code läuft nicht mehr so linear durch, sondern

Jochen

man weiß halt nie so genau, wo man gerade ist

Jochen

und was da gerade passiert. Und wenn man da

Jochen

Tracebacks kriegt und viele

Jochen

Threads verwendet, dann weiß man

Jochen

manchmal echt gar nicht, was da gerade passiert ist.

Jochen

Manchmal kommt man in Zuständen raus, die sehr

Jochen

eigenartig sind und das ist dann immer sehr hässlich

Jochen

zu debuggen. Und das geht

Jochen

mit Async.io deutlich besser.

Jochen

Also es ist halt deutlich eher so,

Jochen

dass man Code so hinschreibt,

Jochen

als wäre er synchron quasi,

Jochen

aber er dann halt automatisch

Jochen

mehr oder weniger Async. Also

Jochen

So ist das halt in den Stellen, wo man auf einen Syscall wartet oder so, wo es blockiert, da macht man halt an einer anderen Stelle, wo man halt weitermachen kann, weiter. Und erst dann, wenn dann irgendein Read von irgendwie Netzwerkgeschichte zurückkommt, dann geht es halt dann da wieder weiter.

Jochen

Ja, also insofern würde ich sagen,

Jochen

also wenn man jetzt erst damit anfängt,

Jochen

dann ist Async.io wahrscheinlich die interessantere

Jochen

Geschichte, die man sich angucken sollte, weil es

Jochen

mehr aussieht wie ein normales

Jochen

Programm. Aber

Jochen

Threading kann man durchaus auch machen

Jochen

und ist wahrscheinlich sogar ein bisschen schneller,

Jochen

wenn man wenig Threads hat.

Jochen

Aber ach, das ist eigentlich auch furchtbar, das spielt

Jochen

keine große Rolle.

Dominik

Ja, dann was ist Coverage?

Dominik

Ganz anders.

Jochen

Ja, meinst du das Paket oder das Modul?

Jochen

Achso, die Coverage, ja, sozusagen wie viel

Jochen

ja, damit

Jochen

gibt man sozusagen an, wie viel Prozent

Jochen

des

Jochen

Codes durchlaufen wird,

Jochen

den man geschrieben hat, wenn man die Tests

Jochen

also man kann ja halt gucken,

Jochen

das geht natürlich in Python ganz gut,

Jochen

es gibt auch ein Modul-Coverage-PUI,

Jochen

das das macht, das halt guckt, wie viele

Jochen

von den Zeilen wurden denn aufgerufen,

Jochen

wenn ich jetzt die Tests durchlaufen lasse

Jochen

von meinem Gesamtding und das dann halt sozusagen

Jochen

die Coverage ist halt sozusagen die Prozentzahl.

Jochen

Wenn ich halt 70 Prozent habe, dann ist es halt

Jochen

besser, als wenn

Jochen

ich 50 Prozent habe. Wie viel sollte man denn

Jochen

davon haben? Es gibt Leute, die sagen,

Jochen

100 Prozent haben. 150?

Jochen

Weiß ich nicht so genau,

Jochen

ob das ein sinnvolles Ziel ist,

Jochen

weil es dann manche Sachen

Jochen

sind einfach schwer zu testen und

Jochen

irgendwann wird es halt dann

Jochen

sehr aufwendig und also

Jochen

die ersten 80 Prozent sind

Jochen

wie das so immer ist, die gehen relativ

Jochen

einfach und dann die letzten 20 Prozent

Jochen

brauchen dann nochmal 80%

Jochen

der Zeit irgendwie, weil

Jochen

das dann halt alles so fiese Fälle sind, die man nicht gut testen kann.

Jochen

Und dann ist halt die Frage, ist es noch sinnvoll,

Jochen

da so viel Zeit reinzustecken, weil den größten

Jochen

Nutzen hat man dann vielleicht schon gehabt,

Jochen

irgendwie in dem

Jochen

Code, der halt einfach zu testen war.

Jochen

Aber auch da kann man das natürlich

Jochen

vereinfachen, indem man Code so schreibt, dass man ihn einfach

Jochen

testen kann. Also manchmal mache ich Funktionen,

Jochen

schreibe ich Funktionen nur deswegen, um

Jochen

diese Funktionen einzeln

Jochen

testen zu können.

Jochen

Und ja, oder manchmal macht es Sinn, Dinge auf eine bestimmte Art zu strukturieren, sodass man sie halt leichter testen kann, als wenn man jetzt irgendwie alles in einer Funktion hat oder so.

Jochen

Dann ist halt einfach schwer, die zu testen.

Jochen

Ja, und möglichst hohe Coverage ist natürlich gut.

Jochen

Also ich bin jetzt nicht so, ich will jetzt nicht sagen, dass 100% unbedingt notwendig ist, aber viel wäre schon gut.

Jochen

Und dann gibt es natürlich nochmal auch feine Unterschiede, ob man jetzt nur irgendwie durch den Code durchgelaufen ist.

Jochen

hat man aber auch wirklich alle, gibt's

Jochen

für jede unterschiedliche, also

Jochen

wenn man sowas wie

Jochen

Condition, so If-Else

Jochen

Geschichten hat, werden auch wirklich,

Jochen

hat man sichergestellt, dass man alle Branches,

Jochen

die dann passieren können, durchlaufen hat und so.

Jochen

Insofern ist nicht mehr so ganz klar, was

Jochen

gemeint ist, wenn man jetzt Coverage sagt.

Jochen

Und ja, das kann

Jochen

man dann auch nochmal, also

Jochen

ich glaube, die ursprüngliche Geschichte ist nur

Jochen

so, es ist egal, es müssen nicht alle

Jochen

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

Aber ja, genau.

Jochen

Das Test-Coverage ist halt sozusagen ein Maß dafür,

Jochen

wie viel von dem Code, der in deiner Bibliothek ist oder so,

Jochen

wie viel davon ist eigentlich durch Tests überprüft

Jochen

oder ist überhaupt mal ausgeführt worden bei einem Test.

Dominik

Ja, dann haben wir fast ja schon die letzte Frage.

Dominik

Ich glaube, wir sind da schon ziemlich lange wieder heute dabei.

Dominik

Und zwar 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 ich meine, es ist ja die Frage, wann das Sinn

Jochen

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 irgendwas

Jochen

läuft, dann weiß ich ungefähr, wie viel

Jochen

Speicher das verbrauchen sollte. Und wenn das

Jochen

doppelt oder dreimal so viel verbraucht, dann

Jochen

weiß ich, dass ich da ein Problem habe

Jochen

und vielleicht nochmal irgendwas machen muss.

Jochen

Es gibt aber auch systematische

Jochen

Ansätze. Also es gibt zum Beispiel

Jochen

auch eingebauten Profiler

Jochen

in Python.

Jochen

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

Jochen

Genau. Das kann aber

Jochen

mit Memory-Geschichten nicht so viel machen.

Jochen

für Memory-Sachen, glaube ich,

Jochen

da nimmt man dann eher so ein bisschen

Jochen

K-Cache-Grind oder sowas, aber das ist,

Jochen

ich hab das...

Dominik

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

Jochen

oder sowas und... Naja, du kannst dir halt

Jochen

von den Datenstrukturen anzeigen

Jochen

lassen, wie viel Speicher sie verbrauchen.

Jochen

Da hab ich jetzt auch

Jochen

wieder vergessen, das wusste ich. Also, du kannst

Jochen

in dem Pandas DataFrame sagen

Jochen

irgendwie meminfo oder info oder sowas

Jochen

und dann deep gleich true oder sowas.

Jochen

Dann geht das halt, macht das

Jochen

rekursiv geht das durch

Jochen

diesen DataFrame durch und guckt halt, wie viel

Jochen

Hauptspeicher brauchen da all die

Jochen

Dinge, die da drin sind und sagt dir halt am Ende eine Zahl.

Jochen

Und dann weißt du halt, okay, in diesem Ding stecken

Jochen

jetzt so viele Speicher drin.

Jochen

Dein ganzes Jupyter-Notebook,

Jochen

also so kannst du deine einzelnen Datenstrukturen

Jochen

angucken. Bei NumPy-Arrays

Jochen

ist es halt viel einfacher noch. Ich glaube, da gibt es

Jochen

auch eine Funktion, die einem sagt, welche Hauptspeicher

Jochen

irgendwie ein Array verwendet, aber da

Jochen

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

Jochen

von dem Ding und du kannst dir auch angucken

Jochen

mit Shape, wie viel da drin liegt und dann

Jochen

multiplizierst du das einfach mit, wie viel

Jochen

Bit hat halt irgendwie der Typ,

Jochen

den ich da verwende, mal Anzahl Einträge und dann weißt du,

Jochen

wie groß das ist, weil da ist es halt sehr einfach.

Jochen

Also so kann man

Jochen

bei einzelnen Sachen rausfinden, wie viel Hauptspeicher die verbrauchen,

Jochen

weil wie viel das ein Jupyter Notebook

Jochen

insgesamt verbraucht, siehst du halt im Top.

Jochen

Wie viel der Speed?

Jochen

Ja,

Jochen

da brauchst du wahrscheinlich auch,

Jochen

kannst natürlich auch global das

Jochen

bestimmen, indem du halt, also

Jochen

auf der Shell schreibe ich auf Time einfach davor

Jochen

und dann kriege ich halt dann eine Ausgabe,

Jochen

wie viel,

Jochen

wie lange es gedauert hat.

Jochen

Bei Jupyter-Notebook-Zellen, das gibt es auch

Jochen

halt irgendwie so eine Prozent-Time-Magie.

Jochen

Du kannst aber, wenn du jetzt einen Benchmark

Jochen

machen möchtest, dafür ist es natürlich nicht gut, das einmal

Jochen

auszuführen oder zweimal,

Jochen

sondern dann möchte man das halt ein paar Mal ausführen,

Jochen

sodass halt dann auch so Cache-Effekte und so

Jochen

nicht so eine Rolle spielen. Und dann, da gibt es

Jochen

dann halt auch Prozent-Time-It

Jochen

so Magie, wo das dann halt 10.000 Mal

Jochen

ausgeführt wird und dann wird dann halt

Jochen

Durchschnitt berechnet und dann ist es okay, diese Funktion

Jochen

dauert irgendwie üblicherweise

Jochen

1,7 Nanosekunden,

Jochen

äh, Millisekunden, Nanosekunden

Jochen

wäre 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

mal 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 ganz

Jochen

hilfreiche Geschichte und dann, wenn man

Jochen

weiß, wo man Zeit verbringt, dann kann man halt mit

Jochen

TimeIt zum Beispiel in der Notebook-Zelle

Jochen

halt dann irgendwie gucken, ob man das

Jochen

irgendwie optimiert kriegt und dann kann man

Jochen

sozusagen die heißen Funktionen

Jochen

ein bisschen optimieren und dann

Jochen

sollte das schneller werden.

Dominik

Ja, das war die letzte Frage, glaube ich, für heute.

Dominik

Ich glaube, wir sind tatsächlich irgendwie durch.

Dominik

Wir haben viel geredet über Python selbst.

Dominik

Ich hoffe, das fandet ihr wieder interessant.

Dominik

Genau.

Jochen

Ja, haben wir noch irgendwie Pics oder sowas?

Jochen

Pic der Woche?

Jochen

Ja.

Jochen

Bis Monats.

Jochen

Ja.

Jochen

Also ich hätte da noch was.

Dominik

Ja, was ist dein Pic des Monats?

Jochen

Und zwar, ich habe mich letztens wieder damit beschäftigt,

Jochen

einen Rechner neu aufzusetzen

Jochen

und habe dann nochmal so irgendwie angeguckt,

Jochen

wie macht man das eigentlich,

Jochen

vernünftige Python-Entwicklungsumgebung aufsetzen.

Jochen

Dazu gab es einen Artikel von Jacob Kaplan-Moss, glaube ich,

Jochen

einer der Django-Gründer da,

Jochen

hat dazu irgendwie meine

Jochen

Python-Entwicklungsumgebung 2020 Edition

Jochen

oder so einen Artikel geschrieben, da sollte ich mal

Jochen

verlinken. Und da dachte ich so, ah gut,

Jochen

dann gucke ich doch mal, was der so macht und

Jochen

wie ich das so mache.

Jochen

Und das, worauf ich da, eine

Jochen

Geschichte, auf die ich da gestoßen bin, die ich vorher nicht

Jochen

so verwendet habe, weiß gar nicht genau, warum. Ich habe

Jochen

schon davon gehört, mir haben Leute davon erzählt, aber

Jochen

habe es irgendwie nicht benutzt, ist PyEnv.

Jochen

Und

Jochen

das war so eine der Geschichten, die ich,

Jochen

also genau, das wäre jetzt beim Tick, PyEnv.

Jochen

Und das ist eigentlich

Jochen

ziemlich cool, weil

Jochen

das ist halt ein kleines

Jochen

Tool, was einem

Jochen

dabei hilft, Python zu installieren, was

Jochen

überraschend schwer ist. Es sollte eigentlich nicht so schwer sein, 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

Jochen

installiert. Für manche Projekte

Jochen

brauche ich halt Minikonda

Jochen

oder Conda

Jochen

und benutze auch Conda zum

Jochen

installieren von irgendwelchen Abhängigkeiten und so

Jochen

und Paketen. In anderen

Jochen

Webentwicklungsgeschichten wieder Virtual Envs

Jochen

und da auch

Jochen

wieder einen anderen Python-Interpreter,

Jochen

jetzt möglicherweise halt einfach einen, der

Jochen

über Homebrew gekommen ist oder

Jochen

den ich einfach so installiert habe oder sowas.

Jochen

Ja, und

Jochen

ja, also

Jochen

das war immer

Jochen

so ein bisschen doof und mit PyEnv ist das eigentlich

Jochen

relativ einfach. Da sagt man dann halt, okay,

Jochen

ich hätte gern, also

Jochen

der installiert dann halt auch, PyEnv installiert

Jochen

halt auch Minikonda und sowas.

Jochen

Und dann kann man halt sagen,

Jochen

okay, PyEnv install Minikonda

Jochen

latest und dann hat man halt die,

Jochen

muss man nicht mehr sich damit beschäftigen,

Jochen

dieses Shell-Skript,

Jochen

irgendwie Curl in irgendwie Shell-Skript

Jochen

zu pipen und dann Minikonda

Jochen

zu installieren, sondern das passiert alles

Jochen

für einen automatisch.

Jochen

Und man

Jochen

kann halt auch pro Verzeichnis dann definieren,

Jochen

was denn jetzt der Interpreter

Jochen

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

Jochen

eingibt. Da gibt es dann so einen Punkt

Jochen

Python-Version-File und da steht

Jochen

das dann halt einfach drin. Und das kann halt

Jochen

auch ein Name

Jochen

von einem Virtual-Env sein. Dann ist man halt in diesem

Jochen

Virtual-Env.

Jochen

Oder es kann halt der Name sein von einem Conda-Environment.

Jochen

Und das ist halt

Jochen

sehr, sehr cool. Das heißt, ich hatte

Jochen

vorher sonst immer

Jochen

Virtual-Env-Wrapper verwendet und dann

Jochen

immer so Post-Activate-Skripten

Jochen

einmal

Jochen

dann halt

Jochen

ich überlege gerade, ob das nicht ein anderes Thema ist,

Jochen

aber nee,

Jochen

ins Verzeichnis gewechselt und dann noch so Dinge

Jochen

gemacht und so und das geht eigentlich

Jochen

quasi mittlerweile 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

Jochen

hilfreichen Tools da verwenden kann.

Jochen

Vielleicht packe ich das irgendwo auf GitHub

Jochen

in Gist oder so.

Jochen

Vielleicht haben andere Leute ja auch noch Ideen, was man da an tollen

Jochen

Dingen machen kann. Und vor allen Dingen, manche Sachen

Jochen

funktionieren auch nicht so ganz sauber. Also von

Jochen

irgendwie Virtual-Env nach Conda

Jochen

wechseln, das geht irgendwie, aber umgekehrt geht irgendwie nicht

Jochen

oder so. Weiß nicht genau, warum.

Jochen

Ja,

Jochen

und vielleicht wäre das mal eine sinnvolle

Jochen

Geschichte, das mal zusammenzutragen. Was muss man eigentlich

Jochen

machen, um halt eine ordentliche Partner-Entwicklungsumgebung

Jochen

irgendwie aufzusetzen?

Dominik

Ja, das klingt auf jeden Fall nach einer guten Sache.

Dominik

Genau.

Jochen

Ja, und genau,

Jochen

Pines fand ich jetzt sehr, sehr

Jochen

überzeugend eigentlich und

Jochen

bin ich eigentlich

Jochen

dachte ich mir, warum finde 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 Turtle.

Dominik

Diese kleine Bibliothek, mit der man

Dominik

kleine Sachen zeichnen kann auf einer Kenner.

Dominik

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

Dominik

sehr lustige Sachen machen, zum Beispiel Kunst.

Dominik

Man kann sich Algorithmen in die Mandelbrotmengen

Dominik

berechnen lassen, Funktionen, und der

Dominik

zeichnet dann ganz tolle, witzige

Dominik

Bilder, mit denen man Computerkunst macht.

Dominik

Also unabhängig davon, dass man

Dominik

jetzt 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 nochmal

Dominik

picken. Ja, cool,

Dominik

cool, cool. Ja,

Dominik

vielen Dank fürs Zuhören. Egal wann

Dominik

ihr hört, 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.

Dominik

Tschüss.

Dominik

Tschüss.

Dominik

Untertitelung des ZDF, 2020

Dominik

Auf Takt

Dominik

Im Takt

Dominik

Im Für-Takt

Dominik

Soll es klingen

Dominik

Drei Klangs-Dimensionen

Dominik

So taktvoll

Dominik

Lichtspiel, Impressionen, Gefahr, Farbton, Halbton und Synchron

Dominik

Dazu schwingen, Dreiklangs, Dimensionen, Kontaktvoll

Dominik

Lichtspiel, Impressionen, so fassbar

Dominik

Wohlklang, Illusionen, die um uns herum tanzen.

Dominik

Dreiklangs, Dimensionen, so taktvoll.

Dominik

Lichtspiel, Impressionen, so farbvoll.

Dominik

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

Dominik

Drei Klangsdimensionen, so taktvoll, Lichtspiel, Impressionen, so fachvoll.

Dominik

Bis zum nächsten Mal.

Dominik

Untertitelung des ZDF, 2020

Dominik

Ausklang

Dominik

Abgang

Dominik

Sequenz

Dominik

Drei Klangsdimensionen, so taktvoll Lichtspiel, Impressionen, so farbvoll

Dominik

Drei Klangsdimensionen, so taktvoll

Dominik

Lichtspiel, Impressionen, so farbvoll

Dominik

Dreiklangs, Dimensionen, so taktvoll

Dominik

Lichtspiel, Impressionen, so farbvoll

Dominik

Dreiklangs, Dimensionen, so taktvoll

Dominik

Lichtspiel, Impressionen, so farbvoll

Dominik

Dreiklangs, Dimensionen, so taktvoll

Dominik

Lichtspiel, Impressionen, so farbvoll

Dominik

Dreiklangs, Dimensionen, so taktvoll

Dominik

Untertitelung des ZDF für funk, 2017