Transcript: Das Python Importsystem

· Back to episode

Full episode transcript. Timestamps refer to the audio playback.

Dominik

Ja, hallo liebe Hörerinnen und Hörer. Willkommen beim Python-Podcast in der Episode Nummer 33.

Dominik

Die hatten wir letztes Mal ausweisend ausgelassen.

Dominik

Deswegen müssen wir die Episodenummer jetzt ergänzen.

Dominik

Ja, was machen wir heute? Wir wollen heute über Imports reden.

Dominik

Hi Jochen.

Dominik

Ja, hallo. Willkommen Dominik.

Dominik

Hi Johannes.

Dominik

Ja, hallo. Ich bin auch mal wieder da.

Dominik

Ja, wir kennen uns ja alle schon.

Dominik

Ja, also über das Python-Import-System wollen wir heute sprechen.

Dominik

Vielleicht ein paar kleine News vorweg, wie wir das gerne tun.

Dominik

Und dann gehen wir so ein bisschen in die Details.

Dominik

Habt ihr News mitgebracht?

Johannes

Ja, also die einzigen News, die ich habe, ist, dass Apple sich gerade den größten PR-Unfug aller Zeiten einholt. Aber da ich kein Apple-Gerät habe, geht es so ein kleines bisschen mehr vorbei.

Johannes

Ja, das Problem habe ich auch nicht.

Johannes

Jochen, erzähl du doch mal, wie fühlt sich das für dich an?

Jochen

Ja, nee, tatsächlich ist es PR-technisch, würde ich sagen, auch aus meiner Perspektive ein großer Unfall. Wenn man sich jetzt anguckt, was sie technisch tun, ist es nicht so furchtbar schlimm.

Dominik

Was ist denn überhaupt passiert? Vielleicht erstmal so die Story.

Dominik

War das eine Pressemeldung?

Johannes

Es war eine Pressemeldung und es war eine technische

Johannes

Meldung, glaube ich, dass sie jetzt

Johannes

CSAM angemacht haben,

Johannes

Content Scanning.

Johannes

keine Ahnung, was das bedeutet.

Johannes

Ja, jedenfalls wollen sie,

Johannes

jedenfalls will Apple jetzt in die Fotos reingucken

Johannes

und verbotene

Johannes

Inhalte finden.

Johannes

Ja, das ist natürlich so ein bisschen,

Johannes

das, ja. Mit modernster Technologie.

Jochen

Ja, zum Glück

Jochen

ist es nicht das

Jochen

schlimme Technologie, was

Jochen

man halt auch nehmen könnte, aber

Jochen

es ist halt irgendwas total Billiges, einfach nur

Jochen

Hashes in Bildern angucken. Also im Grunde nur gucken,

Jochen

ist das ein Bild, das auf

Jochen

irgendeiner Liste draufsteht von verbotenen

Jochen

Bildern. Ja, aber haben die nicht auch gesagt,

Jochen

dass sie so neuronale Netze

Johannes

drüberlaufen lassen und dann Sachen erkennen wollen?

Johannes

Oder ist das erst der

Johannes

nächste Schritt? Ja, genau, das ist

Johannes

halt der Agau-Teil.

Johannes

Und das ist auch so ein bisschen der Präzedenzfall.

Johannes

Früher war Apple ja immer so,

Johannes

ja, es ist auf deinem Gerät und es ist alles sicher

Johannes

und wir können da gar nicht.

Johannes

Und jetzt ist es so, ja, wir gucken doch mal rein.

Jochen

Ja, also entweder war es ein Unfall,

Jochen

sozusagen, dass jemand nicht drüber nachgedacht hat,

Jochen

dass wenn man das so sagt,

Jochen

dass das dann genau das auslöst bei den Leuten.

Jochen

Oder es ist halt irgendwie,

Jochen

aber das kann ich mir auch nicht vorstellen,

Jochen

weil das wäre ja so ein abrupter Strategiewechsel.

Jochen

Das wäre auch schon irgendwie komisch.

Jochen

Also insofern nehme ich mal an,

Jochen

dass es eher ein PR-Unfall ist.

Jochen

Aber man weiß es nicht.

Jochen

Aber es ist ein Präzedenzfall,

Johannes

dass Apple scannt jetzt Inhalte auf euren Geräten.

Dominik

Vielleicht ist das die Vorbereitung dafür, dass sie auch in China den Markt

Jochen

weiter öffnen wollen. Das machen sie ja auch

Jochen

sowieso schon immer. Also man kann ja auch in der

Jochen

Fotos-App irgendwie nach, weiß ich nicht,

Jochen

Hund gucken oder nach Personen oder sonst irgendwas.

Jochen

Und da ist tatsächlich, das ist halt

Jochen

die gute Technik sozusagen, die da

Jochen

verwendet wird und

Jochen

man kann sogar... Aber auch da sind viele

Jochen

Sachen falsch einsortiert. Ja, aber

Jochen

sie sind da auch halbwegs schnell und so. Man kann

Jochen

auch nach Vaccination oder so suchen und dann

Jochen

findet es den Impfpass, wenn man den fotografiert hat und so.

Jochen

Also das ist tatsächlich, also da machen

Jochen

sie auch wirklich das gute Zeug.

Jochen

und machen das halt auf dem Gerät selber.

Jochen

Aber genau, nur halt, wenn man selber sagt, man hätte das gern

Jochen

und halt, es wird auch nicht an irgendwen geschickt.

Jochen

Und jetzt ist das natürlich eine andere Sache,

Jochen

wenn es jetzt eines von den verbotenen Bildern findet,

Jochen

dann sagt es irgendwie dem Pets, dass das ...

Jochen

Das sind die leicht verbotenen Bilder?

Jochen

Ja, wer weiß.

Jochen

Mit den False Positives?

Jochen

Genau, und wir wissen auch, dass es da welche gibt, ja.

Jochen

Also das ist natürlich alles sehr unangenehm

Jochen

und das wäre dann schon ein Präsenzfall,

Jochen

weil das haben sie bisher nicht gemacht, ja.

Jochen

Na gut, mal sehen, wie sich das entwickelt.

Jochen

PR-mäßig ist es auf jeden Fall

Jochen

ein mittleres Desaster. Du hast das von deinem Impfpass gesagt,

Dominik

das heißt, du bist auch jetzt durch, endlich, vielleicht.

Dominik

Ich bin schon lange durch.

Dominik

Ich auch jetzt seit einer Woche, yay!

Johannes

Also hier auch nochmal der Aufruf von

Johannes

allen Zuhörern, lasst euch bitte impfen.

Johannes

Ja, das ist eine gute Idee. Wie viele haben wir jetzt verloren?

Johannes

Ach, egal.

Dominik

Die Zuhörer will ich machen. Es gab so einen tollen

Dominik

Rant-Post von

Dominik

Linus Torweister, glaube ich auch.

Johannes

Ja, der sagt auch, lasst euch impfen, ihr Trottel.

Johannes

Ja, genau.

Johannes

Ja, Linus Torvalds benutzt noch mehr

Johannes

ausgewählte Wörter, um das

Johannes

zu beschreiben, sagen wir es mal so.

Johannes

Ja, aber inhaltlich doch.

Johannes

Inhaltlich war es die Zusammenfassung, ja.

Johannes

Ja, haben wir noch Python-News?

Jochen

Ja, also eine News,

Jochen

die so ein bisschen anschließt an

Jochen

unsere letzte Episode zu Packaging,

Jochen

ist, dass tatsächlich, das

Jochen

war sich vielleicht schon länger klar, aber mir war es halt noch nicht

Jochen

klar, ab Python 3.11

Jochen

wird

Jochen

Distutils halt deprecated.

Jochen

Und

Jochen

das heißt, man muss sich da an der Stelle dann halt mal

Jochen

was überlegen, was man dann so tut.

Johannes

Aber es gibt doch so viele Alternativen.

Johannes

Ja.

Johannes

Diverse Alternativen.

Jochen

Also die Pakete, die jetzt halt so

Jochen

ein richtiges Problemchen bekommen,

Jochen

sind halt sowas wie

Jochen

NumPy und SciPy und so,

Jochen

weil die haben nämlich, die erben

Jochen

nämlich von Distutils und haben da Extensions

Jochen

für gebaut und damit bauen sie halt alles.

Jochen

Ja, okay.

Jochen

Und ja,

Jochen

also die gucken sich gerade andere Sachen an

Jochen

und

Jochen

tatsächlich gibt es da, also haben sie sich zum Beispiel

Jochen

C-Mac angeguckt oder halt auch

Jochen

Mason, heißt das irgendwie.

Jochen

Und tatsächlich,

Jochen

also ich manchmal, also sogar relativ

Jochen

häufig, ich habe ja hier so ein M1-Mac

Jochen

auch und da passiert

Jochen

das durchaus, also wenn die Python-Version hochgeht oder so,

Jochen

ist es eigentlich immer so, dass wenn ich dann

Jochen

Projekte habe, die

Jochen

abhängig haben zu NumPy,

Jochen

oder so, dass das Ganze zwar kopiert werden muss,

Jochen

weil meistens ist das Update von Python halt schneller bei mir,

Jochen

als die Wheels draußen sind.

Jochen

Und dann muss ich das halt kompilieren

Jochen

und dann denke ich mir so, oh nein,

Jochen

ah, jetzt dauert das wieder ein paar Minuten.

Jochen

Und tatsächlich dauert das bei NumPy, glaube ich,

Jochen

sieben Minuten irgendwie mit dem klassischen jetzt des Tutels.

Jochen

Und tatsächlich aber auf Mason basierten,

Jochen

hat hier jemand schon den Namen vergessen,

Jochen

angefangen damit rumzuexperimentieren,

Jochen

dauert es halt irgendwie noch vier Sekunden oder so.

Jochen

Also es ist hauptsächlich irgendwie Bauzeit.

Jochen

die da

Jochen

benötigt wird.

Jochen

Also insofern, mal gucken.

Jochen

Könnte sein, dass es alles schneller wird demnächst.

Jochen

Das wäre auch ein sehr positiver

Jochen

Effekt von dieser Deplication.

Jochen

Genau. Und ansonsten,

Jochen

ja, ich glaube, 3.11

Jochen

ist in der Beta.

Jochen

3.10 ist in der Beta.

Jochen

Ich glaube, jetzt um den Dreh

Jochen

ein Richtkandidat oder was.

Jochen

Die Zahlen, die gehen so schnell hoch.

Jochen

Ja, ja. Freuen wir uns schon.

Jochen

Also ich habe mal den GitHub

Dominik

Copilot, den wir auch schon mal kurz erwähnt hatten,

Dominik

ausprobiert. Da habe ich jetzt auch eine Beta-Einladung

Dominik

bekommen. Ich muss sagen, das ist echt

Dominik

toll. Also ich habe noch nie so einen

Dominik

super Effekt von einer KI erlebt.

Dominik

Ich finde es echt nice. Ich gebe ein,

Dominik

also ich habe jetzt die VS Code Extension dafür benutzt.

Dominik

Sowas wie Define and Fibonacci

Dominik

oder sowas. Und dann

Dominik

warte ich auf das Autocompletion und dann schreibt

Dominik

mir die komplette Funktion inklusive Docstrings und Type

Dominik

Annotations als TypeHint und ich drücke

Dominik

einmal Tabulator und es ist fertig.

Dominik

Und das geht halt auch für Sachen, die ich selber schreibe.

Dominik

Wenn ich jetzt eine Klasse schreibe, verschiedene Methoden nehme,

Dominik

beispielsweise irgendwie HTTP-Methode.

Dominik

Ich habe jetzt irgendwie ein Get geschrieben,

Dominik

irgendeine Klasse, Define, Get, bla bla bla.

Dominik

Und danach fange ich an mit Define.

Dominik

Und dann schlägt er mir als nächstes vor, Post zu definieren.

Dominik

Und zwar auch mit genau den richtigen

Dominik

Parametern und so. Das sind solche Sachen, das ist halt einfach,

Dominik

der lernt halt aus seinem eigenen Code raus und das ist

Dominik

wow. Also ich bin wirklich beeindruckt

Dominik

davon, was das so macht. Also das ist so ein bisschen,

Dominik

man braucht keine Snippets mehr, ja,

Dominik

wenn man irgendwie Snippets-Sammlung hat, sondern man nimmt halt einfach

Dominik

dann das individualisierte Snippet

Dominik

und das ist echt mächtig, glaube ich.

Dominik

Also mir hat das schon echt Zeit gespart zwischendurch.

Jochen

Ich weiß gar nicht genau, auf welchem Modell ist das?

Jochen

GPT-3?

Jochen

Ja, das ist ein GPT-3.

Jochen

Ja, also da geht einiges.

Jochen

Also ich meine, das ist vielleicht auch noch ganz interessant.

Jochen

Das ist so ein kleiner Abschweif,

Jochen

aber vielleicht auch nicht so uninteressant.

Jochen

Ich meine, Text ist ja im Grunde deutlich...

Jochen

Also dachte man ja immer,

Jochen

Sprache ist halt schwierig,

Jochen

aber tatsächlich ist das irgendwie einfacher als andere Probleme.

Jochen

Und wisst ihr, wie diese Modelle trainiert werden?

Jochen

Nein.

Jochen

Das ist halt etwas, was sich allmählich einbürgert.

Jochen

Der Begriff dafür nennt sich Self-Supervised Learning.

Jochen

Und zwar deswegen, weil man halt zum Beispiel auf Text relativ gut Modelle trainieren kann,

Jochen

ohne irgendwelche gelabelten Daten zu haben zu müssen.

Jochen

Was man ja normalerweise ist immer das Problem bei,

Jochen

wenn man so überwachte Modelle, also anführungsweise normale Machine Learning Modelle trainiert,

Jochen

dann braucht man halt Trainingsdaten.

Jochen

Und damit meint man üblicherweise halt Daten,

Jochen

wo man Labels

Jochen

angeschrieben hat, wie zum Beispiel jetzt, wenn man

Jochen

Bilder hat, so was ist ein Hund, das ist eine Katze

Jochen

und das ist, weiß ich nicht, irgendwas

Jochen

dazwischen oder so.

Jochen

Und bei Texten

Jochen

hat man das ja auch, da gibt es dann

Jochen

ein klassisches Problem wie Textkategorisierung.

Jochen

Da hast du halt einen Text und dann steht da zum Beispiel so diese

Jochen

Newsreuters-Artikel und da steht dran, das ist jetzt Sport

Jochen

oder das ist Politik oder das ist halt irgendwas anderes.

Jochen

Cool wäre ja so das Label wie

Jochen

will ich lesen, will ich nicht lesen?

Jochen

kann man auch alles machen. Spezifisch für dich, Dominik.

Jochen

Wenn du da Trainingsdaten hast, dann kannst du

Jochen

Modelle drauf trainieren, die dann auch wahrscheinlich halbwegs gut

Jochen

funktionieren sollten. Also das geht alles.

Jochen

Aber das Problem ist natürlich, dass

Jochen

für die meisten Probleme, die man so hat, hat man halt

Jochen

eben keine Trainingsdaten. Und das Erstellen von

Jochen

Trainingsdaten ist halt so aufwendig, dass sich das

Jochen

dann meistens nicht lohnt, das zu machen. Wie viel braucht man

Jochen

denn da? Ungefähr 100.000?

Jochen

Also kommt drauf an, wie gut es sein soll.

Jochen

Und dann entsprechend

Jochen

halt unter Umständen schon Millionen von Beispielen

Jochen

oder so. Und das ist dann halt doof, weil das ist einfach zu viel.

Dominik

Die meisten Leute haben so viele Beispiele gar nicht, ja.

Jochen

Ne, genau. Also einmal, du hast gar nicht genug

Jochen

Beispiele, um sie labeln zu können, dann musst du die erstmal besorgen,

Jochen

dann musst du es auch noch irgendwie labeln, dann hast du

Jochen

Fehler in den Labels, weil halt die Leute das

Jochen

nicht perfekt gemacht haben und dann musst du das irgendwie

Jochen

kontrollieren und dann schwuppdiwupp

Jochen

hast du irgendwie so ein Redaktionssystem und

Jochen

eine Technische Redaktion und

Jochen

dann Prozesse und keine Ahnung und

Jochen

Abstimmungen und das kostet ein Schweinegeld und

Jochen

das macht dann halt keiner so einfach so.

Jochen

Sondern nur, wenn man es halt wirklich, wirklich braucht.

Jochen

ja, aber man kann

Jochen

halt aus Text auch lernen,

Jochen

ohne diese ganzen Geschichten

Jochen

haben zu müssen. Also es gab

Jochen

ein Paper 2017, ist das glaube ich

Jochen

irgendwie, Attention is all you need, da

Jochen

wurde halt diese Transformer-Architektur

Jochen

eingeführt und

Jochen

diese

Jochen

Dinge funktionieren auf Sprache halt total super

Jochen

und die

Jochen

funktionieren so, dass man

Jochen

quasi Texte nimmt und lässt

Jochen

halt jetzt Wörter weg

Jochen

aus den Texten und lässt das Modell

Jochen

jetzt vorhersagen, okay, welches Wort gehört denn an die Stelle

Jochen

und

Jochen

dann

Jochen

bestraft man das, dann hat man halt

Jochen

Feedback, wenn das Modell jetzt ein anderes Wort

Jochen

als da stand vorher sagt, dann sagt man

Jochen

okay, das war jetzt falsch und dann kann man

Jochen

halt irgendwie ein Gradient

Jochen

bestimmen, in welche Richtung müssen sich die Gewichte ändern

Jochen

von dem Modell und dann

Jochen

propagiert man die halt zurück und dann

Jochen

ändert man das Modell ein bisschen in die Richtung,

Jochen

dass es das halt beim nächsten Mal besser macht.

Jochen

Und das macht man dann ganz oft und dann

Jochen

kann es halt aus einem

Jochen

Text, ohne dass man da irgendwelche Labels explizit

Jochen

für bräuchte oder so, Dinge lernen

Jochen

und zwar fast alles und das ist halt das Interessante.

Jochen

Das ist wirklich cool.

Jochen

Man kann das gesamte Internet nehmen und

Jochen

dann lernt das halt lustigerweise

Jochen

eben nicht nur irgendwie so

Jochen

stumpf, welches Wort

Jochen

die höchste Wahrscheinlichkeit hat, da zu stehen,

Jochen

sondern um das gut machen zu können,

Jochen

lernt das halt auch eine ganze Menge Konzepte

Jochen

und wie Dinge in Verhältnissen stehen und

Jochen

solche Sachen. Auch Kontext tatsächlich, das ist halt spannend.

Dominik

Also zum Beispiel, das Plugin

Dominik

schafft das halt auch, Kommentare

Dominik

richtig zu schreiben. Das heißt, ich fange mit einem Kommentar

Dominik

an, zwei Worte, und das macht einen relativ guten

Dominik

Vorschlag für, was da stehen sollte.

Dominik

Ja, genau.

Jochen

Das ist eine

Jochen

Geschichte, die man halt auch machen kann, dass man sagt, okay,

Jochen

das ist ein Text, der Rest ist halt Lücke, dann

Jochen

füll mal. Und dann kommen da auch

Jochen

schon ganz interessante Geschichten bei raus.

Jochen

Also wenn man sich diese generierten Texte

Jochen

anguckt, dann ist halt schon immer so, dass man

Jochen

irgendwann wird so leicht absurd oder

Jochen

sehr verdreht irgendwie und merkt

Jochen

so, okay, so ganz, schon so ein bisschen

Jochen

neben der Spur. Ja, man kann es halt schnell kaputt machen.

Jochen

Die meandern auch so ein bisschen, oder?

Jochen

Wenn man halt so ein bisschen Gedächtnis so ein richtiges...

Dominik

Kann man es sehr schnell kaputt machen, dann kann es immer so...

Johannes

Ja, ich habe noch was dazu gelesen, was in eine andere Richtung geht.

Johannes

Dass es jetzt wohl eine große Anzahl inzwischen von wissenschaftlichen Veröffentlichungen gibt,

Johannes

denen man durch Analyse ansehen kann, dass eben nicht von einem Menschen geschrieben wurden,

Johannes

sondern von einem neuronalen Netzwerk.

Johannes

Und die Technik, die die da verwendet haben, die ist total witzig,

Johannes

Weil diese Netzwerke für so Paper-Generierung und für Text-Generierung generell, die sind, die werden wohl bestraft, wenn sie Plagiate erzeugen.

Johannes

Weil das willst du natürlich nicht.

Johannes

Du willst natürlich nicht ein Paper einreichen, was dann als Plagiate abrechtet.

Johannes

Und deshalb wählen die sehr viele Synonyme.

Johannes

Die sprechen sehr viel in Synonymen.

Johannes

Und auch eben so Fachbegriffe werden dann oft in Synonymen genommen.

Johannes

Das nette Beispiel, was ich erkenne, war eben, dass da die Paper über Big Data, die haben die ganze Zeit über Colossal Information gesprochen.

Johannes

was eben kein normaler Mensch

Johannes

schreiben würde und dann haben sie eben gesucht, wie oft

Johannes

dieses, dieser Begriff

Johannes

Colossal Information in Papern

Johannes

vorkommt und die dann eben genauer

Johannes

angesehen und die waren alle, hatten eben

Johannes

alle diese Anzeichen von erzeugten Papern

Johannes

und das ist so ein bisschen jetzt quasi

Johannes

die Kehrseite von Co-Pilot, dass die eben nicht

Johannes

nur, man muss es dann trotzdem noch für was

Johannes

Gutes einsetzen und nicht für

Johannes

Ja, da bist du ja schon

Johannes

positiv beizuschreiben.

Johannes

Ja, aber

Jochen

genau, was ich noch

Jochen

erwähnen wollte, war, genau, man kann

Jochen

jetzt halt sozusagen Modelle trainieren auf

Jochen

allen Texten, die es im Internet gibt und die lernen

Jochen

halt tatsächlich da auch Dinge dann raus

Jochen

und das ist natürlich total super und das geht bei Sprache

Jochen

vor allen Dingen deswegen, weil

Jochen

man halt eine endliche Anzahl

Jochen

von möglichen

Jochen

Füllern sozusagen für die Lücken hat.

Johannes

Was? Noam Chomsky würde dir widersprechen, Jochen.

Jochen

Jaja, gut, aber man kann

Jochen

sich da ja beschränken, kann ja sagen, okay, meine Sprache

Jochen

hat nur 20.000, 30.000

Jochen

Vokabeln

Jochen

und das war's. So größer ist

Jochen

mein Vocabulary einfach nicht.

Johannes

Wenn du immer nur ein Wort rausnimmst, ist natürlich klar.

Jochen

Und unter denen wird auch eins sein, das hinreichend

Jochen

nah dran ist. Und dann kannst du eben

Jochen

allen Worten eine Wahrscheinlichkeit zuweisen.

Jochen

Du kannst halt sagen, okay,

Jochen

das ist jetzt sehr, sehr unwahrscheinlich und das ist jetzt irgendwie,

Jochen

dass das geht.

Jochen

Es gibt ein bestimmtes Wort wie F,

Dominik

das fast überall hinpasst.

Dominik

Ja, klar.

Jochen

Aber das Modell ist dann halt auch,

Jochen

das Modell, das damit trainiert wird, passt dann aber nicht mehr

Jochen

überall hin, wenn du das als akzeptiert

Jochen

findest, dass das

Jochen

funktioniert.

Jochen

Jedenfalls, genau.

Jochen

Mit Sprache geht das total super.

Jochen

Und eben, Co-Pilot ist

Jochen

halt dann quasi auch eine Folge.

Jochen

Das Tolle ist, dass man jetzt Modelle,

Jochen

die da drauf trainiert sind, kann man jetzt mit

Jochen

ganz wenig Trainingsbeispielen auf das

Jochen

Problem sozusagen,

Jochen

das man wirklich hat, adaptieren.

Jochen

Also da braucht man dann nur noch ein paar

Jochen

Trainingsbeispiele, also nicht mehr viele.

Dominik

Ich glaube auch, er macht das tatsächlich anhand

Dominik

des Reposits, was du gerade aufhast.

Dominik

Kann er schon gucken und kann da schon dann die Completion

Dominik

zum Beispiel oder die Vorschläge anpassen

Dominik

auf das, was du da gerade machen willst. Und das ist schon echt

Jochen

wow. Naja, und das ist halt natürlich total

Jochen

toll, weil das dann

Jochen

halt bedeutet, dass du im Grunde dieses

Jochen

Trainingsproblem, Trainingsdatenproblem

Jochen

los wirst.

Jochen

Und ja, eine ganze

Jochen

Menge Anwendungsfälle plötzlich von

Jochen

ist zu aufwendig, unlösbar,

Jochen

lohnt sich nicht, in Richtung

Jochen

kann man schon mal probieren, wandern

Jochen

und dann ist es natürlich toll.

Jochen

Also da wird es hier eine Menge interessante

Jochen

Anwendungen geben. Also gerade für die ganzen

Dominik

FAUM-Programmierer unter uns, also das ganze Zeug

Dominik

drumherum, das geht halt einfach jetzt viel automatisierter.

Dominik

Hatte ich schon gesagt, muss man immer noch selber machen.

Dominik

Ja, ich bin dagegen, das ist schlecht für die

Dominik

Auftragsprogrammierer.

Dominik

Finde ich nicht gut. Ja, das kann schon

Dominik

sein. Ja.

Dominik

Aber

Jochen

genau, das Problem ist aber

Jochen

jetzt, dass man das nicht machen kann

Jochen

für, also was halt, also man würde,

Jochen

wäre sehr viel weiter, wenn man das

Jochen

jetzt auch für zum Beispiel Bilddaten machen könnte.

Jochen

Also und tatsächlich ist

Jochen

es wohl so, dass es da

Jochen

gibt es auch inzwischen Forschung zu, das ist halt

Jochen

tatsächlich der Weg, also man hat sich ja das oft lange

Jochen

oder ich erinnere mich noch dran, dass es mal völlig

Jochen

unklar war, wie das eigentlich funktioniert.

Jochen

Wie lernen Kinder eigentlich

Jochen

sozusagen

Jochen

so schnell Dinge,

Jochen

man versteht es nicht, sie sehen eigentlich

Jochen

zu wenig Trainingsbeispiele für das, was sie da

Jochen

lernen. Und

Jochen

tatsächlich lernen sie ja auch

Jochen

sowas, was einem die Forschung

Jochen

sagt, manchmal Schwierigkeiten hat,

Jochen

das einfach so zu akzeptieren. Aber

Jochen

die sagt halt, ja, also das meiste, was

Jochen

Menschen so lernen, lernen sie halt so in den ersten

Jochen

neun Monaten. Und alles, was danach kommt, ist halt so,

Jochen

naja, Gott, also ich meine so Details.

Jochen

Also die wesentlichen Dinge

Jochen

sind bis dahin gelernt. Dann fragt man sich, wie machen

Jochen

die das denn? Ich meine, Kinder in dem Alter verstehen

Jochen

einfach gar nichts. Die

Jochen

kennen auch keine Worte für nichts. Wieso können die denn

Jochen

so viel lernen? Wie soll das gehen? Das ist

Jochen

irgendwie alles seltsam. Und

Jochen

tatsächlich ist es wohl so, dass die halt auch

Jochen

so eine Art self-supervised learning

Jochen

machen und quasi genau

Jochen

das gleiche Prinzip irgendwie,

Jochen

also sie sehen halt was

Jochen

und Dinge passieren und dann

Jochen

betrachten sie das sozusagen als eine Art

Jochen

Lückentext und füllen das dann halt und das funktioniert.

Jochen

Genau, das ist das Ego, was das dann macht.

Jochen

Naja, keine Ahnung. Ja, aber das zieht

Dominik

das dann irgendwo aus dem Äther, irgendwelche Formationen

Dominik

schafft das dann dazwischen und deswegen hast du ja auch so,

Dominik

weiß nicht, ob ihr das kennt, wenn ihr irgendwo

Dominik

müde seid oder sowas, dann werden bestimmte Sachen ja auch

Dominik

einfach ersetzt. Der Kopf macht das ja sehr gerne,

Dominik

dass er bestimmte Flecken, die nicht so

Dominik

ganz klar sind, dann mit Sachen überschreibt.

Dominik

Einige Leute, die haben dann auch

Dominik

innere Stimme, die dann auf einmal selbst vervollständigt, die

Dominik

nur so halb gehört haben. Das kannst du auch

Dominik

mit optischen Informationen machen oder mit

Dominik

anderen optischen Signalen.

Dominik

Und das ist halt super spannend tatsächlich. Und wenn das

Dominik

halt Self-Supervised Learning ist, dann ist ja auch

Dominik

klar, dann hast du so ein Lückenbild. Das ist

Dominik

so ein bisschen so, du hast ein Foto, da fehlt

Dominik

ein Teil und dann wird das automatisch ersetzt.

Dominik

Das ist spannend. Wenn die KI das kann, dann kann man quasi

Dominik

machst du ein Hochzeitsbild von dir, dann kannst du irgendwie deinen Partner

Dominik

rausschneiden, dann kannst du den idealen Partner auf einmal sehen.

Dominik

Ah ja, und

Johannes

so ist also dieses Python-Import-System

Johannes

entstanden.

Johannes

Das ist ja spannend.

Johannes

Willst du jetzt zum Topic zurück?

Jochen

Nein, nein. Nur ganz kurz, also das, was halt

Jochen

momentan nicht geht, was man nicht hinkriegt,

Jochen

was halt total toll wäre, wenn man es irgendwie hinkriegen würde,

Jochen

also vielleicht hat ja irgendjemand eine Idee,

Jochen

das große ungelöste Problem an der Stelle ist halt,

Jochen

wenn du jetzt ein Bild aus einem,

Jochen

ein Teil aus einem Bild rausnimmst und sagst so,

Jochen

das ist jetzt leer. Also einmal

Jochen

man kann halt irgendwie die

Jochen

Menge an Bildern, die halt an der Stelle möglich wären,

Jochen

nicht aufzählen, nicht so richtig.

Jochen

Und dann ist es so,

Jochen

selbst wenn man sich irgendwie beschränkt,

Jochen

weiß man nicht, so jetzt hat man

Jochen

zwei Sachen, die eigentlich offensichtlich nichts damit zu tun haben

Jochen

mit dem Bild, das man eigentlich an der

Jochen

Stelle gerne hätte. Welche Wahrscheinlichkeit weist man

Jochen

hinzu und wie ist der Gradient in welche Richtung?

Dominik

Aber vielleicht braucht man da den Kontext für, weil wenn du einen Kontext

Dominik

hast, in dem das drumherum gestellt werden soll,

Dominik

der halt selber ein Objekt ist,

Dominik

das viele verschiedene Informationen beinhaltet,

Dominik

dann ist es besser, diese Menge an abzählbaren Elementen zu bilden

Dominik

und das entsprechend herauszusuchen mit der höchsten Wahrscheinlichkeit.

Dominik

Das heißt also, ohne Kontext ist das wahrscheinlich nicht so einfach möglich,

Dominik

dass du einfach so ein Bild machst, das dann gut trifft.

Dominik

Aber wenn du Informationen über den Kontext hast,

Dominik

in dem du dieses Bild ersetzen möchtest.

Jochen

Also der Punkt ist eher, das ist ja möglich.

Jochen

Also du kannst ja durchaus ein Modell trainieren,

Jochen

was dann irgendwas vorhersagt an der Stelle.

Jochen

Die Frage ist nur, welchen Wert hat das, was es jetzt vorhergesagt hat?

Jochen

Da hat das jetzt die Wahrscheinlichkeit 0,376

Jochen

oder 0,652.

Jochen

Und das macht ja einen Unterschied fürs Training.

Jochen

Aber es ist halt völlig unklar, wie man das,

Jochen

wie man da die Wahrscheinlichkeit

Jochen

ausrechnen soll.

Jochen

Ja, vielleicht braucht man dafür echt einen Kontext,

Dominik

der das eingesetzt werden soll. Das glaube ich gar nicht so.

Jochen

Ja, also das ist auf jeden Fall, wenn da jemand eine Idee hat,

Jochen

voll gut.

Dominik

Aber das war jetzt auch gerade wieder so ein Ding,

Dominik

was halt passiert, wenn man halt den Kontext nicht hat,

Dominik

dann passiert sowas wie ein Relative Import Beyond Top Level Package

Dominik

oder so.

Johannes

Oh, das war so ein Syntaxfehler quasi.

Jochen

Ich sehe schon, es gibt eine gewisse Abschüssigkeit in eine bestimmte Richtung.

Jochen

Ja, Importsystem ist auch voll interessant.

Jochen

Na gut.

Dominik

Ja, Entschuldigung, es war gerade ein Versuch, da so ein bisschen hinzukommen,

Dominik

weil wir wollten ja über das Importsystem tatsächlich reden

Dominik

und wie man das in Python macht.

Dominik

Und ich glaube, als Basis irgendwie das so ein bisschen zu verstehen.

Dominik

Es gibt einen super tollen Blog, den ich auch erst letztens entdeckt habe,

Dominik

der 10.000 Meters heißt, der irgendwie auf Hacker News nochmal gefeatured worden ist.

Dominik

Und da hat ein Mensch namens Viktor Skvorstov, wenn ich ihn richtig ausspreche,

Dominik

einen Artikel geschrieben, wie das

Dominik

Preis- und Importsystem funktioniert.

Dominik

Und das hat er so ein bisschen erklärt.

Dominik

Das ist sehr spannend zu lesen.

Dominik

Fangen wir auf jeden Fall in die Shownotes.

Dominik

Und ja, wie funktioniert denn das eigentlich?

Dominik

Was ist denn das Preis- und Importsystem?

Johannes

Ja, ich habe diesen Artikel auf Hacker News gesehen

Johannes

und auch die Diskussion dann so ein bisschen.

Johannes

bisschen angeguckt und

Johannes

da ist mir aufgefallen,

Johannes

dass das doch tatsächlich erstaunlich viel

Johannes

komplizierter ist, als man

Johannes

das so denkt oder als man das so im Kopf hat.

Johannes

Was

Johannes

mir gar nicht so aufgefallen war,

Johannes

weil ich offenbar nicht alle

Johannes

Features benutze, die es da so gibt.

Dominik

Vielleicht ganz kurz, bevor wir darauf einsteigen,

Dominik

was ist denn überhaupt das Problem damit? Könnte das sein?

Dominik

Wir haben irgendwie so eine Story gehört, dass das mal lange dauern kann

Dominik

und doof sein kann. Worum geht's denn

Dominik

da überhaupt? Und warum braucht

Johannes

Python ein Import-System überhaupt? Das ist ja auch eine spannende Sache.

Johannes

Weil in anderen Sprachen ist das ja anders gelöst.

Johannes

Und zum Teil besser und zum Teil schlechter.

Johannes

Ja.

Johannes

Wer will anfangen?

Jochen

Also ich würde sagen, ja, vielleicht kann man

Jochen

genauso anfangen wie der Artikel. Was passiert denn,

Jochen

wenn man sagt Import M?

Jochen

Warum sagt man das denn überhaupt, Jörg?

Jochen

Warum sagt man Import M?

Jochen

Ja, es gibt natürlich

Jochen

Build-ins, aber nicht alles sind Build-ins.

Jochen

Und manchmal möchte man halt irgendwo

Jochen

Funktionen oder Klassen oder sonst irgendwas

Jochen

verwenden.

Dominik

Oder man möchte einfach seinen Code trennen und nicht alles

Dominik

eine einzige Feier. Also man möchte halt irgendwas

Johannes

verwenden, was nicht in der aktuellen Datei definiert ist.

Johannes

Genau. Und jetzt könnte

Johannes

ich verschiedene Dinge, ich könnte mir

Johannes

die Datei nehmen und sie e-ballen.

Johannes

Könnte ich machen.

Johannes

Ja.

Johannes

Wäre

Johannes

auch möglich, oder?

Jochen

Hat auch einen ähnlichen Effekt irgendwie.

Jochen

Ja, genau. Aber das

Jochen

überschreibt dann natürlich manchmal Sachen, wenn ich jetzt irgendwie

Jochen

zum Beispiel da drin halt,

Jochen

wenn ich jetzt im aktuellen... Ja, vor allem, wenn man das rekursiv

Johannes

macht, weil das müsste dann auch immer weiter funktionieren.

Johannes

Ja, und dann

Jochen

wenn man so Counter-Variablen hat oder so,

Jochen

die sind dann wahrscheinlich hinterher anders.

Jochen

Vielleicht, ja, vielleicht.

Johannes

Ja, oder auch Namen, die einfach gängig

Johannes

sind, werden vielleicht eventuell überschrieben.

Dominik

Ja, aber das ist ja, bei Python macht der auch

Dominik

irgendwie sowas, das macht ja so ein

Dominik

Namespace wieder. Ja, genau, das müsstest

Dominik

du dir dann, also wenn du einfach die Datei lädst

Dominik

und ausführst, also

Johannes

IWR drauf machst, dann

Johannes

ja, drückst du halt erstmal alles in die Hand.

Johannes

Und da wäre dann, hätte man

Johannes

dann auch wieder das Problem mit dieser Rekursion, die müssen wir auch irgendwie

Johannes

lösen, weil du musst ja dann eventuell noch mehr Sachen

Johannes

derweil

Johannes

importieren und e-wählen und

Johannes

vielleicht hast du ja sogar das Problem, dass

Johannes

du es zyklisch machst.

Johannes

Aber das Problem haben wir in Python auch.

Johannes

Das Problem haben wir in Python auch, ja, aber

Johannes

muss man mal überlegen, wie das das macht.

Johannes

Aber in anderen Sprachen,

Johannes

um da noch kurz drauf anzugehen,

Johannes

braucht man es ja, macht man es ja nicht.

Johannes

In Java oder in C++

Johannes

macht man es ja nicht, dass man einfach

Johannes

andere Dateien da reinkopiert,

Johannes

weil da ja die

Johannes

Organisation anders ist. Da braucht man ja quasi

Johannes

keine Objekte in der Hand, sondern nur

Johannes

einen Verweis auf die entsprechenden Stellen

Johannes

im Code. Das heißt, bei denen

Johannes

funktioniert das Import-System halt,

Johannes

weil das während des Kompilierens passiert,

Johannes

deutlich anders

Johannes

als in Python.

Jochen

Ja, ich überlege gerade, wo da die Unterschiede sind.

Jochen

Also wenn ich in

Jochen

C sage include,

Jochen

das wäre das eine Datei.

Jochen

Genau, aber wenn du zum Beispiel in C

Johannes

inkludierst, die ja normalerweise

Johannes

nur .h-Dateien. Und da sind ja

Johannes

keine Definitionen

Johannes

drin. Da sind ja nur Deklarationen drin.

Johannes

Da steht nur drin,

Johannes

es gibt etwas, was heißt so und so.

Johannes

Und das ist das Einzige, was du an der Stelle

Johannes

da reinkriegst. Das Zusammenführen,

Johannes

was dann tatsächlich der Code ist oder was

Johannes

diese Werte sind, das passiert erst später im

Johannes

Link-Vorgang, wenn du schon alles

Johannes

kompiliert hast. Und diese Phasen

Johannes

gibt es bei Python ja einfach überhaupt nicht.

Johannes

Bei Python gibt es ja nur die Phase Ausführen.

Johannes

Und zu dem Zeitpunkt brauchst du es

Johannes

dann jetzt. Und

Johannes

was viele Leute vergessen,

Johannes

wenn du define schreibst, wenn du eine Funktion definierst,

Johannes

wenn du eine

Johannes

Funktion erstellst, dann ist

Johannes

das Code, der ausgeführt wird, das ist ein Befehl

Johannes

an Python und der heißt,

Johannes

merkt ihr mal unter dem Namen, keine Ahnung,

Johannes

fun, ein Code-Objekt,

Johannes

was folgende Eigenschaften hat.

Johannes

Es ist callable und dieser callable hat

Johannes

folgende Parameter und dann steht da Code

Johannes

drin und so weiter und so fort. Und auch bei

Johannes

class, wenn du class

Johannes

als Schlüsselwort, wird ja erstmal alles

Johannes

ausgeführt, was da drin ist. Das heißt, du kannst da prinzipiell

Johannes

Code drin haben, der

Johannes

Sachen tut, was ja auch an vielen Stellen

Johannes

sehr wichtig ist, was du aber in anderen

Johannes

Systemen nicht hast.

Johannes

In der Java und in der C++ hast du

Johannes

das nicht, das wird nicht ausgeführt.

Johannes

Es wird zum Teil ausgeführt bei C,

Johannes

weil du da diesen komischen Pre-Processor hast

Johannes

und weil der auch so

Johannes

Constant-Optimizations

Johannes

versucht schon mal zu machen, aber generell

Johannes

wird C-Code

Johannes

erst ausgeführt, wenn du das Programm startest.

Johannes

Das ist bei Python

Johannes

Schritt des Kompilierens gibt es ja bei Python nicht.

Johannes

Der ist ja da so ein bisschen innen drin.

Johannes

Das heißt, du kannst auch mit Import

Johannes

Sachen ausführen.

Johannes

Was

Johannes

manchmal komisch ist und manchmal gewünscht

Johannes

und manchmal überraschend.

Johannes

Ja, also das ist manchmal

Jochen

tatsächlich, wenn man Sachen importiert,

Jochen

dass dann halt alles in dem Modul ausgeführt wird,

Jochen

was auf dem Top-Level ist. Das ist halt schon

Jochen

manchmal eher überraschend.

Jochen

Warum passiert

Dominik

das denn auch? Warum wird das dann ausgeführt? Also wenn man jetzt

Dominik

ein Import schreibt, Import M

Dominik

von irgendwo, was dann...

Dominik

Einfach nur Import M, also wirklich nur

Dominik

diese Zeile Import M. Was passiert dann?

Dominik

Ja, das ist eine gute Frage.

Dominik

Und auf den ersten Blick ist es

Johannes

finde ich so ein bisschen offensichtlich, was da passiert.

Johannes

Und auf den zweiten Blick ist es dann tatsächlich doch nicht so offensichtlich,

Johannes

wie eben dieser Artikel,

Johannes

glaube ich, uns allen demonstriert hat.

Johannes

Also für mich bedeutet Import M

Johannes

suche eine Datei,

Johannes

die M.py heißt

Johannes

und gib mir den

Johannes

Inhalt davon als Modul. Oh, das wäre aber ein Skript

Dominik

und man könnte auch ein Modul laden,

Dominik

was halt, wenn ein Modul heißt, das M heißt,

Dominik

das in einem Verzeichnis ist oder sowas.

Dominik

Oder was ist ein Modul?

Dominik

Nee, das wäre dann wieder was anderes.

Johannes

Ja, aber ein Verzeichnis ist ja auch nur so eine Art Datei.

Johannes

Ein Verzeichnis ist ja auch nur ein Verweis auf die InitPy.

Dominik

Also es gibt Module und Packages.

Dominik

Und was ist denn überhaupt der Unterschied?

Dominik

Was ist ein Skript, was ein Modul, was ein Package?

Dominik

Ja, das ist schwer zu sagen.

Dominik

Ich finde es schwer zu sagen,

Dominik

weil für mich dieser Unterschied wirklich minimal ist.

Johannes

Das eine ist halt eine Datei und das andere ist ein Verzeichnis.

Johannes

aber das Verzeichnis selber hat ja

Johannes

keinen Inhalt und deshalb tut man so, als ob

Johannes

die Init-Pi, die da drin ist, dass der Inhalt

Johannes

dieses Verzeichnisses ist.

Johannes

Genau, in der Init-Pi

Dominik

kann man auch sowas wie All dann definieren, das heißt, wenn man zum Beispiel

Dominik

sowas wie Import-Aspects, das kannst du auch

Dominik

in einer einzelnen Datei machen. Kannst du überall definieren.

Dominik

Ja, okay.

Johannes

Kannst du auch Slots definieren, das ist auch,

Johannes

kannst du auch überall machen. Ein Slot?

Johannes

Ja, das sind solche Sachen,

Johannes

die beim Import mitgebracht werden sollen.

Johannes

Genauso wie all. Wenn du all definierst

Johannes

und dann machst du from m import Stern, dann kriegst du alles das,

Johannes

was in all drin steht. Also unterstrich, unterstrich,

Johannes

all, unterstrich, unterstrich, um es jetzt mal hier korrekt

Johannes

zu sagen.

Johannes

Dann, dann, all, dann, dann.

Johannes

Das ist ein sehr guter Mechanismus, den sieht man sehr selten,

Johannes

weil import Stern

Johannes

ja so

Johannes

verpönt ist. So gerne gesehen wird.

Johannes

Es riecht.

Johannes

Das hatten wir schon in der ersten Vorlesung quasi

Johannes

in Informatik 1 hat uns unser Professor

Johannes

schon gesagt, ja, man kann using

Johannes

namespace standard nehmen.

Johannes

Und dann kann man mal gucken, wie viele Symbole da importiert werden und es waren irgendwie 13.000 oder sowas. Und das kannst du in Python natürlich auch machen, kannst auch from Stern import Stern probieren, kriegst halt auch 100.000 Sachen rein.

Johannes

Import Stern habe ich noch gar nicht probiert.

Johannes

Nee, nee, From Stern, Import Stern geht nicht.

Johannes

Aber so quasi, wenn du es dir vorstellst.

Johannes

Import Stern heißt halt, hol alles aus diesem Modul oder aus dem Package

Johannes

und gib es mir.

Johannes

Und meistens weiß man ja gar nicht ganz genau, was da drin ist.

Johannes

Meistens weiß man auch nicht, wie viel da drin ist.

Johannes

Und ganz oft sind da ja dann auch lokale Sachen drin,

Johannes

die man eigentlich gar nicht haben möchte.

Johannes

Oder Imports, die dieses Modul macht,

Johannes

die hast du dann auf einmal auch selber importiert.

Johannes

Subdependencies quasi.

Johannes

Genau, also wenn du in der m.py, so wie wir es jetzt eben drin hatten,

Johannes

wenn du da import x machst und dann machst du from m import Stern,

Johannes

hast du auch x importiert, weil das halt in dem Modul m dann schon drin ist.

Dominik

Und das ist genau der Grund, warum man dieses Stern nicht machen soll,

Dominik

weil man nämlich nicht weiß, was da drin ist und man halt dann alle Sachen,

Dominik

die es schon gab, bei einem Lokal irgendwo überschreiben würde.

Dominik

Und wenn mehrere Module oder Pakete dasselbe Namen definieren für irgendwas,

Dominik

was ja durchaus mal vorkommen kann, dann weiß man nicht

Dominik

mehr genau, was unter dem Namen jeweils Identität ist.

Johannes

Aber jetzt müssen wir ja erstmal klären, was Import

Johannes

überhaupt macht. Wir sprechen jetzt schon die ganze

Johannes

Zeit über, aber wir wissen es immer noch nicht.

Dominik

Wir wissen aber immer noch nicht genau, was ein Modul, ein Paket ist.

Dominik

Ja, also ich glaube, das eine ist eine Datei

Dominik

und das andere ist ein Verzeichnis.

Dominik

Ja, aber ich glaube,

Dominik

es ist auch irgendwie,

Jochen

ich glaube, der entscheidende

Jochen

Unterschied ist, dass irgendwie ein Paket Submodule

Jochen

haben kann und ein Modul nicht.

Jochen

Also genau,

Dominik

ich habe eine Definition gefunden bei

Dominik

der irgendwo sagt hat dann,

Dominik

if a module name has no dots, it's not

Dominik

considered to be part of a package.

Dominik

Aha.

Dominik

Ja, okay.

Dominik

Mag sein.

Dominik

Also ein Paket ist halt quasi eine Sammlung von

Dominik

Modulen oder sowas.

Dominik

Okay, gut.

Dominik

Da gab es auch eine tolle Antwort drin.

Dominik

Relative imports for the billions times oder sowas.

Johannes

Ja, relative imports, darüber muss man

Johannes

auch noch sprechen. Ich bin ein großer Fan davon, aber

Johannes

offensiv sind die nicht so.

Johannes

Gut, da kommen wir vielleicht nach.

Johannes

Ja, ja, ja, okay.

Johannes

Also was macht denn Import jetzt überhaupt? Import macht,

Johannes

soll ich mal versuchen, soll ich mal

Johannes

mein Verständnis erklären und er korrigiert

Johannes

mich dann. Ja. Von wo importiert

Johannes

er denn überhaupt? Genau, also Import. Erstmal

Johannes

sucht Import ein,

Johannes

also wenn ich sage Import M, dann

Johannes

sucht das Import-System von Python

Johannes

nach etwas, das M heißt.

Johannes

Und zwar. Wo ist das denn? Ja, genau.

Johannes

Und zwar auf dem Python

Johannes

Path. Auf dem Path, ah.

Johannes

Da gibt es eine Variable, die heißt

Johannes

sys.pythonpath.

Johannes

Sys.path. Sys.path heißt die, oder?

Johannes

Okay, ich weiß, ich vergesse es jedes Mal wieder.

Johannes

Jedenfalls ist da

Johannes

eine Menge von Verzeichnissen drin

Johannes

und in der Reihenfolge, wie sie in diesem

Johannes

Path stehen,

Johannes

wird nach dem

Johannes

Namen M gesucht. Also 0 ist glaube ich

Johannes

der aktuelle irgendwie,

Johannes

das ist entweder vorne oder hinten, das ist immer

Johannes

Ich glaube 0, der erste ist immer

Dominik

wo du gerade bist. Das ist immer Punkt. Genau.

Dominik

Also die Datei, wo du gerade aufgeführt bist oder sowas

Dominik

und dann ist halt quasi, der sucht halt dann im

Dominik

ersten in eins, wo ab da was drin ist.

Dominik

Und der erste Hit wird dann genommen.

Johannes

Genau, der erste Hit wird dann genommen. Und in diesem Path

Johannes

können ganz viele verschiedene Sachen drin sein.

Johannes

Also die Installation, das

Johannes

Installationsverzeichnis des Interpreters und

Johannes

wenn man irgendwelche

Johannes

Environments aktiviert hat, dann sind die da alle drin.

Johannes

Man kann da auch selber Sachen reintun,

Johannes

braucht man manchmal, ist manchmal ganz nützlich.

Johannes

Ja, also da sind einfach viele Verzeichnisse drin.

Dominik

Also wenn man verschiedene Pakete haben will, die auch importiert werden können,

Dominik

dann muss man einfach da gucken. Das ist ein

Dominik

sys.path quasi in der Umgebungsvariante

Dominik

Das ist im Wesentlichen das, was Virtual

Dominik

Env macht. Er macht ein Verzeichnis, wo du

Dominik

deine Pakete reinlegen kannst und tut den in den

Dominik

Python-Path für dich. Genau, das heißt, wichtig, dass

Dominik

euer Path vernünftig konfiguriert ist, wenn ihr Python nutzt,

Dominik

weil wenn die falsche Reihenfolge drin ist, dann kann das

Dominik

sein, dass er im Path von Python

Dominik

2 sucht oder so, also wie es

Dominik

früher offenbar war. Und dann habt ihr ein Problem.

Dominik

Genau.

Dominik

Also, und er sucht diese ganzen Verzeichnisse durch und wenn

Dominik

da irgendwas drin ist, was diesem Namen m entspricht,

Dominik

also eine m.py oder ein Verzeichnis, was m heißt,

Johannes

was eine Init-Pi hat, oder in Python 3

Johannes

ein Verzeichnis, was

Johannes

das M heißt und Python-Dateien

Johannes

enthält, was keine Init-Pi hat,

Johannes

dann wird das

Johannes

als Modul importiert und

Johannes

in den aktuellen Namespace

Johannes

als Modul M übergeben.

Dominik

Wir haben gerade wirklich das schon in Python 2 und 3 diskutiert,

Dominik

das ist ja interessant. Ja, da gibt es Unterschiede.

Jochen

Ja, da gibt es auch interessante,

Jochen

also nochmal ein sehr interessanter Unterschied

Jochen

kommt mit Python 3.3, glaube ich,

Jochen

dazu, nämlich die Namespace-Only-Pakete.

Jochen

Erklär mal.

Jochen

Die gibt es.

Jochen

Also früher musste man ja immer die Init-PUI haben.

Jochen

Vor allen Dingen deswegen,

Jochen

damit halt nicht Verzeichnisse,

Jochen

die halt so heißen wie ein Standardmodul,

Jochen

halt das Standardmodul überschreiben.

Jochen

Und man halt damit dann quasi

Jochen

öffentlich

Jochen

sich dazu bekennt, dass das jetzt ein

Jochen

Paket sein soll.

Jochen

Also sozusagen, wenn man sich den Infus

Jochen

schließt, dann muss man das auch wirklich absichtlich gemacht haben.

Jochen

Und das ist aber

Jochen

teilweise blöd.

Jochen

weil oft will man vielleicht auch

Jochen

Dinge, die in einem Paket liegen, nicht in einem

Jochen

Verzeichnis haben zum Beispiel.

Jochen

Und also wenn es

Jochen

ein Init-Py gibt, dann

Jochen

ist das

Jochen

ja, dann, jetzt weiß ich

Jochen

nicht mehr die Stelle, wo das irgendwo drin steht,

Jochen

dass da drin gesucht werden soll, also

Jochen

Dispass, ja, aber es gibt auch noch irgendwie

Jochen

andere Stellen, glaube ich. Es gibt auch noch Module,

Jochen

die nicht da drin sind, zum Beispiel die

Jochen

Standard-Bibliotheks-Module

Jochen

sind, also es gibt welche, die sind irgendwie in

Jochen

das Python-Binary reinkompiliert und dann gibt es

Jochen

auch noch welche, die sind irgendwie

Jochen

woanders hingemarschelt, aber die liegen da auch irgendwo

Jochen

rum. Also die Rang-Python-Module,

Jochen

die nicht zählen.

Jochen

Das stimmt, das kann man, aber es gibt

Jochen

auch noch Dinge, Module, die sind halt einfach nur

Jochen

in der Shared-Library

Jochen

und nicht irgendwie Python.

Jochen

Aber da kommen wir gleich noch so weiter.

Dominik

Wo der Pycache und so weiter noch was dann kommt, aber egal.

Dominik

Genau.

Dominik

Aber man kann halt

Jochen

auch, es gibt auch Verzeichnisse und denen

Jochen

wird auch gesucht, wenn da keine NPY ist.

Jochen

Das ist allerdings dann irgendwie

Jochen

weiter hinten. Und

Jochen

alle, die den gleichen Namen haben, wenn da

Jochen

jetzt Sachen drin liegen, dann wird das zum

Jochen

gleichen Paket

Jochen

gehörig irgendwie aufgefasst und

Jochen

das ist dann so ein Namespace-Package.

Jochen

So ein Namespace-Mengeling.

Jochen

Und dann kannst du halt auch... Also wir erhalten

Jochen

fest, einfach immer eine Init-Pile.

Jochen

Ja, dann ist es sicher.

Jochen

Aber so kannst du halt

Jochen

auch Dinge in einem Paket haben, die in unterschiedlichen

Jochen

Verzeichnissen liegen, was halt manchmal auch ganz praktisch ist.

Jochen

Klar. Man kann das schon brauchen.

Jochen

Ja, okay.

Dominik

Okay, also was ist dann

Dominik

das haben wir gesagt, Package, es gibt auch

Dominik

ein dann dann Package, was steht

Dominik

denn da?

Dominik

Ist das Current Package? Genau.

Dominik

Ja, das ist das aktuelle Paket.

Dominik

Das ist ein Top-Level-Modul oder sowas, ja?

Dominik

Ja, äh,

Dominik

oh Gott, ich weiß auch nicht, ist es auch so? Ich glaube, also wenn es

Dominik

None ist, dann ist es ein Skript.

Dominik

Also vielleicht noch mal zu distinguieren zwischen Skript-Modul

Dominik

und Pakete oder so, wenn Package None ist,

Dominik

das ist nur ein Skript und wenn, er sucht halt dann, ob er so ein

Dominik

Package findet und wenn er eins findet, dann ist das Top-Level-Modul,

Dominik

von dem man dann importieren kann oder so.

Dominik

Und wenn es das nicht gibt, dann gibt es halt auch

Dominik

Fehler. Attempted Relative Import

Dominik

Beyond Top Level Package.

Dominik

Ja, das ist

Dominik

so eine Sache, die gibt es.

Dominik

Passiert mir auch

Dominik

regelmäßig. Echt, das passiert mir nie, das ist

Dominik

voll seltsam. Doch, passiert mir auch. Es gibt so Sachen, die

Dominik

machen Menschen offensichtlich

Dominik

unterschiedlich und das ist so eine Sache, die mache ich offenbar nicht.

Dominik

Also nicht, weil ich besser bin oder

Dominik

weil ich irgendwie das toller kann oder so, sondern

Johannes

weil es einfach was ist, was ich nicht benutze.

Dominik

Ja gut, aber wenn du relative Importe benutzt, wie du gerade gesagt hast.

Dominik

Ja, die liebe ich. Relative Importe sind voll gut.

Dominik

Ab und zu vertippt man sich ja mal oder hat irgendwie.

Dominik

Ja, aber also relative Importe, jetzt müssen wir

Johannes

über relative Importe sprechen. In Python 3

Johannes

und ich glaube in 2.7

Johannes

wurde das dann irgendwann geportet, gibt es

Johannes

die Möglichkeit zu sagen, from Punkt Import

Johannes

irgendwas, also from Punkt Import M.

Johannes

Oder vom dot dot.

Johannes

Oder auch from Punkt M

Johannes

Import irgendwas.

Johannes

Und dieser Punkt heißt halt eben

Johannes

immer aktuelles Verzeichnis.

Johannes

Also aktueller

Johannes

Pfad.

Johannes

Das heißt, wenn es in dieser

Johannes

Installation, die ich habe, zwei Module gibt, die M

Johannes

heißen, dann kann ich durch diesen

Johannes

relativen Import genauer sagen, welches

Johannes

ich meine. Ach, okay, doch,

Jochen

nee, das war der Unterschied zwischen Modulen und

Jochen

Packages. Module

Jochen

haben einen Pfad dran. Ja,

Jochen

ich glaube tatsächlich, das ist der entscheidende Unterschied.

Jochen

Ich glaube schon, ja.

Jochen

Genau, die Top-Level-Package

Dominik

ist halt irgendwie doch die Sache. Also wenn Package,

Dominik

wenn man ein Paket finden kann, also ein Top-Level

Dominik

finden kann, ja, mit diesem Dot-Dot, dann geht das halt.

Dominik

Aber wenn das None ist, weil man quasi auf der höchsten

Dominik

Ebene ist, dann gibt es halt Fehler zurück. Und das ist ja genau

Dominik

der Grund, warum das... Okay, das kann natürlich sein.

Johannes

Das kann natürlich sein, dass ich das einfach nie... Also für mich

Johannes

ist einfach Punkt, ja. Wenn ich sage from Punkt

Johannes

importen, dann weiß ich, das muss im aktuellen Verzeichnis

Johannes

liegen. Wenn ich sage from Punkt Punkt,

Johannes

dann weiß ich, das muss im Verzeichnis drüber liegen.

Johannes

Und für mich ist das einfach eine Möglichkeit,

Johannes

quasi in meinem Projekt zu

Dominik

navigieren. Aber, also ich sag mal so,

Dominik

das geht aber nur dann, wenn der Interpreter

Dominik

richtig aufgelöst ist. Weil wenn du tief drin bist

Dominik

und dann das Skript beispielsweise manuell ausführst,

Dominik

relativ tief drin, dann wird der ja diesen Fehler schmeißen.

Dominik

Wenn du diese Datei

Dominik

direkt aufrufst. Genau. Das kann man übrigens

Dominik

verhindern, indem man einfach sagt, Python minus M

Dominik

und dann dieses Modul dann

Dominik

innerhalb von dem Pfad aufrufen. Genau.

Johannes

Die meisten meiner Projekte sind ja aber in einem Django-Umfeld.

Johannes

Ja. Und da bin ich nie in der Verlegenheit,

Johannes

diese Sachen direkt aufzurufen, sondern die werden

Johannes

dann entweder über

Johannes

einen Run-Server aufgerufen oder über einen Test

Johannes

oder über einen

Johannes

Command. Auch da ist der Pfad, ja,

Dominik

musst du ja richtig definieren. Ja, aber der

Dominik

Pfad ist immer festgemacht an der Manage-Pile.

Dominik

Genau. Das heißt,

Johannes

das weiß ich. Ich weiß, wo der Pfad...

Dominik

Ja, aber das ist ja auch Python-M, Package.Module

Dominik

oder so. Genau. Und deshalb

Johannes

ist das vielleicht was, was einfach in meiner

Johannes

täglichen Arbeit nicht so auftritt, dass ich da

Johannes

mich quasi vernavigiere,

Johannes

weil meine Projekte

Johannes

eben immer eine feste

Johannes

Wurzel haben und darunter kann ich

Johannes

mich bewegen, wie ich möchte.

Johannes

Ja, mir passiert das halt vor allen Dingen

Johannes

dann, also einmal

Jochen

in Paketen habe ich oft gerne Tests

Jochen

in einem anderen Verzeichnis. Also da gibt es

Jochen

sind Tests nicht innerhalb von dem Projekt

Jochen

selber, sondern liegen halt in einem Test-Directory.

Jochen

Wenn da irgendwas nicht richtig konfiguriert ist, dann passiert

Jochen

das halt schon mal. Ja, genau, klar.

Jochen

Und wo es mir halt auch ab und zu passiert ist,

Jochen

ist halt in Jupyter-Notebooks,

Jochen

weil die liegen halt auch wieder in einem anderen Verzeichnis.

Jochen

Und die sind halt auch irgendwo. Genau.

Jochen

Und deswegen sehe ich das halt

Dominik

häufiger mal. Bei diesem Importer

Dominik

auch ganz interessant. Ich glaube, das kommt dann wirklich darauf an, wenn der

Dominik

Name des Moduls Punkte enthält

Dominik

oder halt nicht. Weil wenn er

Dominik

Punkte hat, dann... Ach so, wenn der Name des

Johannes

Moduls, also wenn das Modul quasi

Johannes

m.x.y.

Johannes

Genau, dann ist es halt

Johannes

ein Part, ein Paket.

Johannes

So was vermeiden wir jetzt einfach halt noch.

Dominik

Ja genau, aber nein, andersrum, wenn es halt keinen Punkt

Dominik

mehr hat, dann muss es eigentlich schon

Dominik

Top-Level sein, weil dann

Dominik

kannst du ja nicht.

Dominik

Ah, okay.

Jochen

Aber man kann ja jetzt auch so Dinge tun

Jochen

wie, man sagt

Jochen

from m import

Jochen

x oder so.

Dominik

Habt ihr schon mal Skriptnamen mit Punkten verwendet?

Dominik

also mit mehreren Punkten drin.

Dominik

Nee, das ist das, was ich gerade jetzt überlege,

Johannes

ob ich eine Datei mit Punkten drin hätte,

Johannes

ohne also Punkt P, Y.

Dominik

Ich glaube, das kann zu Problemen führen, oder?

Dominik

Ich glaube auch, dass das zu Problemen führt.

Johannes

Und das würde ich auch vermeiden einfach.

Johannes

Ja, interessant.

Johannes

Stimmt, das habe ich auch noch nicht ausprobiert.

Johannes

Das müssen wir, das wird dann die nächste Episode.

Johannes

Was passiert eigentlich, wenn man einen Punkt eingibt?

Johannes

Ja, genau.

Johannes

Ach so, genau, die Form import M

Johannes

ist ja noch vergleichsweise offensichtlich.

Johannes

Aber jetzt hat der Jochen eben gesagt,

Johannes

Was ist denn, wenn ich sage, from m import x?

Johannes

Genau.

Johannes

Und was dann halt für mich passiert ist,

Johannes

er importiert erst m

Johannes

und guckt dann in m nach,

Johannes

ob es da etwas gibt, was x heißt

Johannes

und gibt mir das als Import.

Johannes

Aber das stimmt nicht ganz.

Johannes

Weil es kann nämlich auch,

Johannes

man kann auch from m import x machen,

Johannes

wenn es in m gar kein x gibt.

Johannes

Weil eben,

Johannes

wie angekündigt,

Johannes

wenn m ein Verzeichnis ist,

Johannes

was eine InitPy enthält,

Johannes

Dann kriege ich aus dem Import M

Johannes

alles das raus, was in der InitPy drin ist.

Johannes

Aber from M Import X kann dann

Johannes

die Datei X.py sein, also

Johannes

M-X.py

Johannes

und die kann ich mit, also an die

Johannes

komme ich dran, ja, from M Import X.

Johannes

Aber die ist nicht in M selbst

Johannes

enthalten. Also wenn ich nur Import M mache, gibt es nicht M.x.

Johannes

Kann so sein.

Johannes

Deshalb

Johannes

ist es dann doch

Johannes

noch gleich ein bisschen anders. Also man muss

Johannes

eigentlich immer auf die Datei zeigen, die man

Jochen

haben möchte. Ja, aber genau, das fand ich auch

Jochen

Das hat mich auch überrascht, das wusste ich nicht,

Jochen

wenn man sagt, vom M-Import X,

Jochen

ich weiß nicht, was ich vorher gedacht habe,

Jochen

aber ich dachte, das holt das X da raus

Jochen

und dann hat man das halt im eigenen Namespace.

Jochen

Aber eben, es macht halt eher sowas wie Import M,

Jochen

dann sagt es X gleich M.X

Jochen

und dann sagt es Del M.

Jochen

Und das ist halt eher so das, was tatsächlich passiert.

Jochen

Und das ist auch schon so, ui, ui, okay.

Jochen

Also wenn es nicht geht, macht er doch was anderes,

Jochen

weil dann holt er sich doch noch die Detail.

Jochen

Ja, ja, ja.

Jochen

Achso, und es ist natürlich alles übrigens noch gecached.

Jochen

Ja, also man kann so oft Import M machen,

Jochen

möchte es wird nur einmal gelesen die datei und das wird da wo wir das dann reingeschrieben in

Jochen

das dictionary der offenen der geladenen module das heißt irgendwie punkt das ist auch so eine

Jochen

eine geschichte das kann man auch schön sehen

Jochen

verwenden. Also

Jochen

manchmal braucht man ja, also Singleton,

Jochen

ein ehrlich gesagt überschätztes

Jochen

Cooles.

Jochen

Es hat einen total coolen Namen, deswegen wollen

Jochen

es die Leute immer verwenden. Aber tatsächlich gibt es

Jochen

manchmal braucht man das. Manchmal braucht man es

Jochen

tatsächlich. Meistens nicht. Meistens

Jochen

eher nicht. Genau, aber Module sind immer Singletons.

Jochen

Ganz genau. Und das ist

Jochen

tatsächlich die eleganteste Art, die ich kenne, wie man das

Jochen

macht. Und es ist auch manchmal total nervig.

Jochen

Ja, aber

Jochen

ich habe da vorher

Jochen

schon, also meistens habe ich dann Borg-Pattern verwendet

Jochen

oder halt irgendwas in der Richtung

Jochen

oder manchmal halt auch, wenn ich nicht Borg

Jochen

wollte, sondern direkt Singleton, dann wird es aber schon

Jochen

hakelig, dann kann man das irgendwie, dann muss

Jochen

man schon so Meta-Klassen oder sonst irgendwie sowas,

Jochen

muss man so Dinge, wo man sich hinterher so ein bisschen

Jochen

schmutzig fühlt, irgendwie machen und

Jochen

bis ich dann irgendwann mal, ich weiß gar nicht, wo ich das gesehen habe,

Jochen

den Trick, so dass jemand meinte, ja, ja, Module sind doch

Jochen

sowieso Singleton, es sind doch einfach globale Variablen

Jochen

in einem Modul.

Jochen

Ja, stimmt ja.

Dominik

Moment, das muss man ja nochmal genau erklären,

Dominik

warum das ein Singleton ist. Aber Jochen, wenn du dann

Dominik

wenn du dann das Pattern richtig ausführen musst,

Dominik

musst du dann noch in dem Modul noch ein Get

Dominik

irgendwas machen.

Dominik

Falls das anlegt oder

Jochen

Falls jemand

Jochen

versucht darum rumzukommen.

Jochen

Ja, genau. Eigentlich ja.

Jochen

Jetzt der Dominik

Jochen

möchte es gerne erklärt haben.

Dominik

Also ein Singleton macht irgendwie,

Dominik

dass er guckt, ob es schon ein Objekt gibt,

Dominik

das dieses Typen ist und gibt das dann

Dominik

zurück, wenn es schon gibt. Und sonst stellt er einfach das eine,

Dominik

was es nur geben darf. Ja, Singleton heißt ja erstmal nur,

Johannes

es gibt während der Ausführung des Programms

Johannes

nur eins davon.

Johannes

Egal was davon ist.

Dominik

Und Borg ist, dass es gibt ganz viele

Dominik

davon, aber die sind alle dieselben Eigenschaften.

Dominik

Immer.

Dominik

Ja, da wird der

Jochen

State geshared, aber es ist nicht

Jochen

die gleiche Instanz tatsächlich. Es können

Jochen

unterschiedliche Instanzen sein, aber der State ist immer der gleiche.

Dominik

Genau, das heißt, die Eigenschaften sind alle dieselben über alle Instanzen

Dominik

hinweg. Ja, genau.

Johannes

Okay. Und Singleton kriegt mir

Johannes

eben durch ein Modul einfach hin. Also ich mache eine Datei

Johannes

singleton.py

Johannes

und da schreibe ich rein x gleich 2.

Johannes

dann mache ich Import Singleton und dann sage ich

Johannes

Singleton.x

Johannes

und das ist jetzt diese Instanz,

Johannes

dieses Punkt X gibt es nur genau

Johannes

einmal, weil der Python-Interpreter

Johannes

eben beim Import

Johannes

jede Datei nur einmal

Johannes

importiert, um es mal so zu sagen.

Johannes

Wenn eine Datei einmal importiert wurde, dann

Johannes

liegt die im Cache und dann, wenn du

Johannes

dann Import Singleton sagst, kriegst du wieder die aus dem Cache.

Johannes

Mit allen ihren

Johannes

Eigenschaften. Das heißt,

Johannes

du kriegst es mit dem,

Johannes

Du kannst es nicht ganz einfach machen,

Johannes

dass du diese Datei nochmal importierst.

Johannes

Weil Python halt sagt, ja, die kenne ich ja schon.

Johannes

Brauche ich nicht nochmal importieren.

Johannes

Also, weil das Moment, also das,

Dominik

weil dieser Import, das ist ein, was ist das?

Dominik

Ein Modultyp dann, wenn du ein Modul hast?

Dominik

Genau, das heißt Module.

Dominik

Und dieser Modultyp ist einfach die Zeichenkette,

Dominik

keine Ahnung, von dem, was ist?

Johannes

Ja, das Ausgeführte, das ist eigentlich der ausgeführte Code,

Johannes

der da drin ist, mit so einer Closure, die außen rum.

Johannes

Weil sonst könntest du keine Daten haben.

Dominik

Aber das wird dann doch gecastet, was dann Eval wäre?

Dominik

Oder, das habe ich ja nicht genau klar.

Dominik

Ja, im Endeffekt macht es ein E-Wahl, ja.

Johannes

Aber halt ein sehr gut verstecktes.

Johannes

Ja gut, ich meine, Import heißt,

Johannes

führ mal bitte den Code in der Datei XYZ aus.

Johannes

Also musst du ihn irgendwie ausführen.

Johannes

Irgendwo muss da ein E-Wahl drin sein.

Johannes

Aber es ist eben hinter so vielen Schichten versteckt,

Johannes

dass du es nicht siehst.

Johannes

Also was der macht ist, er lädt diese Datei.

Johannes

Immer wieder und immer wieder.

Johannes

Er lädt sie einmal.

Johannes

Aber wenn ich aus mehreren Stellen das habe,

Johannes

was ist denn dann passiert?

Johannes

Beim ersten Import Singleton wird diese Datei geladen

Johannes

und ausgeführt. Ja. Und das

Johannes

Ergebnis dieser Ausführung wird als Module

Johannes

Singleton. Ja. Abgelegt

Johannes

in diesem SysModules Cache.

Dominik

Und vielleicht wird dann da ein PyCache draus gebracht,

Dominik

PyC-Files oder so, hat das direkt da?

Dominik

Ja, nee, das ist nur eine interne

Johannes

Repräsentation. Das ist halt eben ein internes,

Johannes

das ist eine Klasse, die heißt Module

Johannes

und die hat Eigenschaften. Ja.

Johannes

Und wenn du dann

Johannes

nochmal Import Singleton machst, zum Beispiel in einer

Johannes

Datei oder zu einem späteren Zeitpunkt

Johannes

oder in einer Schleife, wo du es tausendmal machst,

Johannes

dann wird nicht nochmal diese

Johannes

Datei singleton.py geladen, sondern dann

Johannes

guckt er eben in seinen sysmodules.cache und sagt,

Johannes

ah ja, den Namen singleton kenne ich schon.

Dominik

Beim ersten Import lädt er das

Dominik

tatsächlich in den Pycify rein.

Dominik

Das heißt, er macht aus Bytecode draus,

Dominik

er komponiert das quasi und er liest das

Dominik

quasi einmal aus als String und man

Dominik

macht dann Bytecode draus und dann

Dominik

schreibt er das in Pycache rein und von da

Dominik

versucht er dann erstmal zu laden aus Pyc.

Dominik

Genau.

Dominik

Und das war jetzt ein Marshall-Objekt?

Dominik

Nein, das Ergebnis der Ausführung

Dominik

ist das, was dann das Modul ist.

Johannes

der Code des Moduls kann dann schon

Johannes

wieder weg sein, weil den brauchst du dann gar nicht mehr.

Johannes

Wenn du irgendwo ein Dev machst oder ein Class machst,

Johannes

da sind dann so Bytecode-Objekte

Johannes

dran, weil die müssen ja nochmal ausgeführt werden.

Johannes

Aber das Modul selbst,

Johannes

das, was in der Datei

Johannes

drin steht, das muss gar nicht mehr da sein.

Johannes

Also wenn du einfach nur eine Datei hast, die ganz viele Sachen

Johannes

ausrechnet und am Ende

Johannes

aber nur ein Wert rauskommt, dann ist

Johannes

dieser Code nicht mehr da. Es ist nur noch

Johannes

das Ergebnis da. Also das Ergebnis

Johannes

der Ausführung dieser Datei ist dann das, was

Johannes

in das Modul. Okay, und was

Johannes

wird dann in die PyC-File reingeschrieben?

Johannes

Die PyC-Files sind so eine

Johannes

Zwischendurch-Optimierung, weil die

Johannes

die enthalten

Johannes

so einen vorkompilierten Bytecode und der

Johannes

ist schneller zu laden als eine .py-Datei.

Dominik

Und das ist ein Marschalt-

Dominik

Object, also wir hatten ganz am Anfang einmal kurz

Dominik

Marschalt gesagt, was ist das überhaupt? Einmal kurz

Dominik

nochmal den kleinen Exkurs. Jochen,

Jochen

erklär du doch mal. Ach ja, damals

Jochen

genau,

Jochen

es ist im Grunde Marschaling

Jochen

ist eigentlich ein anderes Wort,

Jochen

Oder ist eines der Worte, die man benutzt, wenn man jetzt zum Beispiel Code oder irgendwie eine Datenstruktur serialisieren möchte in eine Liste von Buchstaben oder in einen String oder in eine Byte-Datenstruktur, die man dann halt irgendwie auf einer Platte speichern kann oder mit sich rumtragen.

Jochen

Und da gab es zwei Module, die ersten waren halt Marshall, das heißt auch so, das gibt es immer noch in der Standardbibliothek und Shelf, Shelf war schon damals nicht so richtig populär, also Marshall kann man immer noch verwenden, kann halt nur relativ wenige Datentypen und in neueren Python-Versionen verwendet man da eigentlich immer Pickle für.

Jochen

aber das ist halt im Grunde das, was es macht, wenn man

Jochen

sagt, vom Pickle

Jochen

oder wenn man sagt

Jochen

cpickle.dump

Jochen

oder so, dann wird das halt in String oder Dump

Jochen

in einen Teil geschrieben und dann hat man halt

Jochen

eine in einem String serialisierte Form von

Jochen

zum Beispiel irgendwie Code.

Dominik

Also mittlerweile nimmt, glaube ich, sogar Dill oder sowas,

Dominik

dass man irgendwie import Dill as Pickle

Dominik

oder so, also neue Version.

Dominik

Als Third-Party-Package irgendwie.

Dominik

Schön.

Dominik

Okay, aber ein Marschalt-Objekt, falls ihr das irgendwo findet,

Dominik

ist quasi eine serialisierte

Dominik

Form von dem

Dominik

Speisen-Code, der da gelaufen ist.

Dominik

Genau.

Dominik

Okay, jetzt haben wir es irgendwo geladen,

Dominik

haben wir es gefunden. Was importiert ihr dann? Was ruft ihr dann auf?

Dominik

Ja, das Ergebnis

Johannes

dieser Ausführung.

Dominik

Also import.dott, dann dann import.

Dominik

Dann dann

Dominik

crawl. In diese Funktion

Dominik

kommen dann halt die Argumente rein, die

Dominik

Ja, nee, das kann ja alles möglich sein.

Dominik

Du kannst ja auch beliebige Objekte in der Datei

Dominik

reinschreiben. Du kannst auch ein Modul machen,

Johannes

was einfach nur einen String enthält, wo irgendwelche

Johannes

Binärdaten drin sind.

Johannes

Macht man ja manchmal, weil man Testdaten

Johannes

braucht.

Johannes

Das Modul hast, wo einfach so ein paar Strings

Johannes

drin sind. Und wenn die eben ausgeführt werden,

Johannes

dann werden die halt so ein

Johannes

String-Objekt in Python mit einem Namen

Johannes

und genau diese Sachen,

Johannes

also im Endeffekt ist das halt so ein Dictionary,

Johannes

was da drin ist. So ein Unterstrich, Unterstrich, Dikt,

Johannes

Unterstrich, Unterstrich. Das hat natürlich noch

Johannes

mehr so Attribute.

Johannes

Der Path ist da drin und

Johannes

der ursprüngliche Importname

Johannes

und der Dockstring wird rausgelesen

Johannes

und so weiter. Also diese ganzen Sachen, die halt

Johannes

so passieren, wenn Python was ausführt,

Johannes

die passieren da auch.

Johannes

Alles, was Python langsam macht.

Johannes

Alles, was Python awesome macht.

Johannes

Ja.

Johannes

Genau. Und das Ergebnis dieser Ausführung

Johannes

ist halt dann das, was das Modul ist.

Johannes

Das zusammengefasste Modul. Da gibt es Modul.doc

Johannes

und Modul.tikt und Modul.

Johannes

Was weiß ich nicht noch alles. .name und .path

Johannes

und .package.

Johannes

Genau. Also alle diese Sachen, die halt dazu gehören.

Johannes

Aber das ist dann schon ein Python-Objekt.

Johannes

Also es ist keine Datei mehr, sondern es ist dann ein fertiges Python-Objekt. Und auch diese Klassen, die müssen ja erzeugt werden und wenn es so Meta-Klassen hat, dann müssen die ausgeführt werden. Also alles das, was da, ja, es ist quasi wie wenn man die Datei in den Interpreter eingibt und dann alles, was da rauskommt, eben zusammenfasst in eine Sache gepackt.

Johannes

Also es ist eigentlich von der Organisationsebene her, finde ich, sehr sauber, weil alles, was in der Datei drin ist, ist dann eben als Python-Objekt verfügbar.

Johannes

Und das ist auch für mich so ein bisschen der Grund, warum man das braucht, dass ich halt einfach bestimmte Python-Objekte oder bestimmte Dinge in andere Dateien reinschreiben möchte.

Johannes

Und diese Dateien sollen in anderen Verzeichnissen liegen, damit ich nicht die Übersicht verliere.

Johannes

Und ja, so, das ist Import.

Johannes

Und jetzt gibt es noch Importlib.

Dominik

Ja, das wird ja aufgerufen sogar, also Import wird ja bei Import aufgerufen, wenn man es nicht überschrieben hat.

Johannes

Import ist eigentlich syntaktisch, genau, das kommt ja auch noch dazu, das ist ja in dem Artikel, glaube ich, nicht drin, aber in der Diskussion war es dann drin, man kann das auch überschreiben, man kann auch selber eingreifen in den Importprozess.

Johannes

Also Dinge, die man, auf der Liste der Dinge, die man unbedingt tun sollte, ist das ganz, ganz, ganz weit unten.

Johannes

Es gibt Importlib und in Python 3 irgendwas hat auch dieser Prozess, dieser Importprozess ist quasi zu einer Python-Funktionalität geworden, den man programmatisch aufrufen kann, was sehr nützlich ist.

Johannes

Und diese Statement Import M ist quasi nur noch ein syntaktischer Zucker für Importlib Punkt, keine Ahnung, unterstrich Import, ja, irgendwie sowas.

Johannes

das Coole daran ist, dass man

Johannes

eben jetzt in diesen Prozess eingreifen kann.

Johannes

Und das ist insbesondere dann für zwei Sachen nützlich.

Johannes

Die erste Sache, für die es super nützlich ist,

Johannes

da muss ich jetzt leider auf meine eigenen

Johannes

Dinge verweisen, da werde ich

Johannes

in Kürze ein Video dazu hochladen.

Johannes

Kommt dann natürlich in die Show noch.

Johannes

Oh ja.

Johannes

Wenn man etwas neu laden möchte.

Johannes

Weil

Johannes

wir haben ja eben besprochen, wenn ich Import M

Johannes

mache, dann kriege ich immer das, wird es einmal geladen

Johannes

und dann nie wieder.

Johannes

Man ist ja jetzt oft als Softwareentwickler in so einer Situation,

Johannes

dass man Dateien dann verändert und die

Johannes

eigentlich sofort

Johannes

haben möchte, ohne dass man das Programm

Johannes

neu startet. Und um das hinzukriegen,

Johannes

habe ich mir halt so ein bisschen

Johannes

einen Glue-Code geschrieben, der Dateien

Johannes

überwacht und wenn die sich ändern, dann wird da halt

Johannes

ein Re-Import durchgeführt.

Johannes

Und das ist möglich durch die Funktion

Johannes

aus Importlib. Da kann ich sagen,

Johannes

importiere diese spezifische Datei,

Johannes

auch wenn

Johannes

die schon mal importiert war,

Johannes

Und dann wird die importiert.

Johannes

Egal, ob die schon im Cache liegt oder nicht.

Johannes

Ja, cool.

Jochen

Ja, ich meine, der Entwicklungs-Server von Django,

Jochen

der kann sowas ja auch.

Jochen

Ja, aber der macht ja einen Neustart.

Jochen

Der macht tatsächlich einen Neustart, na ja.

Jochen

Der hat so einen Watcher-Prozess

Johannes

und dann schießt er einfach den Prozess ab

Johannes

und startet einmal neu.

Jochen

Ach so, ich weiß gar nicht, wie das, wie das,

Jochen

gut, das ist ja, oh mein Gott, das ist ja schrecklich.

Jochen

Ja, aber es hat auch Vorteile,

Jochen

weil dann halt alles auf Null zurück ist.

Jochen

Ja, ja, das, ja.

Jochen

Wie ist das denn bei Jupyter?

Jochen

Ist das ja auch so.

Jochen

da kann ich ja auch beim Import sagen,

Jochen

ob ich das jetzt möchte, dass ich das nochmal

Jochen

importieren will, wenn es sich ändert.

Jochen

Ja, dann mach so ein Reimport.

Johannes

Da gibt es eben diese Jupyter-Magic,

Johannes

die du sagen kannst und der benutzt tatsächlich

Johannes

Import-Lib und macht Reimport.

Johannes

Aha, okay.

Johannes

Neu starten wäre auch blöd.

Johannes

Ja, geht ja auch

Johannes

an der Stelle einfach gar nicht.

Johannes

Zum einen, weil der Prozess ja da

Johannes

läuft und zum anderen, weil

Johannes

du ja die anderen Zellen nicht kaputt machen willst.

Johannes

Du hast ja die Zellen immer noch.

Jochen

Ich hatte übrigens tatsächlich jetzt

Jochen

letzte,

Jochen

vorletzte, ne, letzte oder vorletzte, ne,

Jochen

letzte Woche, und ich erinnere mich schon nicht mehr dran,

Jochen

den Fall, wo ich tatsächlich Importlib

Jochen

gebraucht habe und habe halt die Importfunktion

Jochen

überschrieben.

Jochen

Was hast du damit gemacht?

Jochen

Ich habe einen Pull-Request

Jochen

bei Wagtail Media

Jochen

eingereicht, weil es nicht mit

Jochen

Wagtail 2.13 kompatibel war.

Jochen

Spannend.

Jochen

Ja, da gibt es Tests

Jochen

und das Problem ist jetzt,

Jochen

dass man jetzt in den, man möchte

Jochen

die Tests ja, also

Jochen

da ist dann, okay, ich fange einfach mal

Jochen

von der Seite an, es gibt im Code so Dinge wie

Jochen

probier das mal zu importieren,

Jochen

wenn es schief geht, mach was anderes,

Jochen

weil zum Beispiel diese Telepath

Jochen

Bibliothek gibt es erst ab Backtail

Jochen

2013. Okay.

Jochen

Und da sagt man halt, probier es zu importieren.

Johannes

Ja, auch für lokale, ich benutze es ganz häufig für lokale

Johannes

Settings, ja. Irgendwo eine local settings

Johannes

.py und dann macht man halt

Johannes

Try-Import-Local-Settings-to-Py

Johannes

und Accept-Parse.

Johannes

Genau, genau.

Johannes

Und jetzt möchten wir das aber testen.

Johannes

Jetzt möchten wir testen, dass wenn

Jochen

und es gibt da noch komplizierter

Jochen

wie gesagt, das habe ich jetzt wieder vergessen, blöderweise, ein bisschen komplizierter

Jochen

Logik, die davon abhängt, ob man es jetzt

Jochen

geschafft hat, das zu importieren oder nicht.

Jochen

Und jetzt, wie willst du das testen, ob jetzt wirklich der

Jochen

richtige Code ausgeführt wird, also der Code, der zum Beispiel

Jochen

dann nur so ein Dummy-Objekt

Jochen

anlegt. Wie willst du testen,

Jochen

ob das funktioniert hat, wenn du

Jochen

nicht dann noch eine andere Paketversion

Jochen

installieren willst, was du im Test auch nicht gut machen kannst.

Jochen

Ja, und dann habe ich da

Jochen

einfach quasi Importfunktionen

Jochen

überschrieben und dann in der Importfunktion gucke ich halt so,

Jochen

wird gerade versucht, das da zu importieren?

Jochen

Ja, wirklich? Gut.

Jochen

Race Exception, ja, und dann Race Import Error.

Jochen

Und dann kann man halt testen, okay,

Jochen

und ist jetzt wirklich das Dummy-Objekt? Ja oder nein?

Jochen

Und dann hat man einen Test dafür.

Jochen

Ja, aber...

Johannes

Das ist ja spannend, aber das ist auch ganz schön tief

Johannes

eingegriffen in die...

Dominik

Hat der Jochen auch schon aufgenommen?

Dominik

Ja, genau.

Dominik

Du musst jetzt aber suchen, in welcher Folge das war.

Dominik

Kannst du uns da einen Link geben, Jochen?

Dominik

Kann ich auch mal in die Schauenden folgen.

Dominik

Das ist ja cool.

Dominik

Ja, aber es kann ja noch alles dann passieren.

Dominik

Genau, das ist jetzt sozusagen,

Dominik

der Jochen hat jetzt hier schon die Brücke

Johannes

zu dem zweiten Anwendungsfall geschlagen,

Johannes

was dann eben hier aus diesem Artikel

Johannes

in der Diskussion rauskam.

Johannes

Man kann auch im Importsystem was anderes machen

Johannes

und der schöne Vorschlag, der da kam,

Johannes

beziehungsweise das schöne Beispiel,

Johannes

was da in dieser Diskussion kam,

Johannes

ist, dass man ja prinzipiell auch

Johannes

andere Sprachen integrieren könnte. Einfach Importsystem

Dominik

aufeinandersetzen. Das kann man auch machen,

Dominik

dann ist man in seiner eigenen Welt.

Dominik

Aber quasi

Dominik

das Gegenteil davon ist, wenn

Johannes

kein Python-Modul gefunden wird, dann kann man ja mal schauen, ob man

Johannes

irgendwas anderes kompilieren kann, was diesen Namen hat.

Johannes

Und

Johannes

wenn das kompilierbar ist und kompiliert, dann

Johannes

einfach das importieren.

Johannes

Und das hat wohl jemand geschrieben, dass jemand sich eben

Johannes

so Lisp-Dateien rein importieren kann,

Johannes

die live kompiliert werden,

Johannes

wenn man sie importiert.

Johannes

reichlich abgefahren, würde ich sagen

Johannes

und ich empfehle auch niemandem, diesen

Johannes

Weg zu gehen, aber es ist

Johannes

schön, dass es jemanden gibt, der das

Johannes

gemacht hat und dass es möglich ist.

Johannes

Ich wüsste

Johannes

jetzt tatsächlich keinen richtig sinnvollen

Johannes

Anwendungszweck davon, aber

Johannes

naja,

Johannes

irgendwann wird es

Johannes

einen Anwendungsfall geben.

Johannes

Ich habe gerade überlegt,

Jochen

wenn man das jetzt mit

Jochen

TypeScript macht,

Jochen

man möchte auf dem Backend und vorne den gleichen

Jochen

Code. Ja, und dann

Jochen

wird es noch mit dem

Johannes

JavaScript-to-Python-Compiler

Johannes

zu Python gemacht. Dann hat man noch

Jochen

einen Server, irgendwas, was WebAssembly kann.

Jochen

Man kann Python

Jochen

schreiben für Frontend. Und schon

Johannes

eigentlich, deine Dateien

Johannes

bestehen quasi nur noch aus Import-Statements.

Johannes

Alles wird mit

Johannes

Import-Statements gemacht.

Johannes

Ja, das ist so wie der Präprozessor.

Johannes

Der ist auch Turing-vollständig.

Johannes

Ja, tja.

Johannes

Da hat jemand

Johannes

super wieder sein. Vorhin haben wir noch

Johannes

drüber gesprochen, ob wir unser

Jochen

Telefon ausfalten wollen.

Jochen

Flugmodus gestellt, aber nicht

Jochen

mein Rechner.

Jochen

Auf meinem Telefon hat es auch nicht geklingelt, sondern

Jochen

mein Rechner kann halt auch dummerweise klingeln.

Jochen

Was kann denn noch alles schief gehen bei den

Jochen

Importen? Ja, eigentlich kann beim Importen alles

Jochen

schief gehen, oder? Das ist ja...

Jochen

Ja. Da steht irgendwas Komisches

Dominik

drin, also keine Binärcodes oder irgendein andere

Dominik

Zeichen, das er nicht lesen kann oder sowas.

Dominik

Ja, es können auch...

Dominik

Ich glaube, das Schwierigste an diesem Importsystem

Dominik

ist, dass es halt manchmal überraschend ist, ja, dass es

Dominik

einem Sachen versucht zu importieren,

Dominik

die man nicht gemeint hat.

Dominik

Weil die Reihenfolge im

Johannes

Path falsch ist oder weil da Module liegen,

Johannes

die man auch nicht kennt oder weil

Johannes

man versehentlich einen Namen verwendet hat, den es

Johannes

schon gibt. Also wenn man

Dominik

so eine Kette durchgeht, also man möchte jetzt A importieren

Dominik

und A möchte aber ja C, D, E,

Dominik

F, G und Y. Genau, sowas kann natürlich auch passieren,

Dominik

dann hast du zirkuläre Imports, das ist auch

Dominik

schlecht. Ja, aber das wäre ja von A

Dominik

von B und C und C von A.

Dominik

Ja, genau, und das hat man ja manchmal.

Dominik

Aber das war ein anderes Problem, als das, was ich gerade meinte.

Dominik

Ich meine, dass da so ganz, ganz, ganz viel Zeugs importiert ist.

Dominik

Also du könntest ja quasi eine Sache importieren,

Dominik

und der importiert alles andere, die ganze Standardbibliothek.

Dominik

Ja, klar. Im Prinzip machst du das ja so in deinem Skript.

Dominik

Genau, und das ist halt so relativ getarnt, was da passiert.

Dominik

Man macht relativ viel Magie schon.

Dominik

Und ja, also was halt die komplizierte Frage wäre,

Dominik

ob das das irgendwie dann doch langsam macht,

Dominik

wenn man irgendwie sowas raussucht und sagt,

Dominik

okay, beim ersten Mal schon.

Dominik

Das heißt, da kann der Starten relativ lange dauern

Dominik

und beim zweiten Mal dann vielleicht nicht.

Dominik

Aber es gab irgendwie so ein Problem,

Dominik

das irgendwer hatte, der das mal ausprobiert hat

Dominik

wegen den Imports.

Jochen

Ja, ja, ja. Also das Problem gibt es,

Jochen

wenn du halt irgendwie so auf die Richtung,

Jochen

weiß ich nicht, Millionen Zeilen Python

Jochen

oder so zugehst, dass eben dann, wenn das zum Beispiel

Jochen

im Entwicklungsserver, wenn der neu startet,

Jochen

wenn du so änderst irgendwas, dann startet der neu.

Jochen

Und dann dauert das halt eine Minute.

Jochen

Das ist halt schlecht. Das ist immer so richtig flüssig

Jochen

beim Entwickeln.

Dominik

Es hieß ja irgendwie so, wie an Google, aber ich glaube,

Dominik

das war bei Instagram das Problem oder so.

Jochen

Ja, bei Instagram gibt es auch bei

Jochen

Eventbrite gibt es das, glaube ich, auch.

Jochen

Die sind nicht so groß wie Google.

Jochen

Ja, aber die haben, glaube ich, auch irgendwie

Jochen

oder

Jochen

verwechsel ich das gerade? Nein, ich meine, es ist Eventbrite.

Jochen

Die haben auch ungefähr eine Million Zeilen Code und Instagram

Jochen

halt auch, vielleicht noch mehr, weiß nicht.

Jochen

Ja, okay.

Jochen

Aber das ist ja dann so,

Johannes

das Problem ist ja eigentlich, dass

Johannes

halt die Sachen erst so in Anführungszeichen

Johannes

kompiliert werden, wenn ich Import sage.

Johannes

Und deshalb haben andere Sprachen

Johannes

das nicht, weil die machen das halt einmal vorher.

Johannes

Ja.

Johannes

Aber so eine richtig gute Lösung, also ich meine, es gibt

Johannes

PyO-Dateien und PyC-Dateien,

Johannes

die sind ja wohl schneller.

Johannes

Ja.

Johannes

Oder könnte man

Johannes

sowas auch marscheln?

Johannes

Könnte man Imports durchführen

Johannes

und das dann, ja, im Prinzip schon, oder?

Johannes

Wahrscheinlich schon, ja. Einfach mal alles

Johannes

gepickelt.

Johannes

Tja.

Dominik

Ach, deswegen auch, weil der Pickel ist die Haube von dem Marschall.

Dominik

Ah, jetzt verstehe ich das auch.

Johannes

Ich dachte, Pickel ist so ein Einmachglas.

Dominik

Die Marschalls haben doch so eine Pickelhaube auf.

Dominik

Ja. Also dann passt

Dominik

es auf jeden Fall zusammen.

Dominik

Sorry, weigert mich.

Dominik

Das englische Wort Pickles heißt

Dominik

Eingemachtes. Ja, ja.

Johannes

Ich glaube, das ist die...

Dominik

Okay, aber zirkuläre Importe wollte ich

Johannes

nochmal... Ja, zirkuläre Importe sind auch

Dominik

eine schöne Sache. Also man kann ja sowas machen wie

Dominik

in Python Form A Import B und dann

Dominik

in B machen Form B Importe irgendwas

Dominik

oder Import A, Import B, Import D und so.

Dominik

Und das funktioniert einfach, aber erst wenn man

Dominik

es dann ausführt, dann nicht mehr.

Dominik

Weil er dann darauf zugreift und dann sagt, das kennt er noch

Dominik

nicht, weil es unvollständig ist.

Johannes

Es ist schon geladen oder es ist schon am Laden.

Johannes

Ja, genau. Also wenn ich

Johannes

zirkuläre

Johannes

Verweise habe, ja, vom A Import B

Johannes

und in B sage ich vom

Johannes

wenn ich Modul A und B habe

Johannes

und in A sage ich Import B und in B sage ich

Johannes

Import A, dann kann ich die beide nicht importieren,

Johannes

weil zu dem Zeitpunkt müsste ich sie beide gleichzeitig

Johannes

importieren und das geht

Johannes

nicht. Und da

Johannes

kann ich natürlich beliebig viele dazwischen schieben.

Johannes

Ich kann A, B, C, D, E, S.

Johannes

Solange dieser Kreis sich irgendwann schließt,

Johannes

ist schlecht.

Dominik

Also es fällt ja direkt auf. Ich glaube, wenn man

Dominik

drei hat, dann fällt es glaube ich nicht immer direkt auf.

Johannes

Wenn man vier oder fünf hat, dann fällt es erst

Johannes

recht. Also das siehst du

Johannes

dann beim Importieren. Und wie löst man das denn,

Dominik

wenn man erst so ein Problem hat? Ja,

Dominik

Laufzeitimport.

Dominik

Also lazy quasi. Ja.

Dominik

Das ist doch das, was man in

Johannes

so Salary-Tasks immer machen muss.

Johannes

Weil diese Tasks können von irgendwoher

Johannes

gestartet werden und die sollen dann irgendwas machen.

Johannes

Und die müssen

Johannes

ja auch irgendwie diese Modelle importieren, aber das Modell

Johannes

selber möchte. Also das ist so mein klassischer

Johannes

Anwendungsfall. Ich möchte Modell

Johannes

sagen, ich muss hier Werte

Johannes

nachberechnen, ich muss hier ein PDF erzeugen

Johannes

und das dauert

Johannes

lange und deshalb mache ich das in dem Task. Aber dieser

Johannes

Task soll ja dann wieder dieses ursprüngliche Modell

Johannes

speichern. Das heißt, ich kann in der

Johannes

Tasks-Datei nicht das Modell

Johannes

importieren, weil das Modell hat schon den Task

Johannes

importiert. Und deshalb

Johannes

ist das so ein Pattern, wenn man

Johannes

Celery-Tasks schreibt, dass diese

Johannes

Tasks zur Laufzeit alles

Johannes

importieren. Also in der Datei,

Johannes

in der Funktion

Johannes

dev-compute-pdf

Johannes

habe ich erst mal ein paar Importzeilen drin,

Johannes

Import from Models, Import irgendwas.

Johannes

Import PDF Generator.

Johannes

Und noch

Johannes

alles, was man da halt so importiert braucht. Und dann

Johannes

werden diese Imports erst

Johannes

ausgeführt, wenn die Funktion gestartet wird.

Dominik

Also von mir, von meinem geistigen Auge, die haben gerade so ein paar

Dominik

Tickets, die noch auf die To-Do-Liste müssen. Ja.

Dominik

Genau.

Dominik

Das bedeutet halt, dass

Johannes

dieser Import nicht ausgeführt wird, wenn die Datei

Johannes

geladen wird.

Johannes

Was eben der Fall wäre, wenn es oben in der

Johannes

Datei drinstehende. Sondern dieser Import

Johannes

wird erst ausgeführt, wenn die Funktion,

Johannes

da drin ist, gestartet wird. Weil quasi nur

Dominik

der Funktionsname geladen

Dominik

wird und das, was passieren soll quasi.

Johannes

Genau, richtig. Und wenn ich diese

Johannes

Funktion dann ausführe, dann wird dieses Import

Johannes

Statement ausgeführt. Und dann

Dominik

sind die anderen Sachen schon da und dann hat man quasi den

Dominik

Laser-Import, dann kann man das dann wieder machen, weil die sind

Dominik

ja schon dann. Das ist dann schon fertig, importiere diese Models,

Johannes

die sind schon im Cache, dann kann ich einfach in den Cache zeigen

Johannes

und sagen, hier, gib mir das.

Johannes

Bin also sozusagen aus diesem Prozess

Johannes

raus. Und das ist auch sowas, was es

Johannes

eben, was eben anders ist als in anderen Sprachen.

Johannes

Import ist ein Statement, was einen

Johannes

Effekt hat.

Johannes

In C, wenn ich in C sage, import

Johannes

header.h, dann hat es keinen Effekt,

Johannes

das ist kein Code, der da erzeugt

Dominik

wird. Also C.h ist immer

Dominik

Header, noch mal für alle Leute kein C.

Johannes

Genau, .h ist immer Header, das sind so die

Johannes

Definitionen, was es da, die

Johannes

Deklarationen, nicht die Definitionen, die Deklarationen,

Johannes

was es da gibt und die .c-Datei

Johannes

enthält dann die Definitionen

Johannes

normalerweise.

Dominik

Also header.h ist natürlich dann die Definition der Header.

Johannes

Die Definition, da müsste es dann

Johannes

eine Datei

Johannes

dazugeben, die heißt header.c

Johannes

und die dann halt,

Johannes

war nur ein Beispiel.

Johannes

Aber dieses Import-Statement

Johannes

in einem C, das wird vom Compiler

Johannes

ausgeführt. Das wird nicht zur Laufzeit

Johannes

ausgeführt. Und in Python ist das anders.

Johannes

Der Compiler, der macht das,

Dominik

der schneidet die einfach zusammen,

Dominik

alle zu einer großen Datei und dann liest der einfach von oben

Dominik

nach unten durch. Und dann gibt es noch den Linker,

Johannes

der dann dafür sorgt, dass diese Verweise alle an der

Johannes

korrekten Stelle, an die korrekte Stelle zeigen.

Johannes

Das ist so ein mehrstufiger Prozess und

Johannes

Es ist halt alles, bevor das Programm gestartet

Johannes

wird. Und in Python ist immer alles,

Johannes

nachdem

Johannes

das Programm gestartet wird. Und das ist halt hier

Johannes

genau das Problem. Wenn ich Import B sage

Johannes

und versuche

Johannes

aber schon was zu importieren oder versuche

Johannes

schon B zu importieren, dann

Johannes

geht es halt nicht, weil es

Johannes

dann eben so einen Kreis bildet, der nicht

Johannes

aufgelöst werden kann. Wenn ich das aber erst später

Johannes

im Programm sage, wenn ich irgendwelche Funktionen

Johannes

geladen habe, die dann

Johannes

später nochmal diese Module

Johannes

brauchen, ist egal, wo die herkommen,

Johannes

wenn die schon im Cache sind, einwandfrei.

Dominik

Okay, aber das widerspricht ja so ein bisschen dieser

Dominik

Philosophie, dass Importe immer ganz oben stehen.

Dominik

Ja, genau. Deshalb ist das hier so der

Dominik

Nachteil da dran.

Jochen

Ja, ich fühle mich da auch immer so ein bisschen schmutzig, aber

Jochen

ja, ich mache das auch so. Aber es ist halt das Pattern

Johannes

und das ist der beste Weg außenrum.

Johannes

Es gibt noch eine andere Möglichkeit,

Johannes

die ich auch

Johannes

niemandem empfehlen möchte. Es ist ein sehr schöner Hack,

Johannes

den ich mal gehört habe.

Johannes

Wenn ich jetzt zum Beispiel nur einen Task importieren

Johannes

möchte, dann sage ich, from Tasks, Import,

Johannes

Great PDF.

Johannes

Und der Import-Prozess führt

Johannes

tatsächlich nur so lange diesen Import

Johannes

aus, bis dieses Objekt vorhanden ist.

Johannes

Alles, was unterhalb dieses Objektes

Johannes

ist,

Johannes

wird nicht ausgeführt.

Johannes

Das heißt, wenn ich meine Import-Statements

Johannes

ans Ende einer Datei mache,

Johannes

dann kann ich zirkuläre Importe machen

Johannes

in bestimmten

Johannes

Situationen, dann geht das.

Johannes

Aber auch das, wie gesagt, ist keine Empfehlung.

Johannes

Es ist nur, Imports ans Ende der Datei schreiben

Johannes

ist schon generell schlecht, weil man sie dann nicht mehr sieht.

Johannes

Und es ist auch dann schlecht, wenn man dann zirkuläre Importe ...

Jochen

Das kann man dann wahrscheinlich auch noch ein bisschen verschachteln.

Jochen

Also alle Leute, die ein größeres Interesse an Job Security haben,

Jochen

jetzt bitte mal aufpassen mit Schreiben.

Jochen

Das kriegt man hinterher nie wieder auseinander.

Jochen

Ja, nee.

Johannes

Und wenn man dann noch Homoglyphen nimmt

Johannes

und die Dateien alle gleich ausschauen,

Johannes

dann hat man ganz gewonnen.

Johannes

Ja, das ist ein Hack,

Johannes

der die Interna missbraucht,

Johannes

würde ich nicht empfehlen, aber es ist schön, dass es das gibt.

Johannes

Ja, ist auch manchmal

Jochen

interessant zu wissen, warum

Jochen

irgendwas funktioniert, wo man denkt, das kann gar nicht funktionieren,

Jochen

aber es funktioniert ja dann doch.

Jochen

Ja, ja.

Jochen

Nicht so selten, wie es funktioniert,

Johannes

was nicht, was eigentlich funktionieren sollte,

Johannes

aber trotzdem auch.

Johannes

Ja, Imports haben wir, oder?

Dominik

Erklärt, oder fällt euch noch was ein?

Johannes

Bin mir sicher, dass da noch ganz viele Fragen kommen.

Dominik

Vor allem, wie funktionieren Imports in anderen Sprachen?

Dominik

Ja, andersrum.

Dominik

Das ist nicht so genau.

Johannes

Ich bin mir sicher, dass da ganz, ganz, ganz viele Fragen noch offen sind

Johannes

und dass da ganz, ganz, ganz viele Fragen noch kommen werden.

Johannes

Einfach mal so ein bisschen als Einstieg,

Jochen

weil ich meine auch, mir waren da viele Dinge nicht so richtig klar.

Jochen

jetzt, nachdem ich den Artikel zumindest teilweise

Jochen

so gelesen habe, dachte ich, ja, okay,

Jochen

da kann man schon coole Sachen mitmachen und

Jochen

vor allen Dingen kann man das auch, dass das

Jochen

eben, dass ein Modul auch nur einfach ein Objekt ist,

Jochen

das ist irgendwie die Eigenschaft, kann man ja eigentlich

Jochen

total gut ausnutzen, um damit irgendwie

Jochen

Dinge zu machen.

Jochen

Aber sollte man. Sollte man vielleicht nicht,

Jochen

aber, nein, ich meine gerade, also zum Beispiel

Jochen

ein tatsächliches Problem, wo ich

Jochen

halt auch schon so mit Paketen und

Jochen

Dingen rumgespielt habe, wo ich dachte so, oh, da gibt's

Jochen

irgendwie, gibt's da keine gute Lösung für,

Jochen

Aber es wäre schön, eine zu haben.

Jochen

Oder ich weiß nicht, vielleicht kennst du eine.

Jochen

Im Machine Learning-Bereich, wenn man da Modelle hat,

Jochen

man trainiert die Modelle jetzt aber nicht.

Jochen

Also man hat normalerweise ein Produktionssystem,

Jochen

was irgendwie dann Dinge tut,

Jochen

so mit echten Usern und echten Daten und so.

Jochen

Aber da entwickelt man ja nicht

Jochen

und man trainiert ja auch nicht die Modelle,

Jochen

sondern Modelle trainierst du dann meistens

Jochen

irgendwie in einem Jupyter-Notebook oder so.

Jochen

Jetzt hast du da dein Modell

Jochen

und jetzt willst du das irgendwie

Jochen

aber in deine Produktionsumgebung integrieren.

Jochen

wie machst du das denn? Jetzt kannst du ja natürlich jedes Mal, wenn du

Jochen

irgendwie dein Modell trainiert hast, aber das sind ja oft Dinge,

Jochen

die dann auch periodisch passieren und automatisch,

Jochen

kannst du ein neues Paket bauen

Jochen

und das dann releasen. Aber

Jochen

dieser Deployment-Prozess ist halt

Jochen

ziemlich invasiv.

Jochen

Vielleicht willst du das nicht regelmäßig

Jochen

oder auch nicht automatisch machen, weil

Jochen

du brauchst ja Berechtigungen auf irgendwelchen Systemen und

Jochen

keine Ahnung. Gut, kannst du das natürlich auch

Jochen

Deployment automatisieren, was halt so ein bisschen

Jochen

höhe ist. Und

Jochen

du hast dann ganz, ganz viele Paketversionen

Jochen

auch. Und es ist halt viel,

Jochen

diese Modelle sind halt teilweise sehr

Jochen

riesig.

Jochen

Also irgendwie ist das nicht so richtig schön.

Jochen

Und das ist halt die Frage, wie macht man das

Jochen

eigentlich ordentlich? Und du hast das Problem, wenn man jetzt Sachen

Jochen

pickelt zum Beispiel auch,

Jochen

dann ist das

Jochen

von dem Python-Interpreter

Jochen

abhängig und so.

Jochen

Und der ist möglicherweise

Jochen

in diesem Jupyter-Notebook-Umfeld,

Jochen

wo jetzt die Data Scientists irgendwelche Modelle trainieren,

Jochen

halt auch wieder anders, aus speziellen

Jochen

Gründen anders als in

Jochen

Produktionsumgebungen, wo dann die

Jochen

Und Pickel kann ja selbst auch Imports

Jochen

durchführen. Ja.

Jochen

Das ist auch... Pickel muss man ein bisschen aufpassen

Dominik

wenn man Versionen nimmt oder so, also Sachen

Dominik

Pickelt und dann Python-Versionen weitergeht,

Dominik

das geht öfter mal kaputt, das heißt

Dominik

das ist nicht mehr so einfach dann... Ja, beziehungsweise auch

Dominik

wenn du andere Imports hast oder andere Versionen,

Dominik

Pickel importiert halt die Sachen, die es braucht

Dominik

und ja.

Dominik

Ja, und

Jochen

also das ist, das kann schon, also

Jochen

da gibt es diverse Fallstricke und

Jochen

der Weg, den ich dann irgendwann gegangen bin, ist halt dynamisch

Jochen

Conda-Pakete zu bauen

Jochen

und weil das mit Conda relativ leicht ging,

Jochen

aber das war, da kann, ich weiß nicht, ob es da

Jochen

Importlib, doch, Importlib gab es glaube ich auch schon, ich wusste

Jochen

aber nicht so viel davon, ich weiß nicht genau

Jochen

und die habe ich dann halt sozusagen

Jochen

als Django-Modelle

Jochen

irgendwie als Files irgendwo hingelegt und

Jochen

dann diese Pakete importiert

Jochen

und dann konnte man einfach einfach sozusagen sich

Jochen

konnte man in einem Jupyter-Notepunkt, wenn man ein Modell

Jochen

fertig trainiert hatte, konnte man sagen, deploy mir dieses

Jochen

Modell irgendwie und dann tauchte das halt

Jochen

auf und wenn man es ausgewählt hat, wurde es halt

Jochen

importiert und zwar einfach aus

Jochen

Aus der Datenbank importiert.

Jochen

Aus der Datenbank, beziehungsweise nicht aus der Datenbank,

Jochen

sondern aus der Datenbank plus irgendwie,

Jochen

naja, nicht in dem File-System, sondern

Jochen

in der File-System-Abstraktion,

Jochen

dem File-Storage,

Jochen

Django-Storage ist halt irgendwie.

Jochen

Und das geht

Jochen

wahrscheinlich auch ohne Conda, nehme ich mal an,

Jochen

so, wenn ich das jetzt mir so überlege,

Jochen

und wahrscheinlich geht das auch noch

Jochen

eleganter, als wie ich das damals gemacht habe.

Jochen

Ja, aber also jetzt mal

Jochen

die

Johannes

Diskussionsfrage, warum nicht wirklich

Johannes

aus der Datenbank importieren. Im Prinzip

Johannes

sind es ja nur irgendwelche Daten, kannst du ja als

Johannes

String da reinlegen und kannst sagen, importiere mir dieses

Johannes

Modell, kannst du ein Reimport machen und das

Johannes

also, dann wirst du vermutlich noch so

Johannes

einen Proxy-Pattern brauchen.

Jochen

Ja, also das Ding für Conda

Jochen

war dann halt tatsächlich irgendwie

Jochen

was ist, wenn ich jetzt irgendeine spezielle

Jochen

Abhängigkeit habe in

Jochen

meinem Modell, also ich benutze jetzt irgendeine neue

Jochen

fancy Maschine in der Bibliothek,

Jochen

die ich jetzt auf dem Produktionssystem

Jochen

jetzt aber noch nicht habe. Ja, okay, dann

Jochen

stößt das ab und... Genau, und

Jochen

dann ist halt kaputt.

Jochen

Wie kriege ich das da mit rein?

Jochen

Und zwar ohne, dass ich, ja, und das

Jochen

war, über Conda ging das, aber.

Jochen

Ja, okay. Das ist natürlich

Johannes

schwierig, ja, vor allem, wenn du dann Sachen installieren musst,

Johannes

die du eigentlich, was du an der Stelle

Johannes

eigentlich nicht willst. Wobei, also

Johannes

ich meine, PIP gibt es auch als Bibliothek, da kannst du

Johannes

auch PIP aufrufen,

Johannes

von Python heraus.

Johannes

Also,

Johannes

was ich für meine

Johannes

interaktive

Johannes

Programmieren-Sache gemacht habe, ist eben so ein

Johannes

Proxy-Pattern.

Johannes

Dass du quasi eine Schicht dazwischen hast.

Johannes

Weil du

Johannes

möchtest ja an der Stelle, wenn du es neu

Johannes

importierst, musst du halt auch ganz viele Instanzen

Johannes

ersetzen. Eigentlich.

Johannes

Und das ist schwierig, weil die hast du oft nicht

Johannes

selber in der Hand oder da kommst du oft einfach gar nicht dran.

Dominik

Also Instanzen, das heißt, du musst die laden mit dem

Dominik

neuen Kontext der neuen Importe. Genau.

Johannes

Weil du den neuen Code hast und

Johannes

eigentlich müsstest du jetzt die Instanzen...

Dominik

Du musst aber quasi ja alle Transaktionen, die du auf der einen Instanz

Dominik

hast du gemacht, hast du wieder nachvollziehen, weil du den State

Dominik

ja quasi wiederherstellen musstest. Genau, also genau,

Johannes

das ist die eine Sache, du müsstest den State quasi wiederherstellen

Johannes

und die andere Sache ist, du müsstest den Code ersetzen,

Johannes

weil ich habe jetzt hier halt ein m.x

Johannes

und ich möchte aber ein m.x2 haben.

Dominik

Aber der State kann jetzt ganz anders sein, weil du hast jetzt nur m.

Dominik

Ja, genau, kann sein. Und dafür gibt es

Dominik

einen Pattern, das heißt Proxy-Pattern,

Dominik

wo du quasi ein Interface definierst,

Dominik

was da alles drin ist.

Dominik

Was ist denn ein Interface? Also ja, also

Dominik

du definierst quasi,

Dominik

was ein Objekt kann. Also ein Typ.

Dominik

Und die eigentliche Umsetzung

Johannes

ist aber quasi eine Klasse dahinter.

Dominik

Du definierst quasi den Typ und dann...

Dominik

Dieser Proxy macht nichts anderes, als diese Aufrufe

Dominik

weitergeben.

Johannes

Und dann kannst du nämlich dem Proxy sagen,

Johannes

ersetz mal deinen Background,

Johannes

ersetz mal deinen Hintergrund, den Code,

Johannes

ohne den Proxy

Johannes

selbst anfassen zu müssen, den du halt oft

Johannes

nicht rauskriegst, weil der in irgendwelchen Sachen

Johannes

drin hängt.

Johannes

Ich könnte mir durchaus vorstellen, dass das

Johannes

mit so Machine Learning Modellen auch funktionieren

Johannes

könnte, dass du halt einen Proxy hast,

Johannes

der dieses Modell weg abstrahiert und der

Johannes

kann die Sachen irgendwoher wiederladen,

Johannes

ob das jetzt aus der Datenbank ist oder aus

Johannes

dem Dateisystem oder sonst woher.

Johannes

Einfach, dass du eine Trennungsschicht

Johannes

drin hast. Ja, das ist

Jochen

wahrscheinlich auch der richtige Weg.

Jochen

Das wäre der richtige Weg.

Jochen

Ja gut,

Johannes

man weiß das ja oft zu dem Zeitpunkt nicht so richtig.

Johannes

Es ist einiges an Verwaltungsaufwand,

Johannes

so ein Proxy richtig zu machen

Johannes

und das geht in manchen Sprachen

Johannes

einfacher. Ein Interface

Johannes

definieren geht in Java ganz einfach, weil es

Johannes

gibt es da halt. In Python ist es halt

Johannes

nur eine Klasse, die lauter Not-Implemented-Errors

Johannes

hat.

Johannes

Ja, aber ungefähr so, ja.

Johannes

Ja.

Jochen

Achso, gibt es zu diesem Projekt

Jochen

eigentlich auch schon einen Link

Jochen

oder sowas? Nee, demnächst.

Jochen

Wird nachgereicht.

Jochen

Ich liefere das nach. Okay.

Johannes

Und jetzt habe ich es öffentlich gesagt, jetzt muss ich es auch wirklich machen.

Johannes

Das ist immer gut. Sehr schön.

Johannes

Ich hatte ja, vielleicht rede ich mich ja

Johannes

gegenüber mir selbst, kann ich mich

Johannes

immer sehr leicht rausreden, aber wenn ich es jetzt schon gesagt habe.

Dominik

Ja, gib mal auf jeden Fall deine Bucketlist, dann

Dominik

erwähnen wir es mal öffentlich. Ja, gut, das ist gut.

Dominik

Ja, also

Dominik

interessant, was man aus so einem Blogartikel noch alles

Dominik

machen kann. Also wir hatten ja, glaube ich, ja vorher, bevor wir einen Blog

Dominik

gefunden hatten, irgendwie, und dann war ja irgendwie

Dominik

ergänzte Information. In demselben Blog habe ich

Dominik

noch so ein paar andere Sachen entdeckt, die wir auch vorhaben,

Dominik

sowas wie Datentypen sprechen und wie das implementiert

Dominik

ist und wie halt das Python-Objekt-System

Dominik

funktioniert oder die einzelnen Dinge oder

Dominik

der C-Python-Compiler,

Dominik

wie das überhaupt geht. Und da müssen wir auf jeden Fall

Dominik

auch mal drüber sprechen, aber schaut doch schon mal in diesen

Dominik

Bock rein, 10.000 Meters, komm, das fand ich wirklich interessant.

Dominik

Ja, da waren einige gute Sachen dabei.

Dominik

Ja, ziemlich nett und relativ aktuell.

Dominik

Ja, ich hab mir auch mal dieses

Jochen

Sea Python Internals Buch

Jochen

besorgt.

Jochen

Ja,

Jochen

mal schauen,

Jochen

vielleicht kann man da ja auch noch ein bisschen was rausholen.

Dominik

Ja, das werden wir auf jeden Fall, also vielleicht verpusten wir tatsächlich so

Dominik

jeden dieser Bock-Posts, also

Dominik

wir lesen die einfach vor.

Dominik

Wir lesen die einfach vor.

Dominik

Nein, das ist wirklich toll und ich glaube, das ist viel, was

Dominik

auch Hörer von uns gerne interessiert und wissen wollen,

Dominik

was da irgendwie so passiert, dass man so ein bisschen drüber redet, weil

Dominik

das machen wir ja, so ein bisschen erklären, wie Python

Dominik

so als Sprache und

Dominik

so und warum.

Dominik

Ja, spannend.

Dominik

Ja, super. Ich glaube, wir haben

Dominik

über Impulse gar nicht mehr so viel zu sagen.

Dominik

Ich habe gehört, Johannes hat sich extra einen Pick der Woche überlegt.

Dominik

Ich habe mir tatsächlich,

Dominik

ich habe einen Pick und zwar GitHub

Dominik

Octo.

Dominik

Das ist eine

Johannes

Anwendung, die GitHub geschrieben hat,

Johannes

mit der man

Johannes

Repositories visualisieren

Johannes

kann. Also die interne Struktur

Johannes

des Codes in einem Repository.

Johannes

Der Hintergrund ist,

Johannes

du kommst in ein neues Projekt rein und

Johannes

da sind jetzt eine Million Zeilen

Johannes

Python-Code drin und deine erste

Johannes

Aufgabe ist, mach mal hier eine

Johannes

Log-Ausgabe rein.

Johannes

Es ist sehr schwer, sich da zurechtzufinden

Johannes

und es ist auch sehr schwer,

Johannes

Sachen zu finden in Projekten,

Johannes

wenn man sie nicht sehr genau kennt.

Johannes

Und da ist eben GitHub-Octo, das macht hier

Johannes

so ein paar sehr schöne Grafen,

Johannes

das zeigt quasi grafisch,

Johannes

ich kann es jetzt mal ins Bild halten hier,

Johannes

zeigt quasi grafisch

Johannes

die Abhängigkeiten zwischen den verschiedenen

Johannes

Dateien, wo die liegen und

Johannes

wer sich importiert und wie die

Johannes

aufeinander aufbauen und dann kann man eben sehr schnell

Johannes

da so einen Überblick bekommen,

Johannes

darüber, was mit was interagiert und was

Johannes

wohin gehört. Also schöne

Johannes

Kreisbeispiele hier.

Dominik

Wundervoll, das sieht ja richtig kreativ aus.

Dominik

Es sieht richtig schön aus.

Dominik

Zum Ausdruck an die Wand hängen, also als Kunst jetzt.

Dominik

Ja, zum einen das und zum anderen auch funktionale

Johannes

Kunst, wo man eben nachsehen kann,

Johannes

von wo nach wo man hin

Johannes

navigieren muss. Und auch

Johannes

interessant, weil es eben so

Johannes

auf eine gewisse Art und Weise die Architektur

Johannes

einer Software widerspiegelt,

Johannes

die ja sehr unterschiedlich sein kann. Also wenn man sich

Johannes

hier diese Screenshots anschaut, die sind ja zum Teil sehr unterschiedlich.

Johannes

Manche sind halt sehr flache Hierarchien.

Johannes

Die Screenshots werden wir auch nicken.

Johannes

Sehr breit, selbstverständlich.

Dominik

Das sind sehr gut aufgeteilt, das sieht man vielleicht auch so ein bisschen

Dominik

in Style, das ist ja ganz schön. Genau, genau, also

Dominik

es ist wirklich einfach eine Einsicht, die man

Dominik

sonst nur sehr schwer kriegen kann

Johannes

oder auch hier, also hier gibt es eins.

Dominik

Den musst du direkt mal in die Gruppe teilen. Ja, selbstverständlich.

Dominik

Wo man eben sieht, dass jedes Paket quasi

Johannes

gleich ist und jedes Paket hat auch so eine Testpunkt-Pi

Johannes

drin und das sind eben halt diese grünen Punkte hier

Johannes

und man sieht, okay, jedes Paket hat eins oder

Johannes

in einem anderen Projekt sind die grünen Punkte

Johannes

halt alle in einem großen Modul drin und

Johannes

man sieht, okay, die sind nebendran,

Johannes

die sind offenbar nicht integriert. Also es gibt

Johannes

einfach sehr schnell einen Überblick über die

Johannes

Struktur eines Projektes, was so

Johannes

an sich nicht so einfach

Johannes

zu finden ist.

Johannes

Das ist mein Pick für diese Woche.

Dominik

Ich habe auch einen Pick. Ich würde picken

Dominik

Oh My Git.

Dominik

Das ist ein Spiel, wenn man Git lernen will.

Dominik

Oh My Git? Ja, Oh My Git.

Dominik

Ich weiß gar nicht, in was das geschrieben wurde.

Dominik

Aber man kann es halt

Dominik

mit Git spielen, mit so Karten und lernt so ein bisschen

Dominik

über Git. Also natürlich auch so Beginner-Level und so,

Dominik

aber das ist halt relativ spannend, wenn man so ein bisschen

Dominik

Advanced-Git noch machen will.

Dominik

also, weiß nicht, jetzt ein Rebase, Interactive

Dominik

und dann irgendwie gucken will, dass man irgendwelche Commits

Dominik

stasht, dass dann irgendwie dann doch irgendwie die Message

Dominik

ändern und was man da nicht so alles

Dominik

machen kann, so ein bisschen zu verstehen, was das überhaupt

Dominik

ist. Cool, hört sich auch spannend an.

Dominik

Sehr nice, ja, also Gamification

Dominik

mit Git halt als kleines Spielchen,

Dominik

das ist schon irgendwie cool. Gitification.

Dominik

Ja, man sieht halt auch, wenn man das ein bisschen

Dominik

visualisiert und man kann da so Sachen klicken und das ist

Dominik

irgendwie ganz nett, also weil, ich meine, so Branches oder so,

Dominik

jemand, der so ein bisschen programmiert oder hat das

Dominik

ja irgendwann schon mal gesehen oder viele Leute haben

Dominik

halt dann Git nur zum Pushen oder Pullen verwendet

Dominik

irgendwann, dass man so ein bisschen, man kann echt

Dominik

tolle Sachen mitmachen, also spannende Sachen und

Dominik

ja, deswegen kann ich es

Dominik

interessant, um so ein bisschen Advanced dann noch zu machen.

Johannes

Und geht ja auch in die gleiche Richtung, ist ja spannend.

Johannes

Ja. Ähnliche Picks haben die so.

Johannes

Ja, ich habe,

Johannes

hat auch was mit Git zu tun.

Johannes

Lustigerweise.

Johannes

Ja, auch bei dem

Jochen

Backtail-Media-Pool-Request ist mir

Jochen

das dann untergekommen,

Jochen

weil ich

Jochen

hatte halt gar nicht gesehen, dass da

Jochen

irgendwelche

Jochen

normalerweise hat man

Jochen

immer so Linting-Steps oder so, wo man

Jochen

jetzt irgendwie Software testet

Jochen

oder so, das war da jetzt gar nicht.

Jochen

Da dachte ich mir, das ist schon mal ein bisschen komisch.

Jochen

Und dann hat irgendwie beim,

Jochen

bei GitHub hat dann irgendwie

Jochen

das Ding mich angemerkt, so, dein Code ist ja

Jochen

irgendwie, da sind ja die ganzen Linting-Geschichten nicht richtig

Jochen

und da ist noch was falsch und es ist falsch,

Johannes

du warst schon überrascht, weil du hattest doch

Johannes

Macht, was da drin definiert war. Genau, und ich dachte schon so,

Jochen

ja gut, so mache ich das halt, das ist doch normal und

Jochen

das ist doch okay. Und dann dachte ich so, ja,

Jochen

wie passiert das eigentlich, dass GitHub das weiß, dass das

Jochen

nicht okay ist. Und

Jochen

ja, dann wurde ich aber dann auch darauf hingewiesen, so

Jochen

ja, wir benutzen hier

Jochen

Precommit, benutzen das auch mal

Jochen

auch. Und dann,

Jochen

und das ist auch ein ganz, das ist glaube ich auch noch ein Projekt von

Jochen

Anthony Soti, ich weiß gar nicht, wie man den ausspricht.

Jochen

Und man definiert

Jochen

das quasi in so einer Art Konfigurationsdatei,

Jochen

was man da gerne hätte.

Jochen

Und dann sagt man

Jochen

Precommit install oder so und dann

Jochen

installiert es alle Abhängigkeiten, die man braucht,

Jochen

um diese Geschichten machen zu können lokal.

Jochen

Aber man muss die halt, diese Abhängigkeiten

Jochen

dann auch nicht mehr im Projekt haben. Man hat ja normalerweise

Jochen

auch mal so eine ganze Reihe von Dingen,

Jochen

ja, was weiß ich nicht, Black, Flag 8,

Jochen

dieses ganze Zeugs, auch im

Jochen

gleichen Projekt dann immer rumhängen und

Dominik

Es ist Death Dependencies quasi, Ersatz, oder?

Dominik

Ne, es ist nicht

Jochen

Death Dependencies. Death Dependencies sind ja auch nochmal

Jochen

andere Sachen, aber man hat halt diesen Kram

Jochen

dann da nicht mehr drin, sondern das, ich weiß gar nicht,

Jochen

dass ein eigenes Virtual

Jochen

Environment installiert wird. Ich weiß

Jochen

jetzt gar nicht genau, wie es dann technisch funktioniert.

Jochen

Auf jeden Fall ist es dann so, wenn man

Jochen

sagt, dann git commit oder so, dann läuft

Jochen

das dann halt automatisch durch

Jochen

und wenn es nicht

Jochen

richtig war, dann

Jochen

sagt es irgendwie, nee, kann nicht committen, weil da ist

Jochen

halt zum Beispiel irgendwie noch ein

Jochen

Flag 8 hat mir gesagt,

Jochen

da ist was faul oder es sortiert hier halt

Jochen

einfach mal die Imports um mit iSort oder es macht halt

Jochen

irgendwie formatierende Code. Man kann seine eigenen Regeln anlegen,

Dominik

also jedes Mal muss man über drüber was machen.

Dominik

Ja, okay. Genau. Der Dock Swing ist nicht lang genug.

Dominik

Ja,

Jochen

also das kannst du halt konfigurieren, wie du willst,

Jochen

aber es wird dann halt automatisch beim Commit gemacht.

Jochen

Ja, das ist schon auch der richtige Zeitpunkt.

Jochen

Das ist natürlich auch so ein bisschen hart.

Jochen

Ja, klar.

Jochen

Doch, es klingt länger als eine Zeiche.

Jochen

Das ist ja schon mal super.

Johannes

Das kann man ja relativ leicht hinfaken.

Johannes

Ja, genau.

Dominik

Aber das fällt ja schon mal auf, wenn er nicht da ist zum Beispiel.

Dominik

Ja, es ist natürlich relativ hart,

Johannes

aber es ist ja eigentlich schon auch der richtige Zeitpunkt.

Johannes

Also du kannst nicht committen, ohne dass alles in Ordnung ist.

Jochen

Genau, das heißt, es ist damit sichergestellt,

Jochen

dass nicht irgendwelcher Quatsch da drin ...

Jochen

Also wahrscheinlich kann man das dann auch noch irgendwie umgehen.

Jochen

Ist das eine Library oder was?

Jochen

Ja, das ist ein Projekt, das ist auch ein Kommandozeilentool.

Jochen

Also man benutzt

Jochen

das als Kommandozeilentool und dann sagt man im Grunde einmal

Jochen

pre-commit install und dann guckt es halt

Jochen

in diese Konfigurationsdateien, macht seine

Jochen

Magie und danach sind diese Git

Jochen

Hooks gesetzt. Aber das muss man quasi

Dominik

bei jedem Dev erstmal einmal installieren, damit das funktioniert.

Dominik

Ja, okay. Genau.

Dominik

Ja, spannend.

Dominik

Ja, fand ich auch gut.

Dominik

Ja, dann würde ich sagen, sind wir heute durch

Dominik

auch mit dem Thema und vielen Dank, dass ihr uns wieder dazugehört habt

Dominik

und egal wo ihr seid und morgens, mittags, abends, nachts

Dominik

und bleibt uns gewogen, hört uns gerne

Dominik

wieder, schaltet wieder rein und euch noch einen

Dominik

schönen, was auch immer, Tag, Nacht,

Dominik

wie auch immer. Bis demnächst.

Dominik

Alles klar, bis demnächst mal. Tschüss.