Transkript: Das Python Importsystem

· Zurück zur Episode

Vollständiges Transkript der Episode. Zeitstempel beziehen sich auf die Audiowiedergabe.

Dominik

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

Dominik

Die hatten wir letztes Mal aus Versehen ausgelassen.

Dominik

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

Dominik

Ja, was machen wir heute?

Dominik

Wir wollen heute über Imports reden.

Dominik

Hi Jochen.

Jochen

Ja, Liallo, willkommen Dominik.

Dominik

Hi Johannes.

Johannes

Ja, hallo, ich bin auch mal wieder da.

Dominik

Ja, wir kennen es ja alle schon.

Dominik

Ja, also über das Python-Import-System heute sprechen, vielleicht ein paar kleine News vorweg, wie wir das gerne tun und dann gehen wir so ein bisschen in die Details.

Habt ihr

News mitgebracht?

Johannes

Ja, also die einzige News, die ich habe, ist, dass Apple sich gerade den größten Pair-Unfug aller Zeiten einholt.

Johannes

Aber da ich kein Apple-Gerät habe, geht es nur ein kleines bisschen mehr.

Dominik

Okay, das Problem habe ich auch nicht.

Johannes

Jochan, erzähl du doch mal, wie viel ich das für dich hatte.

Jochen

Ja, nee, tatsächlich ist es pair-technisch, würde ich sagen, auch aus meiner Perspektive ein großer Unfall.

Jochen

Wenn man sich jetzt anguckt, was sie technisch tun, ist es nicht so furchtbar.

Dominik

Was ist denn überhaupt passiert?

Dominik

Vielleicht erstmal so die Story.

Jochen

Sie haben irgendwie war das eine Pressmeldung oder Sie scannen jetzt irgendwie.

Johannes

Das war eine Pressemeldung und es war eine technische Meldung, glaube ich.

Johannes

Dass sie jetzt Cesam angemacht haben, Content Scanning.

Johannes

Keine Ahnung, was es bedeutet.

Johannes

Jedenfalls will Apple jetzt in die Fotos reingucken und verbotene Inhalte finden.

Jochen

Ja, das ist natürlich so ein bisschen das.

Johannes

Mit modernster Technologie.

Jochen

Ja, es ist zum Glück ist es nicht das Schlimme-Technologie, was man halt auch nehmen könnte, aber sondern es ist halt irgendwas total Billiges, einfach nur Hashes und Bilder angucken.

Jochen

Also im Grunde nur gucken, ist das ein Bild, das auf irgendeiner Liste draufsteht von verbotenen Bildern.

Johannes

Ja, aber haben die nicht auch gesagt, dass sie so neuronale Netze drüber laufen lassen und dann Sachen erkennen wollen?

Johannes

Er ist der nächste Schritt.

Jochen

Ja, ja, genau.

Jochen

Das ist halt der PPA-Gau-Teil.

Johannes

Ja, genau, und das ist auch so ein bisschen der Präzedenzfeier.

Johannes

Früher war Apple ja immer so, ja, es ist auf deinem Gerät und es ist alles sicher und wir können da gar nicht.

Johannes

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

Jochen

Ja, das also entweder war es ein Unfall, sozusagen, dass jemand nicht darüber nachgedacht hat, dass wenn man das so sagt, dass das dann genau das auslöst bei den Leuten.

Jochen

Oder ist es halt irgendwie, aber das kann ich mir auch nicht vorstellen, weil das wäre ja so ein abrupter Strategiewechsel, das wäre auch schon irgendwie komisch.

Jochen

Also insofern nehme ich mal an, dass es eher ein PA-Unfall ist.

Aber man weiß es nicht.

Johannes

Aber es ist ein Präzedenzfall.

Johannes

Das Apple scannt jetzt Inhalte auf euren Geräten.

Dominik

Vielleicht, dass sie vorbereitet und dafür, dass sie auch in China, den Markt weiter

Jochen

öffnen wollen.

Jochen

Das machen sie ja, das machen sie ja auch sowieso schon immer.

Jochen

Also man kann ja auch in der Fotos-App irgendwie nach, weiß ich nicht, Hund gucken oder nach Personen oder sonst irgendwas.

Jochen

Und da ist tatsächlich, das ist halt die gute Technik sozusagen, die da verwendet wird.

Jochen

Und ja, man kann sogar.

Johannes

Aber auch da sind viele Sachen falsch einsortiert.

Jochen

Ja, aber sie sind ja auch halbwegs schnell und so.

Jochen

Man kann auch nach Vaccination oder so suchen und dann findet es den Impfpass, wenn man den fotografiert hat und so.

Jochen

Also das ist tatsächlich, also da machen 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 und ja, und halt es wird auch nicht an irgendwen geschickt.

Jochen

Und jetzt ist das natürlich eine andere Sache.

Jochen

Wenn es jetzt irgendwas von den verbotenen Bildern findet, dann sagt es irgendwie, dann petst das.

Die gleichen verbotenen Bildern.

Ja.

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äzedenzfall, weil das haben sie bisher nicht gemacht.

Na gut, mal sehen, wie sich das entbietet.

Johannes

PR-mäßig ist es auf jeden Fall ein mittleres Design.

Dominik

Du hast das von deinem Impfpass gesagt.

Dominik

Das heißt, du bist auch jetzt durch, endlich.

Vielleicht.

Jochen

Ich bin schon lange durch.

Dominik

Ich auch jetzt seit einer Woche.

Dominik

Yay!

Tja.

Johannes

Also hier auch nochmal der Aufruf an alle Zuhörer, lasst euch bitte impfen.

Jochen

Ja.

Das ist eine gute Idee.

Johannes

Wie viele haben wir jetzt verloren?

Die Zuhörer

Dominik

will ich.

Dominik

Es gab so einen tollen Rand-Post von Linus Torwalz da, glaube ich auch.

Johannes

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

Ja, genau, der braucht der Torwart.

Johannes

Ja, Linus Torvalds benutzt noch mehr ausgewählte Wörter.

Um das zu umschreiben, sagen wir es mal so.

Jochen

Ja, aber inhaltlich doch, ja, ja.

Inhaltlich war das Zusammenfassung, ja.

Dominik

Ja, haben wir noch Python-News?

Jochen

Ja, also eine News, die so ein bisschen anschließt an unsere letzte Episode zu Packaging, ist, dass tatsächlich, das weiß ich vielleicht schon länger klar, aber mir war es halt noch nicht klar, ab drei Python 3.111 wird DIS-Tutils halt deprecated.

Jochen

Und das heißt, man muss sich da an der Stelle dann halt mal was überlegen, was man dann so tut.

Johannes

Aber es gibt auch so viele Alternativen.

Jochen

Ja.

Johannes

Diverse Alternativen.

Jochen

Also die Pakete, die jetzt halt so ein richtiges Problemchen bekommen, sind halt sowas wie NumPy und SciPy und so, weil die haben nämlich, die Erben nämlich von Distutils und haben da Extensions für gebaut und damit bauen sie halt alles.

Ja, okay.

Jochen

Und ja, also die gucken sich gerade andere Sachen an.

Jochen

Und tatsächlich gibt es da, also haben sich zum Beispiel CMAC angeguckt oder halt auch Mason heißt das irgendwie.

Jochen

Und tatsächlich, also ich manchmal, also sogar relativ häufig, ich habe ja hier so ein M1 Mac auch und da passiert das durchaus, also wenn die Python-Version hochgeht oder so, ist es eigentlich immer so, dass wenn ich dann Projekte habe, die abhängig haben zu NumPy, Appandas oder so, dass das ganze Zeug kopiliert werden muss.

Jochen

Weil meistens sind das Update von Python halt schneller bei mir, als die Wheels draußen sind.

Jochen

Und dann muss ich das halt kompilieren und dann denke ich mir so, oh nein, ah, jetzt dauert das wieder ein paar Minuten.

Jochen

Und tatsächlich dauert das bei NumPy, glaube ich, sieben Minuten irgendwie, mit dem klassischen jetzt des Utils.

Jochen

Und tatsächlich aber auf Mason-basierten, hatte jetzt jemand schon, ich habe leider einen Namen vergessen, angefangen damit rumzuexperimentieren, dauert es halt irgendwie noch vier Sekunden oder so.

Jochen

Also es ist hauptsächlich irgendwie Bauzeit, die da benötigt wird.

Jochen

Also insofern, mal gucken.

Jochen

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

Das wäre doch ein sehr positiver Effekt von dieser Deprecation.

Jochen

Genau.

Jochen

Und ansonsten, ja, ich glaube, 311 ist in der Beta.

Jochen

310 ist in der Beta.

Jochen

Ich glaube, jetzt um den drehenden Richtung war das.

Genau.

Jochen

Die Zahlen gehen so schnell hoch.

Ja, ja.

Freu mich schon.

Dominik

Ich habe mal den GitHub-Copilot, den wir irgendwie auch schon mal kurz erwähnt hatten, ausprobiert.

Dominik

Da habe ich jetzt auch eine Bita-Einladung bekommen.

Dominik

Ich muss sagen, das ist echt toll.

Dominik

Also ich habe noch nie so einen super Effekt von einer KI angefangen.

Ich finde es echt nice.

Dominik

Ich gebe mal ein, also ich habe jetzt die BS-Code-Extension dafür benutzt, sowas wie Define Ends, Fibonacci oder sowas und dann warte ich auf das Autocompletion und dann schreibt ihr mir die komplette Funktion inklusive Doc Strings und Type-Anotations als Typend und ich drücke 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, beispielsweise irgendwie HTTP-Methode.

Dominik

Ich habe jetzt irgendwie ein Get geschrieben, ne, irgendeine Klasse, Define, Get, bla bla bla.

Dominik

Und danach fange ich an mit Define und dann steckt er mir jetzt nichts vor Post zu definiert.

Dominik

Und zwar auch mit genau den richtigen Parametern und so.

Dominik

Das sind solche Sachen.

Dominik

Das ist halt einfach, der lernt halt aus seinem eigenen Code raus und das ist, wow.

Dominik

Also ich bin wirklich beeindruckt davon, was das so macht.

Dominik

Also das ist so ein bisschen, man braucht keine Snippets mehr, ja, wenn man irgendwie Snippets-Sammlung hat, sondern man nimmt halt einfach dann das individualisierte Snippet 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 GPT-3?

Ja, ja, das ist GPT-3.

Jochen

Ja, also da geht einiges.

Jochen

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

Jochen

Es ist so ein kleiner Abschweif, aber vielleicht ja auch nicht so uninteressant.

Jochen

Ich meine, Text ist ja im Grunde deutlich, also es dachte man ja aber, es ist irgendwie oder Sprache, ist halt schwierig, aber tatsächlich ist das irgendwie einfacher als andere Probleme.

Jochen

Und wisst ihr, wie diese Modelle trainiert werden?

Nein.

Jochen

Da kann man halt, das nennt sich, also das ist halt etwas, was sich halt männlich 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, ohne irgendwelche gelabelten Daten haben zu müssen.

Jochen

Was man ja normalerweise ist, ist immer das Problem bei, irgendwie, wenn man so überwachte Modelle, also so in Anführungsstrichen normale Machine Learning-Modelle halt trainiert, dann braucht man halt Trainingsdaten und damit meint man üblicherweise halt Daten, wo man Labels angeschrieben hat, wie zum Beispiel jetzt, wenn man jetzt Bilder hat, sowas ist ein Hund, das ist eine Katze und das ist, weiß ich nicht, irgendwas dazwischen oder so.

Jochen

Und bei Texten hat man das ja auch, da gibt es dann ein klassisches Problem wie Textkategorisierung, da hast du halt einen Text und dann steht halt zum Beispiel so diese News, Reutersartikel, dann steht dran, das ist jetzt Sport oder das ist Politik oder das ist halt irgendwas anderes.

Dominik

Cool wäre ja so das Label wie, will ich lesen, will ich nicht lesen.

Jochen

Kann man auch alles machen.

Spezifisch für dich, Damit.

Jochen

Wenn du, wenn du da Trainingsdaten hast, dann kannst du Modelle drauf trainieren, die dann auch wahrscheinlich halbwegs gut funktionieren sollten.

Jochen

Also das geht alles.

Jochen

Aber das Problem ist natürlich, dass für die meisten Probleme, die man so hat, hat man halt eben keine Trainingsdaten.

Jochen

Und das Erstellen von Trainingsdaten ist halt so aufwendig, dass sich das dann meistens nicht lohnt, das zu machen.

Dominik

Wie viel braucht man denn da ungefähr?

Dominik

100.000?

Jochen

Also kommt darauf an, wie gut es sein soll.

Jochen

Und dann entsprechend, weil halt unter Umständen schon Millionen von Beispielen 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

Nee, genau.

Jochen

Also einmal, du hast gar nicht genug Beispiele, um sie labeln zu können, dann musst du die erstmal besorgen, dann musst du es auch noch irgendwie labeln, dann hast du Fehler in den Labels, weil halt die Leute das nicht perfekt gemacht haben und dann musst du das irgendwie kontrollieren und dann schwuppdiwupp, hast du irgendwie so ein Redaktionssystem und eine Redaktionen, eine technische Redaktion und dann Prozesse und keine Ahnung und Abstimmungen und das kostet ein Schweinegeld und das macht dann halt keiner so einfach so.

Jochen

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

Jochen

Und ja, aber man kann halt aus Text auch lernen, ohne diese ganzen Geschichten haben zu müssen.

Jochen

Also, das ist seit es gab ein Paper 2017, ist das, glaube ich, irgendwie Attention is all you need.

Jochen

Da wurde halt diese Transformer-Architektur eingeführt.

Jochen

Und diese Dinger funktionieren auf Sprache halt total super.

Jochen

Und die funktionieren so, dass man quasi Texte nimmt und lässt halt jetzt Wörter weg aus den Texten.

Jochen

Und lässt das Modell jetzt vorhersagen, okay, welches Wort gehört denn an die Stelle?

Jochen

Und dann bestraft man das, dann sozusagen hat man halt Feedback.

Jochen

Wenn das Modell jetzt ein anderes Wort, als da stand, vorher hersagt, dann sagt man, okay, das war jetzt falsch.

Jochen

Und dann kann man halt irgendwie ein Gradient bestimmen, in welche Richtungen müssen sich die Gewichte ändern von dem Modell und dann propagiert man die halt zurück und dann ändert man das Modell ein bisschen in die Richtung, dass es das halt beim nächsten Mal besser macht.

Jochen

Und das macht man dann ganz oft und dann kann es halt aus einem Text, ohne dass man da irgendwelche Labels explizit für bräuchte oder so, Dinge lernen.

Jochen

Und zwar fast alles.

Jochen

Und das ist halt das Interessante.

Jochen

Das ist wirklich gut.

Jochen

Weil man kann halt Text, man kann das gesamte Internet nehmen.

Jochen

Und dann lernt es halt lustigerweise eben nicht nur irgendwie so stumpf, welches Wort da die entsprechend höchste Wahrscheinlichkeit hat, da zu stehen, sondern um das gut machen zu können, lernt es halt auch eine ganze Menge Konzepte und wie Dinge in Verhältnissen stehen und solche Sachen.

Ach, auch Kontext tatsächlich.

Dominik

Das ist halt spannend.

Dominik

Also zum Beispiel, das Plugin schafft das halt auch, Kommentare richtig zu schreiben.

Dominik

Das heißt, ich fange mit einem Kommentar an, zwei Worte und das macht einen relativ guten Vorschlag, für was da stehen sollte.

Jochen

Ja, ja, ja, genau.

Jochen

Und das ist eine Geschichte, die man dann halt auch machen kann, dass man sagt, okay, so das ist ein Text, der Rest ist halt Lücke, dann füll mal.

Jochen

Und dann kommen da auch schon ganz interessante Geschichten bei raus.

Jochen

Also man, also wenn sich diese generierten Texte anguckt, dann ist es halt schon immer so, dass man irgendwann wird so leicht absurd oder sehr verdreht irgendwie und merkt so, okay, so ganz, schon so ein bisschen neben der Spur.

Dominik

Ja, aber man kann es halt auch schnell kaputt

Johannes

machen, wenn man dann auch so ein bisschen, oder?

Dominik

Wenn man halt das so ein bisschen kalt.

Dominik

Kann man es da schnell kaputt machen, dann kannst du mal so.

Johannes

Ja, ich habe noch was dazu gelesen, was in eine andere Richtung geht, dass es jetzt wohl eine große Anzahl inzwischen von wissenschaftlichen Veröffentlichungen gibt, denen man durch Analyse ansehen kann, dass sie eben nicht von einem Menschen geschrieben würden, sondern von einem neuronalen Netzwerk.

Johannes

Und die Technik, die die da verwendet haben, die ist total witzig, weil diese Netzwerke für so Paper-Generierung und für Textgenerierung generell, die sind, die werden wohl bestraft, wenn sie Plagiate erzeugen.

Johannes

Weil das willst du natürlich nicht, ja, du willst natürlich nicht einen Paper einrechnen, was dann als Plagiate abrechnet.

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 sie eben kein normaler Mensch schreiben würde.

Johannes

Und dann haben sie eben gesucht, wie oft dieser Begriff Colossal Information in Papern vorkommt und die dann eben genauer angesehen und die waren alle, hatten eben alle diese Anzeichen von erzeugten Papern.

Johannes

Und das ist so ein bisschen jetzt quasi die Kehrseite von Copilot, dass die eben nicht nur, man muss es dann trotzdem noch für was Gutes einsetzen und nicht für.

Ja, da müssen wir

schon das vorher positiv beitragen.

Jochen

Ja, aber genau, was ich eigentlich, was ich noch erwähnen wollte, war, genau, man kann jetzt halt sozusagen Modelle trainieren auf allen Texten, die es im Internet gibt und die lernen halt tatsächlich da auch Dinge dann raus und das ist natürlich total super.

Jochen

Und das geht bei Sprache vor allen Dingen deswegen, weil man halt eine endliche Anzahl von möglichen Füllern sozusagen für die Lücken.

Was?

Johannes

Noch an Chomsky würde dir widersprechen, Jochen.

Jochen

Ja, ja, gut.

Jochen

Aber man kann sich da ja beschränken, kann ja sagen, okay, meine Sprache hat nur 20.000, 30.000 Vokabeln und das war's.

Jochen

Und so größer ist mein Vocabulary einfach nicht.

Ja, okay.

Johannes

Und indem man nur ein Wort rausnimmt, ist natürlich klar gewesen.

Jochen

Und unter denen wird auch eins sein, das hinreichend nah dran ist.

Jochen

Und dann kannst du eben allen Worten eine Wahrscheinlichkeit zuweisen.

Jochen

Du kannst halt sagen, okay, das ist jetzt sehr, sehr unwahrscheinlich und das ist jetzt irgendwie, das geht.

Alle sehr unwahrscheinlich.

Dominik

Es gibt ein bestimmtes Wort wie F, das, was überall hin passt.

Jochen

Ja, klar.

Jochen

Aber das Modell ist dann halt auch, das Modell, das damit trainiert wird, passt dann aber nicht mehr überall hin, wenn du das als akzeptiert.

Ich kenne so Leute.

Jochen

Jedenfalls, genau.

Jochen

Also mit Sprache geht das total super.

Jochen

Und eben, Co-Pilot ist halt dann quasi auch eine Folge.

Jochen

Das Tolle ist, dass man jetzt Modelle, die darauf trainiert sind, kann man jetzt mit ganz wenig Trainingsbeispielen auf das Problem sozusagen, dass man wirklich, dass man wirklich hat, adaptieren.

Jochen

Also da braucht man dann nur noch ein paar Trainingsbeispiele, also nicht mehr viele.

Dominik

Ja, ich glaube auch, also er macht das tatsächlich anhand des Reposites, was du gerade auf hast.

Dominik

Kann er schon gucken und kann da schon dann die Completion zum Beispiel oder die Vorschläge anpassen auf das, was du da gerade machen willst.

Dominik

Und das ist schon echt wow.

Jochen

Naja, und das ist halt natürlich total toll, weil das dann, das dann halt bedeutet, dass du im Grunde dieses Trainingsproblem, Trainingsdatenproblem loswirst.

Jochen

Und ja, eine ganze Menge Anwendungsfälle plötzlich von zu aufwendig, unlösbar, lohnt sich nicht, in Richtung, ja, kann man schon mal probieren wandern und dann ist es natürlich toll.

Jochen

Und ja, also da wird es hier eine Menge interessante Anwendungen geben.

Dominik

Also gerade für die ganzen Frauenprogrammiere unter uns.

Dominik

Also das ganze Zeugst du mal rum, das geht halt einfach jetzt viel automatisierter.

Dominik

Die Schwierigen sagen es mal immer noch selber rein.

Das ist schlecht für die Auftragsprogrammiere.

Johannes

Finde ich nicht cool.

Dominik

Ja, das kann schon sein.

Jochen

Ja.

Jochen

Aber genau, das Problem ist aber jetzt, dass man das nicht machen kann für, also was halt, also man würde, wäre sehr viel weiter, wenn man das jetzt auch für zum Beispiel Bilddaten machen könnte.

Jochen

Also, und tatsächlich ist es wohl so, dass es da ein, gibt es auch inzwischen Forschung zu, das ist halt tatsächlich der Weg, also man hat sich ja das oft lange, oder ich erinnere mich daran, dass es mal völlig unklar war, wie das eigentlich funktioniert, wie lernen Kinder eigentlich sozusagen so schnell Dinge, man versteht es nicht.

Jochen

Sie sehen eigentlich zu wenig Trainingsbeispiele für das, was sie da lernen.

Jochen

Und tatsächlich lernen sie ja auch, also auch sowas, was einem die Forschung sagt, man schwierig, manchmal Schwierigkeiten hat das einfach so zu akzeptieren, aber die sagt halt, ja, also das meiste, was Menschen so lernen, lernen sie halt so in den ersten neun Monaten und alles, was danach kommt, ist halt so, naja Gott.

Jochen

Also ich meine, so Details.

Jochen

Also die wesentlichen Dinge sind bis dahin gelernt.

Jochen

Dann fragt man sich ja, wie machen die das denn?

Jochen

Ich meine, Kinder in dem Alter verstehen einfach gar nichts.

Jochen

Die kennen auch keine Worte für nichts.

Jochen

Wieso können die denn so viel lernen?

Jochen

Wie soll das gehen?

Jochen

Das ist irgendwie alles seltsam.

Jochen

Und tatsächlich ist es wohl so, dass die halt auch so eine Art Self-Supervised Learning machen und quasi genau das gleiche Prinzip irgendwie, also sie haben sehen halt was und Dinge passieren und dann betrachten sie das sozusagen als eine Art Lückentext und füllen das dann halt und das funktioniert.

Dominik

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

Jochen

Keine Ahnung.

Dominik

Ja, aber da zieht das dann irgendwo aus dem Erd da, irgendwelche Informationen und Stoff das dann dazwischen.

Dominik

Und deswegen hast du ja auch so, ich weiß nicht, ob ihr es kennt, wenn ihr irgendwo müde seid oder sowas, dann werden bestimmte Sachen ja auch einfach ersetzt.

Dominik

Der Kopf macht das ja sehr gerne, dass der bestimmte Flecken, die nicht so ganz klar sind, dann mit Sachen überschreibt.

Dominik

Also einige Leute, die haben dann auch innere Stimme, die dann auf einmal selbst vervollständigt, die sie nur so hype gehört haben.

Dominik

Oder das kannst du auch mit optischen Informationen machen oder mit anderen optischen Signalen.

Dominik

Und das ist halt super spannend tatsächlich.

Dominik

Und wenn das halt self-supervised learning ist, dann ist ja auch klar, dann hast du so ein Lückenbild.

Dominik

Das ist so ein bisschen so, du hast ein Foto, da fehlt ein Teil und dann wird das automatisch ersetzt.

Dominik

Das ist ja spannend, wenn die KI das kann, dann kann man sagen, machst du ein Hochzeitsbild von dir, dann kannst du irgendwie deinen Partner rausschneiden, dann kannst du den idealen Partner auf einmal sehen.

Johannes

Ah ja, und so ist also dieses Python-Import-System entstanden.

Das ist ja spannend.

Nein, nein.

Jochen

Nur ganz kurz, also das, was halt momentan nicht geht, was man nicht hinkriegt, was halt total toll wäre, wenn man es irgendwie hinkriegen würde, also vielleicht hat ja irgendwann jemand eine Idee, ne?

Jochen

Also es ist halt das große, ungelöste Problem an der Stelle, ist halt, wenn du jetzt ein Bild aus einem, einen Teil aus einem Bild rausnimmst und sagst, so, das ist jetzt leer.

Jochen

Also einmal, man kann halt irgendwie die Menge an Bildern, die halt an der Stelle möglich werden, nicht aufzählen, nicht so richtig.

Und dann ist es so, selbst wenn man sich Einheit ist, selbst wenn man sich irgendwie beschränkt, weiß man nicht, so jetzt hat man zwei Sachen, die eigentlich offensichtlich nichts damit zu tun haben mit dem Bild, das man eigentlich an der Stelle gerne hätte.

Jochen

Welche Wahrscheinlichkeit weist man ihnen zu und wie ist der Gradient in welche Richtung?

Dominik

Vielleicht braucht man da den Kontext für, weil wenn du einen Kontext hast, in dem das drumherum gestellt werden soll, der halt selber ein Objekt ist, das viele schiene Informationen beinhaltet, dann ist es besser, diese Menge an abzählbaren Elementen zu bilden und das entsprechend herauszusuchen mit der höchsten Wahrscheinlichkeit.

Dominik

Das heißt also, ohne Kontext ist das wahrscheinlich nicht so einfach möglich, dass du einfach so ein Bild machst, das dann gut trifft.

Dominik

Aber wenn du Informationen über den Kontext hast, 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, was dann irgendwas vorhersagt an der Stelle.

Jochen

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

Jochen

Hat das jetzt die Wahrscheinlichkeit 0,376 oder 0,652?

Jochen

Und das macht ja einen Unterschied fürs Training.

Jochen

Aber es ist halt völlig unklar, wie man da die Wahrscheinlichkeit ausrechnen soll.

Dominik

Ja, vielleicht braucht man dafür echt einen Kontext für das, der es eingesetzt werden soll.

Dominik

Das ist, glaube ich, gar nicht so.

Jochen

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

Dominik

Das war jetzt auch gerade wieder so ein Ding, was halt passiert, wenn man halt den Kontext nicht hat, dann passiert sowas wie ein Relative Import Beyond Top-Level Package oder so.

Oh, okay.

Ah, das

Johannes

ist so ein Syntax-Fehler quasi.

Jochen

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

Jochen

Ja, Import-System ist auch voll interessant.

Jochen

Na gut.

Dominik

Ja, Entschuldigung, es war gerade ein Versuch, da so ein bisschen hinzukommen, weil wir wollten ja über das Import-System tatsächlich reden und wie man das in Python macht.

Dominik

Und ich glaube, als Basis irgendwie das so ein bisschen zu verstehen, es gibt einen super tollen Blog, den ich auch erst letztens entdeckt habe, der 10.000 Meters heißt, der irgendwie auf Hacker News nochmal gefeatert worden ist.

Dominik

Und da hat ein Mensch namens Viktor Skorzdow, wenn ich ihn richtig ausspreche, einen Artikel geschrieben, wie das Python-Import-System funktioniert.

Dominik

Und das hat ja so ein bisschen erklärt, das ist sehr spannend zu lesen.

Dominik

Packen wir auf jeden Fall in die Shownotes.

Dominik

Und ja, wie funktioniert denn das eigentlich?

Dominik

Was ist denn das Python-Import-System eigentlich?

Johannes

Ich habe diesen Artikel auf Hacker News gesehen und auch die Diskussionen dann so ein bisschen angeguckt und da ist mir aufgefallen, dass das doch tatsächlich erstaunlich viel komplizierter ist, als man das so denkt oder als man das so im Kopf hat.

Johannes

Was mir gar nicht so aufgefallen war, weil ich offenbar nicht alle Features benutze, die das E-Star so gibt.

Also vielleicht ganz

Dominik

kurz, bevor wir darauf einsteigen, was ist denn überhaupt das Problem damit oder könnte das sein?

Dominik

Oder wir haben irgendwie so eine Story gehört, dass man lange dauert, wenn man doof sein kann und genau.

Dominik

Worum geht es denn da überhaupt?

Johannes

Und warum braucht Python ein Importsystem überhaupt?

Johannes

Das ist ja auch eine spannende Sache.

Johannes

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

Und zum Teil besser und zum Teil schlechter.

Ja.

Johannes

Wer will anfangen?

Jochen

Also ich würde sagen, ja, vielleicht kann man ja genauso anfangen wie der Artikel.

Jochen

Was passiert denn, wenn man sagt Import M?

Warum sagt man das denn überhaupt ja auch?

Jochen

Naja, weil.

Johannes

Warum sagt man Import M?

Jochen

Ja, es gibt natürlich Build-Ins, aber nicht alles sind Build-Ins und manchmal möchte man halt irgendwo Funktionen oder Klassen oder sonst irgendwas verwenden.

Dominik

Oder man möchte einfach seinen Code trennen und nicht alles in eine einzige Pfeile.

Johannes

Also man möchte halt irgendwas verwenden, was nicht in der aktuellen Datei definiert ist.

Johannes

Und jetzt könnte ich verschiedene Dinge.

Johannes

Ich könnte mir die Datei nehmen und sie e-valen.

Könnte ich machen.

Ja.

Johannes

Wäre auch möglich, oder?

Johannes

Wäre auch, würde er auch

Jochen

ein bisschen, oder?

Jochen

Effekt irgendwie.

Ja, genau.

Jochen

Aber das überschreibt dann natürlich manchmal Sachen, wenn ich jetzt irgendwie zum Beispiel da drin halt, wenn ich jetzt halt einen aktuellen.

Johannes

Ja, vor allem, wenn man das rekursiv macht, weil das müsste dann auch immer weiter funktionieren.

Jochen

Ja.

Jochen

Wenn man so Counter-Variablen hat oder so, die sind dann wahrscheinlich hinterher anders.

Johannes

Vielleicht, ja, vielleicht.

Johannes

Ja, oder auch Namen, die einfach gängig sind, werden vielleicht eventuell überschrieben.

Dominik

Ja, aber das ist ja bei Python macht er ja auch irgendwie sowas, ne?

Dominik

Das macht ja so ein Name-Space wieder.

Dominik

Ja, genau.

Das müsstest du dir

Johannes

dann, also wenn du einfach die Datei lädst und ausführst, also E-Ware drauf machst, dann brückst du halt erstmal alles in die Hand.

Johannes

Und da wäre dann hätte man dann auch wieder das Problem mit dieser Rekursion, die müssen wir auch irgendwie lösen, weil du musst ja dann eventuell noch mehr Sachen derweil importieren und e-wählen und vielleicht hast du ja sogar das Problem, dass du es zyklisch machst.

Dominik

Aber das Problem haben wir ja in Python auch, das Problem

Johannes

haben wir in Python auch, ja, aber müssen wir mal überlegen, wie das das macht.

Johannes

Aber in anderen Sprachen, um da noch kurz drauf anzugehen, braucht man das ja nicht.

Johannes

In Java oder in C<unk> macht man es ja nicht, dass man einfach andere Dateien da rein kopiert, weil da ja die Organisation anders ist.

Johannes

Da braucht man ja quasi keine Objekte in der Hand, sondern nur einen Verweis auf die entsprechenden Stellen im Code.

Johannes

Das heißt, bei denen funktioniert das Importsystem halt, weil das während des Kompilierens passiert, deutlich anders als in Python.

Jochen

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

Jochen

Also wenn ich in C sage include, ja, das wird einfach dann so getan, als wäre das eine Datei.

Johannes

Genau, aber wenn du, wenn du zum Beispiel in C inkludierst ja normalerweise nur Punkt H-Dateien.

Johannes

Und da sind ja keine Definitionen drin, da sind ja nur Deklarationen drin.

Johannes

Da ist nur, da steht nur drin, es gibt etwas, was heißt so und so.

Johannes

Und das ist das Einzige, was du an der Stelle da reinkriegst.

Johannes

Das Zusammenführen, was dann tatsächlich der Code ist oder was diese Werte sind, das passiert erst später im Link-Vorgang, wenn du schon alles kompiliert hast.

Johannes

Und diese Phasen 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 dann jetzt.

Johannes

Und was viele Leute vergessen, wenn du Define schreibst, wenn du eine Funktion definierst, wenn du eine Funktion erstellst, dann ist das Code, der ausgeführt wird.

Johannes

Das ist ein Befehl an Python und der heißt, merk dir mal, unter dem Namen, keine Ahnung, Fun.

Johannes

Ein Code-Objekt, was folgende Eigenschaften hat.

Johannes

Es ist Callable und dieser Callable hat folgende Parameter und dann steht der Code drin und so weiter und so fort.

Johannes

Und auch bei Class, ja, wenn du Class als Schlüsselwort, wird ja erstmal alles ausgeführt, was da drin ist.

Johannes

Das heißt, du kannst da prinzipiell Code drin haben, der Sachen tut, was ja auch an vielen Stellen sehr wichtig ist, was du aber in anderen Systemen nicht hast.

Johannes

In der Java und in der C.

Johannes

Hast du das nicht, das wird nicht ausgeführt.

Johannes

Es wird zum Teil ausgeführt bei C, weil du da diesen komischen Pre-Processor hast.

Johannes

Und weil der auch so konstant Optimizations versucht schon mal zu machen.

Johannes

Aber generell wird C-Code erst ausgeführt, wenn du das Programm startest.

Johannes

Und das ist bei Python.

Johannes

Ja, also diesen 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 auch Sachen ausführen.

Johannes

Was manchmal komisch ist und manchmal gewünscht und manchmal überraschend.

Jochen

Ja, also das ist manchmal, also tatsächlich, wenn Sachen importiert, dass dann halt alles in dem Modul ausgeführt wird, was auf dem Top-Level ist, das ist halt schon manchmal eher überraschend und dann, ja.

Dominik

Warum passiert das denn auch?

Dominik

Warum wird das denn ausgeführt?

Dominik

Also wenn man jetzt einen Import schreibt, Import M von irgendwo, was dann einfach.

Johannes

Einfach nur Import M, also wirklich nur diese Zeile Import M.

Was passiert dann?

Ja, das ist eine gute Frage.

Johannes

Und auf den ersten Blick ist es, ist es so, finde ich, so ein bisschen offensichtlich, was da passiert.

Johannes

Und auf den zweiten Blick ist es dann tatsächlich doch nicht so offensichtlich, wie eben dieser Artikel, glaube ich, uns allen demonstriert hat.

Johannes

Also für mich bedeutet Import M, suche eine Datei, die m.py heißt und gib mir den Inhalt davon als Modul.

Dominik

Oh, das wäre aber ein Skript.

Dominik

Und wir können auch ein Modul laden, was halt, wenn ein Modul heißt, das M heißt, dass dann ein Verzeichnis ist oder sowas?

Dominik

Oder was ist ein Modul?

Das wäre dann

Jochen

wieder was anderes, oder?

Johannes

Aber ein Verzeichnis ist ja auch nur so eine Art Datei.

Johannes

Verzeichnis ist ja auch nur ein Verweis auf die InitPi-Programm.

Johannes

Also es gibt

Dominik

Skripte, Module und Packages.

Dominik

Und was ist denn überhaupt der Unterschied?

Dominik

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

Das ist schwer

Johannes

zu sagen.

Johannes

Ich finde es schwer zu sagen, weil für mich dieser Unterschied wirklich minimal ist.

Johannes

Das eine ist halt eine Datei und das andere ist ein Verzeichnis, aber das Verzeichnis selber hat ja keinen Inhalt und deshalb tut man so, als ob die InitPie, die da drin ist, das der Inhalt dieses Verzeichnisses ist.

Dominik

Genau, der Init Pie kann man auch sowas wie All dann definieren.

Dominik

Das heißt, wenn man zum Beispiel sowas wie Inport-Assetz

Jochen

überall, kannst du auch eine einzelne Datei machen.

Johannes

Kannst du überall definieren.

Ja, okay.

Johannes

Kannst du auch Slots definieren?

Johannes

Das ist auch, kannst du auch überall machen.

Ein Slot?

Johannes

Ja, das sind solche Sachen, die beim Import mitgebracht werden sollen.

Genauso wie All, ja.

Johannes

Wenn du All definierst und dann machst du vom M Import-Stern, dann kriegst du alles das, was in All drinsteht.

Johannes

Also Unterstrich, Unterstrich, All, Unterstrich, Unterstrich, um es jetzt mal hier korrekt zu sagen.

Dominik

Dann, dann, all, dann, dann.

Johannes

Das ist ein sehr guter Mechanismus, den sieht man sehr selten, weil Import Sternen ja so

Dominik

verpönt ist.

So gerne gesehen wird.

Es riecht.

Johannes

Das hatten wir schon in der ersten Vorlesung quasi in Informatik 1 hat uns unser Professor schon gesagt.

Johannes

Ja, man kann Using Namespace Standard nehmen und dann kann man mal gucken, wie viele Symbole da importiert werden und es waren irgendwie 13.000 oder sowas.

Johannes

Und das kannst du in Python natürlich auch machen, ja.

Johannes

Kannst du auch From Stern, Import-Stern probieren, ja?

Johannes

Kriegst du halt auch 100.000 Sachen rein.

Deshalb ist Import Stern, habe ich noch gar nicht probiert.

Johannes

Nee, nee, Vom Stern, Importstern geht nicht.

Johannes

Aber so die, so quasi, wenn du es dir vorstellst.

Johannes

Importstern heißt halt, hol alles aus diesem Modul oder aus dem Package und gib's 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, die man eigentlich gar nicht haben möchte.

Johannes

Oder Imports, die, die, die dieses Modul macht, die hast du dann auf einmal auch selber importiert.

Dominik

Subdependencies quasi.

Genau.

Johannes

Also wenn du in der M.py, so wie wir es jetzt eben drin hatten, wenn du da Import, keine Ahnung, Import X machst und dann machst du vom M Import Stern, hast du auch X importiert.

Johannes

Weil das halt im Modul M dann schon drin ist.

Dominik

Und das ist genau der Grund, warum man dies stern nicht machen soll, weil man nämlich nicht weiß, was da drin ist und man halt dann alle.

Dominik

Weil du viel gab bei einem Lokal irgendwo überschreiben würde.

Dominik

Und wenn mehrere Module oder Pakete dasselbe Namen definieren für irgendwas, was ja durchaus mal vorkommen kann, dann weiß man nicht mehr genau, was unter dem Namen jeweils identity ist.

Johannes

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

Johannes

Ja, wir sprechen jetzt schon die ganze Zeit über, aber wir wissen es immer mehr.

Dominik

Wir wissen aber immer noch nicht genau, was der Unterschied zwischen Modul und Paket ist.

Johannes

Ja, also ich glaube, das eine ist eine Datei und das andere ist ein Verzeichnis.

Es gibt eine Datei.

Jochen

Ich glaube, es ist auch irgendwie.

Jochen

Ja, ich glaube, der entscheidende Unterschied ist, dass irgendwie ein Paket Submodule haben kann und ein Modul nicht.

Dominik

Genau, also ich habe eine Definition gefunden, der irgendwo sagte, dann if a module name has no dots, it's not considered to be part of a package.

Aha.

Jochen

Mag sein.

Jochen

Ich weiß es nicht.

Dominik

Also ein Paket ist halt quasi eine Sammlung von Modulen oder sowas.

Dominik

Und dann irgendwie so.

Dominik

Da gab es auch eine tolle Antwort drin, relative imports for the billions times oder sowas.

Johannes

Ja, relative Imports, darüber müssen wir auch noch sprechen.

Johannes

Ich bin ja ein großer Fan davon, aber offense bar sind die nicht so.

Johannes

Gut, da kommen wir vielleicht nach.

Ja, ja, okay, gut.

Johannes

Also was macht denn Import jetzt überhaupt?

Import macht, soll ich mal versuchen, soll ich mal mein Verständnis erklären und ihr korrigiert mich dann.

Dominik

Von wo importiert ihr denn überhaupt?

Genau, also Import.

Johannes

Erstmal sucht Import einen, also wenn ich sage Import M, dann sucht das Import-System von Python nach etwas, das M heißt.

So läuft das denn?

Ja, genau.

Johannes

Und zwar auf dem Python Path.

Dominik

Auf dem Path, ah.

Johannes

Eine Variable, die heißt sys.pythonPath.

Dominik

Sys.path.

Johannes

Sys.path heißt die nur.

Johannes

Okay, ich weiß, ich vergesse es jetzt mal wieder.

Johannes

Jedenfalls ist da eine Menge von Verzeichnissen drin.

Johannes

Und in der Reihenfolge, wie sie in diesem Path stehen, wird nach dem Namen M gesucht.

Dominik

Also 0 ist, glaube ich, der aktuelle irgendwie der Datei.

Johannes

Entweder vorne oder hinten, das ist immer.

Dominik

Ich glaube, null der erste ist immer der, wo du gerade.

Dominik

Genau.

Dominik

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

Dominik

Und dann ist halt quasi, der sucht halt dann im ersten in 1, wo und abdave und was und der erste Hit wird dann genommen.

Genau, der

erste Hit wird dann genommen.

Johannes

Und in diesem Path sind immer, können ganz viele verschiedene Sachen drin sein.

Johannes

Also die Installation, das Installationsverzeichnis des Interpreters und wenn man irgendwelche Environments aktiviert hat, dann sind die da alle drin.

Johannes

Man kann da auch selber Sachen reintun, braucht man manchmal, ist manchmal ganz nützlich.

Ja, also da

Dominik

sind einfach.

Dominik

Wenn man die vielleicht Pakete haben will, die auch importiert werden können, dann muss man einfach da gucken, dass ein Dispunkt Pass quasi in der Umgebungsvariante im Vater ist.

Johannes

Das ist im Wesentlichen das, was Virtual Env macht.

Er macht ein Verzeichnis, wo du deine Pakete reinlegen kannst und tut den in den

Python Path für dich.

Dominik

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

Dominik

Weil wenn die falsche Reihenfolge drin ist, dann kann das sein, dass er im Pfad von Python 2 sucht oder so, also wie es früher offenbar war.

Dominik

Und dann hat er ein Problem.

Genau.

Also, und er sucht diese ganzen Verzeichnisse

Johannes

durch und wenn da irgendwas drin ist, was diesem Namen M entspricht, also eine M.Py oder ein Verzeichnis, was M heißt, was eine InitPi hat, oder in Python 3 ein Verzeichnis, was das M heißt und Python-Dateien enthält, was keine InitPy hat, dann wird das als Modul importiert und in den aktuellen Namespace als Modul M übergeben.

Dominik

Wir haben gerade wirklich das in Python 2 und 3, deswegen bin ich das ja interessant.

Ja, da gibt es Unterschiede.

Jochen

Und da gibt es auch interessante, also nochmal ein sehr interessanter kommt mit Python 3.3, glaube ich, dazu, nämlich die Namespace-Only-Pakete.

Erklär mal.

Jochen

Ja, also die gibt's.

Jochen

Also früher muss man ja immer die Init-PY haben.

Jochen

Ah, ja, genau.

Jochen

Vor allen Dingen deswegen, damit halt nicht Verzeichnisse, die halt so heißen wie ein Standardmodul, halt das Standardmodul überschreiben.

Jochen

Und man halt damit dann quasi öffentlich dazu bekennt, dass das jetzt ein Paket sein soll.

Jochen

Und also sozusagen, wenn man sich in den Fuß schließt, dann muss man das auch wirklich absichtlich gemacht haben.

Jochen

Und das ist aber teilweise blöd, weil oft will man vielleicht auch Dinge, die in einem Paket liegen, nicht in einem Verzeichnis haben, zum Beispiel.

Jochen

Und also wenn es ein Init-PY gibt, dann ist das ja dann, jetzt weiß ich nicht mehr die Stelle, wo das irgendwo drin steht, dass da drin gesucht werden soll.

Jochen

Also das Pass, ja, aber es gibt auch noch irgendwie andere Stellen, glaube ich.

Jochen

Es gibt auch noch Module, die nicht da drin sind.

Jochen

Also zum Beispiel die Standardbibliotheksmodule sind, also es gibt welche, die sind irgendwie in das Python-Binary reinkompiliert.

Jochen

Und dann gibt es auch noch welche, die sind irgendwie woanders hingemashelt, aber die liegen da auch irgendwo rum.

Jochen

Also die rein Python-Modul, die nicht zähle.

Jochen

Oh Gott.

Jochen

Das stimmt dazu kommen, aber es gibt auch noch Dinge, Module, die sind halt einfach nur eine Shared Library und nicht irgendwie Python.

Dominik

Aber da kommen wir gleich noch so weiter.

Dominik

Wurde PyCache und so weiter noch was dann kommt, aber egal.

Jochen

Genau.

Jochen

Aber man kann halt auch, es gibt auch Verzeichnisse und denen wird da auch gesucht, wenn da keine N-PY ist, das ist allerdings dann irgendwie weiter hinten.

Jochen

Und alle, die den gleichen Namen haben, wenn da jetzt Sachen drin liegen, dann wird das zum gleichen Paket gehörig irgendwie aufgefasst und das dann so ein Namespace-Package.

Dominik

So ein Namespace-Mängling.

Jochen

Und dann kannst du halt auch initeren.

Johannes

Also wir halten fest, einfach immer eine Init-Pile.

Jochen

Ja, dann ist

es eine sichere Seite.

Jochen

Aber so kannst du halt auch Dinge in einem Paket haben, die in unterschiedlichen Verzeichnissen liegen, was halt manchmal auch ganz praktisch ist.

Jochen

Manchmal kann man das schon brauchen.

Johannes

Ja, okay.

Okay.

Dominik

Also was ist dann, das haben wir gesagt, ein Package.

Dominik

Es gibt auch ein Dann-Dann-Package.

Dominik

Was steht denn da?

Dominik

Wann ist dann das Current Package?

Jochen

Genau.

Jochen

Ja, das ist das aktuelle Paket.

Dominik

Das ist auch ein Top-Level-Modul oder sowas, ja.

Jochen

Ja, ach Gott, ich weiß auch nicht.

Dominik

Ich glaube, also wenn es ein None ist, dann ist es ein Skript.

Dominik

Also vielleicht nochmal zu distinguieren zwischen Modul und Pakete oder so.

Dominik

Und wenn ein Package, dann ist das nur ein Skript.

Dominik

Und wenn, er sucht halt an, ob er so ein Package findet und wenn er eins findet, dann ist das Top-Level-Modul, von dem man dann importieren kann oder so.

Dominik

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

Dominik

Attempted Relative Import Beyond Top-Level Package.

Johannes

Ja, das ist so eine Sache, die gibt's.

Jochen

Passiert mir auch regelmäßig.

Johannes

Echt, das passiert mir nie, das ist voll seltsam.

Doch, passiert mir nicht.

Johannes

Es gibt so Sachen, die machen Menschen offensichtlich unterschiedlich.

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

Johannes

Also nicht, weil ich besser bin oder weil ich irgendwie das toller kann oder so, sondern weil es einfach was ist, was ich nicht benutze.

Dominik

Ja gut, aber wenn du relative Importe benutzt, aber die Sache.

Dominik

Aber und vertippt man sich ja mal oder hat irgendwie.

Ja, aber

Johannes

also relative Importe, jetzt müssen wir über relative Importe sprechen.

Johannes

In Python 3 und ich glaube in 2.7 wurde das dann irgendwann geportet, gibt es die Möglichkeit zu sagen, from Punkt Import irgendwas.

Johannes

Also vom Punkt Import M.

Dominik

Oder vom Dot oder vom Punkt.

Johannes

Import M.

Oder auch From Punkt M-Import irgendwas.

Johannes

Und dieser Punkt heißt halt eben immer aktuelles Verzeichnis, also aktueller Pfad.

Johannes

Das heißt, wenn es in dieser Installation, die ich habe, zwei Module gibt, die M heißen, dann kann ich durch diesen relativen Import genauer sagen, welches ich meine.

Jochen

Ach, okay, doch, nee, das war der Unterschied zwischen Modulen und Packages.

Jochen

Module haben ein Pfad dran.

Jochen

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

Jochen

Ich glaube

schon, ja.

Dominik

Genau, das Top-Level-Package ist halt irgendwie doch die Sache.

Dominik

Also wenn ein Package, wenn man ein Paket finden kann, also ein Top-Level finden kann, ja, mit diesem Dot-Dot, dann geht das halt ab.

Dominik

Aber wenn das nun ist, weil man quasi auf der höchsten Ebene ist, dann gibt es halt so einen Fehler zurück und das ist ja genau der Grund, warum das ist.

Johannes

Es kann natürlich sein, dass ich das einfach nie...

Also für mich ist einfach Punkt, ja.

Johannes

Wenn ich sage vom Punkt importen, dann weiß ich, das muss im aktuellen Verzeichnis liegen.

Johannes

Wenn ich sage vom Punkt, Punkt, dann weiß ich, das muss im Verzeichnis drüber liegen.

Johannes

Und für mich ist das einfach eine Möglichkeit, quasi in meinem Projekt zu navigieren.

Dominik

Aber ich sag mal so, das geht aber nur dann, wenn der Interpreter richtig aufgelöst ist, weil wenn du tief drin bist und dann das Skript beispielsweise manuell ausführst, relativ tief drin, dann wird er ja diesen Fehler schmeißen, wenn er

Johannes

wenn du diese Datei direkt aufrufst.

Dominik

Das kann man übrigens verhindern, indem man einem dann sagt, Python-m und dann dieses Modul dann innerhalb von dem Pfad aufgerufen.

Johannes

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

Johannes

Und da bin ich nie in der Verlegenheit, diese Sachen direkt aufzurufen, sondern die werden dann entweder über einen Run-Server aufgerufen oder über einen Test oder über einen Command.

Auch da bin ich immer.

Dominik

Ja, aber

der Pfad ist immer festgemacht an der Manage-Pile.

Genau.

Johannes

Das heißt, das weiß ich.

Johannes

Ich weiß, wo der Pfad.

Dominik

Genau, aber das ist ja auch Python-m Package.module oder so, ja.

Genau.

Johannes

Und deshalb ist das vielleicht was, was einfach in meiner täglichen Arbeit nicht so auftritt, dass ich da mich quasi fernavigiere, weil meine Projekte eben immer einen festen, eine feste Wurzel haben und darunter kann ich mich bewegen, wie ich möchte.

Jochen

Ja, mir passiert das halt vor allen Dingen dann, also einmal in Paketen habe ich oft gerne Tests in einem anderen Verzeichnis.

Jochen

Also da gibt es halt Tests nicht innerhalb von dem Projekt selber, sondern liegen halt in einem Tests Directory.

Jochen

Wenn da irgendwas nicht richtig konfiguriert ist, dann passiert das halt schon mal.

Ja, genau, klar.

Jochen

Und was mir halt auch ab und zu passiert, ist halt in Jupyter-Notebooks, weil die liegen halt auch wieder in einem anderen Verzeichnis.

Die sind halt auch irgendwo.

Genau.

Jochen

Und deswegen sehe ich das relativ sehe ich das halt häufiger mal.

Dominik

Also bei diesem Importer ganz interessant.

Dominik

Ich glaube, das kommt dann wirklich darauf an, wenn der Name des Moduls Punkte enthält oder halt nicht.

Dominik

Weil wenn der Punkte hat, dann.

Johannes

Achso, wenn der Name des Moduls, also wenn das Punkt, wenn das Modul quasi m.x.y.

Dominik

Genau, dann ist es halt ein paar Paket und fahrzeitig und wenn es einmal halter.

Dominik

Ja, genau, aber nein, aber wenn andersrum, wenn es halt keinen Punkt mehr hat, dann muss es eigentlich schon Top-Level sein, weil dann kann es ja nicht.

Ah, okay.

Jochen

Aber man kann ja jetzt auch so Dinge tun wie man sagt vom M-Import X oder so und das mit X dann.

Dominik

Habt ihr schon mal Skriptnamen mit Punkten verwendet?

Dominik

Also mit mehreren Punkten drin.

Johannes

Das, was ich gerade jetzt überlege, ob ich eine Datei mit Punkten drin hätte, ohne also Punkt Py.

Dominik

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

Ich glaube

Johannes

auch, dass das zu Problemen führt.

Johannes

Und das würde ich auch vermeiden einfach.

Müssen wir mal ausprobieren.

Jochen

Interessant, stimmt.

Jochen

Das habe ich auch noch nicht gemacht.

Johannes

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

Was passiert eigentlich, wenn man Punkt eingibt?

Ja, genau.

Achso, genau.

Johannes

Die Form Import M ist ja noch vergleichsweise offensichtlich.

Johannes

Aber jetzt hat er Jochon eben gesagt, was ist denn, wenn ich sage, From M Import X?

Genau.

Johannes

Und was dann halt für mich passiert ist, er importiert erst M und guckt dann in M nach, ob es da etwas gibt, was X heißt und nimmt mir das als Import.

Johannes

Aber das stimmt nicht ganz.

Johannes

Weil es kann nämlich auch, man kann auch from M-Import X machen, wenn es in M gar kein X gibt.

Johannes

Weil eben, wie angekündigt, wenn M ein Verzeichnis ist, was eine InitPy enthält, dann kriege ich aus dem Import M alles das raus, was in der InitPy drin ist.

Johannes

Aber from M-Import X kann dann die Datei X.py sein, also Mr-X.py und die kann ich mit, die kann, also an die komme ich dran, ja, vom M-Import X.

Johannes

Aber die ist nicht in M selbst enthalten.

Johannes

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

Johannes

Kann so sein.

Johannes

Deshalb ist es dann doch immer noch ein kleines bisschen anders.

Also man muss eigentlich immer auf die Datei zeigen, die man haben möchte.

Jochen

Ja, aber genau, das fand ich auch nicht mehr, das hat mich auch überrascht, das wusste ich nicht, dass wenn man sagt, vom M-Import X, ich weiß nicht, was ich vorher gedacht habe, was ist, aber ich dachte, das macht dann halt irgendwie, holt das X da raus und dann hat man das halt im eigenen Namespace.

Jochen

Aber eben, das macht halt eher sowas wie Import M, dann sagt es X gleich M.x und dann sagt es Dell M.

Jochen

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

Jochen

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

Also wenn es nicht

geht, macht er doch was anderes, weil dann holt er sich doch noch die Datei.

Jochen

Ja, ja, ja, ja.

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

Johannes

Also man kann so oft Import M machen, wie man möchte, es wird nur einmal gelesen, die Datei.

Dominik

Und wo wird das dann reingeschrieben?

Dominik

In das Dictionary der offenen Module.

Johannes

Dictionary der geladenen Module.

Johannes

Das heißt irgendwie Sys.modul.

Sys-Modules.

Keine Ahnung.

Dominik

Das heißt, das muss man.

Okay, gut.

Johannes

Dominik weiß es.

Dominik weiß es passiert.

Jochen

Sehr gut.

Jochen

Das ist übrigens auch so eine Geschichte, das kann man auch schön verwenden.

Jochen

Also manchmal braucht man ja, also Singleton, ehrlich gesagt, beschütztes cooles.

Jochen

Es hat einen total coolen Namen, deswegen wollen sie Leute noch nennen.

Aber tatsächlich gibt es ganz gut.

Manchmal braucht man das, ja.

Jochen

Manchmal braucht man es tatsächlich.

Jochen

Meistens nicht.

Meistens eher nicht.

Genau, aber Module

Johannes

sind immer Singletons.

Jochen

Ganz genau.

Jochen

Und das ist tatsächlich die eleganteste Art, die ich kenne, wie man das hat.

Und es ist ja auch manchmal total nervig.

Jochen

Ja, aber ich habe da vorher schon, also meistens habe ich dann einen Borg-Pattern verwendet oder halt irgendwas in der Richtung.

Jochen

Oder manchmal halt auch, wenn ich nicht Borg wollte, sondern direkt Singleton, dann wurde es aber schon haklich.

Jochen

Dann kann man das irgendwie, dann muss man schon so Metaklassen oder sonst irgendwie sowas, muss man so Dinge, wo man sich hinterher so ein bisschen schmutzig fühlt, irgendwie machen.

Jochen

Und bis ich dann irgendwann mal, weiß ich gar nicht, wo ich das gesehen habe, den trickst, so dass jemand meinte, ja, ja, Module sind auch sowieso Singleton, das sind doch einfach eine globale Variable in einem Modul.

Jochen

Ja, stimmt ja.

Jochen

Stimmt.

Dominik

Und das muss man nochmal genau erklären, warum das ein Singleton ist, wenn ich.

Aber Jochen,

wenn du dann, wenn du dann das Pattern richtig ausführen müsst, musst du dann in dem Modul noch ein Get irgendwas machen.

Jochen

Ja, ja, falls das anlegt oder.

Jochen

Falls jemand versucht, darum rumzukommen.

Johannes

Ja, genau, eigentlich ja.

Johannes

Jetzt der Dominik möchte es gerne erklärt haben.

Dominik

Ja, also genau, also ein Singleton macht irgendwie, dass er guckt, ob es schon ein Objekt gibt, das dieses Typen ist und gibt das dann zurück, wenn es schon gibt, und sonst erstellt er einfach das eine, was es nur geben darf.

Johannes

Ja, Singleton heißt ja erstmal nur, es gibt während der Ausführung des Programms nur eins davon.

Johannes

Egal, was davon.

Dominik

Und Borg ist, dass es ganz viele davon, aber die sind alle dieselben Eigenschaften.

Immer.

Dass er den Eigenschaften von

einem ändern soll.

Jochen

Es ist nicht die gleiche Instanz tatsächlich.

Jochen

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

Dominik

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

Jochen

Ja, genau.

Okay.

Johannes

Und Singleton kriegt man eben durch ein Modul einfach hin.

Johannes

Also ich mache eine Datei singleton.py und da schreibe ich rein x gleich 2.

Johannes

Dann mache ich Import Singleton und dann sage ich Singleton.x und das ist jetzt diese Instanz, dieses Punkt X gibt es nur genau einmal.

Johannes

Weil der Python-Interpreter eben beim Import jede Datei nur einmal importiert, um es mal so zu sagen.

Johannes

Wenn eine Datei einmal importiert wurde, dann liegt die im Cache und dann, wenn du dann Import Singleton sagst, kriegst du wieder die aus dem Cache.

Johannes

Mit allen ihren Eigenschaften.

Johannes

Das heißt, du kriegst es mit dem, du kannst es nicht ganz einfach machen, dass du diese Datei nochmal importierst.

Johannes

Weil Pythonite sagt, ja, die kenne ich ja schon.

Johannes

Brauche ich nicht nochmal importieren.

Dominik

Also weil das Moment, also das war dieser Import, das ist ein Modultyp dann, wenn du Modul hast?

Johannes

Genau, das heißt Module.

Dominik

Und dieser Modultyp ist einfach die Zeichkette, keine Ahnung, von dem was ist.

Johannes

Das Ausgeführte ist eigentlich der ausgeführte Code, der da drin ist, mit so einer Closure, die außenrum.

Dominik

Und das wird dann doch gecastet, also was dann ein E-Wal wäre oder das habe ich ja nicht genau gedacht.

Johannes

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

Johannes

Aber halt ein sehr gut verstecktes.

Ja, gut.

Johannes

Ich meine, Import heißt, führ mal bitte den Code in der Datei XYZ aus.

Johannes

Also musste ihn irgendwie ausführen.

Johannes

Irgendwo muss da ein E-Wal drin sein.

Johannes

Aber es ist eben hinter so vielen Schichten versteckt, dass du es nicht siehst.

Johannes

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

Dominik

Immer wieder und immer wieder und immer wieder.

Dominik

Das heißt, wenn ich auch von mehreren Stellen.

Dominik

Aber wenn ich an mehreren Stellen das habe, was ist denn dann passiert?

Johannes

Im ersten Import-Singleton wird diese Datei geladen und ausgeführt.

Ja.

Johannes

Und das Ergebnis dieser Ausführung wird als Module Singleton abgelegt in diesem Sys-Modules-Cache.

Dominik

Und vielleicht wird dann da Py-Cache drausgebracht, PyC-Files oder so, hat das direkt da.

Ja, nee, das ist nur

eine interne Repräsentation.

Johannes

Das ist halt eben ein internes, es ist eine Klasse, die heißt Module und die hat Eigenschaften.

Johannes

Und wenn du dann nochmal Import-Singleton machst, zum Beispiel in einer Datei oder zu einem späteren Zeitpunkt oder in einer Schleife, wo du es tausendmal machst, dann wird nicht nochmal diese Datei singleton.py geladen, sondern dann guckt er eben in seinen Sys-Modules Cache und sagt, ah ja, den Namen Singleton kenne ich schon.

Genau, also das ist das Modul.

Dominik

Beim ersten Import lädt er das tatsächlich in den PyC-File rein.

Dominik

Also das heißt, er macht aus Bytecode raus, er kompiliert das quasi und führt sie aus.

Dominik

Er liest das quasi einmal aus, deswegen führt das aus und macht dann einen Bytecode raus und dann schreibt er das in Py-Cache rein und von da versucht dann erstmal zu laden aus PyC.

Jochen

Genau, noch einen

Schritt weiter.

Dominik

Und das war jetzt ein Marshall-Object, dieses Produkt.

Nein, nein, das

Johannes

Ergebnis der Ausführung ist das, was dann das Modul ist.

Johannes

Der Code des Moduls kann dann schon wieder weg sein, weil den brauchst du dann gar nicht mehr.

Johannes

Wenn du irgendwo ein Dev machst oder ein Glas machst, da sind dann so Baldcode-Objekte dran, weil die müssen ja nochmal ausgeführt werden.

Johannes

Aber das Modul selbst, das, was in der Datei drin steht, das muss gar nicht mehr da sein.

Johannes

Also wenn du einfach nur eine Datei hast, die ganz viele Sachen ausrechnet und am Ende aber nur einen Wert rauskommt, dann ist dieser Code nicht mehr da.

Johannes

Es ist nur noch das Ergebnis da.

Johannes

Also das Ergebnis der Ausführung dieser Datei ist dann das, was in das Modul ist.

Dominik

Okay, und was wird dann in die PyC-File reingeschrieben?

Johannes

Die PyC-Files sind so eine Zwischendurchoptimierung, weil die enthalten so einen vorkompilierten Bytecode und der ist schneller zu laden als eine .py-Datei.

Dominik

Und das ist ein Marshall-Objekt.

Dominik

Also wir hatten die ganz am Anfang einmal kurz Marshall gesagt, was ist das überhaupt?

Dominik

Einmal kurz nochmal den kleinen Exkurs.

Joachim, erklär dir du doch mal.

Jochen

Ach ja, damals.

Jochen

Genau.

Jochen

Im Grunde Marshalling ist eigentlich ein anderes Wort oder ist eines der Worte, die man benutzt, wenn man jetzt zum Beispiel einen Code oder irgendwie eine Datenstruktur seralisieren möchte in einer Liste von Buchstaben oder in einem String oder in einem Byte-Datenstruktur, die man dann halt irgendwie auf einer Platte speichern kann oder noch mit sich rumtragen.

Jochen

Und da gab es zwei Module.

Jochen

Die ersten waren halt Marshall, das heißt auch so, das gibt es immer noch in der Standardbibliothek und Shelf.

Jochen

Shelf war schon damals nicht so richtig populär.

Jochen

Also Marshall kann man noch verwenden, kann halt nur relativ wenige Datentypen und in neueren Python-Versionen verwendet man da eigentlich immer Pickel für.

Jochen

Aber das ist halt im Grunde das, was es macht, wenn man sagt, vom Pickel oder wenn man sagt, ziepickel.dump, Dump S oder so, dann wird das halt ein String oder Dump in eine Datei geschrieben und dann hat man da halt eine in einen String serialisierte Form von zum Beispiel irgendwie Code.

Dominik

Also mittlerweile, glaube ich, sogar Dill oder sowas, ne?

Dominik

Import Dill-S-Pickel oder so, für also neuere Version.

Dominik

Ja.

Dominik

Als Third-Party-Package irgendwie.

Schön, schön.

Kann man auch machen.

Dominik

Okay, aber ein Marschhalt-Objekt, falls ihr das irgendwo findet, ist quasi eine serialisierte Form von dem Code, der da gelaufen ist, ja.

Genau.

Dominik

Okay, also jetzt haben wir aber, okay, jetzt haben wir es irgendwo geladen, haben wir erst gefunden, und was importiert ihr dann?

Dominik

Was ruft ihr dann auf?

Johannes

Ja, das Ergebnis dieser Ausführung.

Dominik

Also Important Import.

Dominik

Dann dann.

Dominik

In diese Funktion kommen dann halt die Argumente rein, die können.

Ja, nee, das kann ja alles möglich sein, wenn man kannst

Johannes

du auch beliebige Objekte in deine Datei reinschreiben.

Johannes

Du kannst auch ein Modul machen, was einfach nur einen String enthält, wo irgendwelche Binärdaten drin sind.

Kannst du auch.

Johannes

Macht man ja manchmal, weil man Testdaten braucht.

Johannes

Wenn du das Modul hast, wo einfach so ein paar Strings drin sind.

Johannes

Und wenn die eben ausgeführt werden, dann werden die halt so eine String-Objekt in Python mit einem Namen.

Und genau diese Sachen, also im Endeffekt ist das halt so ein Dictionary, was da drin ist.

So ein Unterstrich, Unterstrich, dict, Unterstrich, Unterstrich.

Johannes

Das hat natürlich noch mehr so Attribute, ja, der Path ist da drin und der ursprüngliche Importname und die und der Doc-String wird rausgelesen und so weiter.

Johannes

Also diese ganzen Sachen, die halt so passieren, wenn Python was ausführt, die passieren da auch.

Dominik

Alles das, was Python langsam macht.

Alles das, was Python awesome macht.

Johannes

Genau, und das Ergebnis dieser Ausführung ist halt dann das, was das Modul ist.

Das Zusammengefasste Modul.

Johannes

Da gibt es Modul.doc und Modul.dikt und Modul.

Johannes

was weiß ich nicht noch alles.

Johannes

Punkt Name und Punkt Path und Punkt.

Johannes

Punkt K-Package und 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.

Johannes

Und auch diese Klassen, ja, die müssen ja erzeugt werden und wenn es so Metaklassen hat, dann müssen die ausgeführt werden.

Johannes

Also alles das, was da, ja, wenn, 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.

Johannes

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 er das braucht, ja.

Johannes

Dass ich halt einfach bestimmte Python-Objekte oder bestimmte Dinge in andere Dateien reinschreiben möchte.

Johannes

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

Und ja.

So, das ist Import.

Johannes

Und jetzt gibt es noch Import-Lib.

Dominik

Ja, ja.

Dominik

Das wird ja aufgerufen sogar.

Dominik

Also Import wird ja Import aufgerufen, wenn man es nicht überschrieben hat.

Johannes

Import ist eigentlich syntaktisch.

Johannes

Genau, das kommt ja auch noch dazu.

Johannes

Das ist ja in dem Artikel, glaube ich, nicht drin, aber in der Diskussion war es dann drin.

Johannes

Man kann das auch überschreiben.

Johannes

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

Dominik

Ein Importdekorator

weit unten.

Johannes

Es gibt Import-Lib 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 dieses Statement Import M ist quasi nur noch ein syntaktischer Zucker für Importlib.

Johannes

Unterstrich, Unterstrich, Import, ja, irgendwie sowas.

Johannes

Das Coole daran ist, dass man 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, da muss ich jetzt leider auf meine eigenen auf meine eigenen Dinge verweisen, da werde ich in Kürze ein Video dazu hochladen.

Johannes

Kommt dann natürlich in die Show Notes.

Oh ja.

Johannes

Wenn man etwas neu laden möchte, weil wir haben ja eben besprochen, wenn ich Import M mache, dann kriege ich immer das, wird es einmal geladen und dann nie wieder.

Johannes

Und man ist ja jetzt oft als Softwareentwickler in so einer Situation, dass man Dateien dann verändert und die eigentlich sofort haben möchte.

Ohne dass man das Programm neu startet.

Johannes

Und um das hinzukriegen, habe ich mir halt so ein bisschen einen Glue-Code geschrieben, der Dateien überwacht und wenn die sich ändern, dann wird da halt ein Re-Import durchgeführt.

Johannes

Und das ist möglich durch die Funktion aus Import-Lib.

Johannes

Da kann ich sagen, importiere diese spezifische Datei, auch wenn die schon mal importiert war.

Johannes

Und dann wird die importiert.

Johannes

Egal, ob die schon im Cache liegt oder nicht.

Jochen

Ah, cool.

Jochen

Ja, ich meine, der Entwicklungsserver von Jackmo, der kann sowas ja auch.

Ja, aber der macht ja einen Neustart.

Jochen

Der macht tatsächlich einen Neustart, naja.

Johannes

Der hat so einen Watcher-Prozess und dann schießt er einfach den Prozess ab und startet einmal neu.

Jochen

Achso, ich weiß gar nicht, wie das, wie das.

Jochen

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

Johannes

Ja, aber es hat auch Vorteile, weil dann halt alles auf Null zurück ist.

Jochen

Wie ist das denn bei Jupyter?

Jochen

Ist das ja auch so?

Jochen

Da kann ich ja auch im Import sagen, ob ich das jetzt möchte, dass ich das nochmal importieren will, wenn es sich ändert.

Macht so einen Re-Import.

Johannes

Genau.

Johannes

Da gibt es eben diese Jupyter-Magik, die du sagen kannst und der benutzt tatsächlich Import Lib und macht Reimport.

Jochen

Ah, okay.

Jochen

Neustarten wäre auch blöd.

Jochen

Ja.

Es geht ja auch geht ja auch an der Stelle einfach gar nicht.

Johannes

Zum einen, weil der Prozess ja da läuft und zum anderen, weil du ja die anderen Zellen nicht kaputt machen willst.

Johannes

Du hast ja die Zellen immer noch.

Jochen

Ich hatte übrigens tatsächlich jetzt letzte, vorletzte, nee, letzte oder vorletzte, nee, ich glaube letzte Woche und ich erinnere mich schon nicht mehr dran, den Fall, wo ich tatsächlich Import Lib gebraucht habe und habe halt die Importfunktion überschrieben.

Was hast du damit gemacht?

Jochen

Ich habe einen Pull-Request bei Wactail Media eingereicht, weil es nicht mit Wactail 213 kompatibel war.

Jochen

Und Wactail, ja, da gibt es Tests und das Problem ist jetzt, dass man jetzt in den Test, man möchte die Tests ja, also da ist dann, okay, ich fange einfach mal von der Seite an.

Jochen

Es gibt im Code so Dinge wie, probier das mal zu importieren.

Jochen

Wenn es schief geht, mach was anderes.

Jochen

Weil zum Beispiel diese Telepath-Bibliothek gibt es erst ab Wacktile 213.

Okay.

Jochen

Und da sagt man halt, probierst du.

Johannes

Auf lokale, ich benutze das ganz häufig für lokale Settings, ja.

Johannes

Irgendwo eine LocalSettings.py und dann macht man halt try Import LocalSettings.py.

Johannes

Ja, wenn es nicht Exp-Path.

Jochen

Genau, genau.

Jochen

Und jetzt möchte man das aber testen.

Jochen

Jetzt möchten wir testen, dass, wenn, und es gibt da, also war noch kompliziertere, wie gesagt, das habe ich jetzt wieder vergessen, weil es ein bisschen kompliziertere Logik, die davon abhängt, ob man es jetzt geschafft hat, das zu importieren oder nicht.

Jochen

Und jetzt, wie willst du das testen, ob jetzt wirklich der richtige Code ausgeführt wird?

Jochen

Also der Code ja zum Beispiel dann nur so ein Dummy-Objekt anlegt.

Jochen

Wie willst du testen, ob das funktioniert hat, wenn du nicht dann noch eine andere Paketversion installieren willst, was du im Test auch nicht gut machen kannst.

Jochen

Wow, und dann habe ich da einfach quasi Importfunktionen überschrieben und dann in der Import-Funktion gucke ich halt so, wird gerade versucht, das da zu importieren.

Jochen

Ja, wirklich gut.

Jochen

RaceException, ja.

Jochen

Und dann Race-Import-Error.

Jochen

Und dann kann man halt testen, okay, und ist jetzt wirklich das Dummy-Objekt?

Jochen

Ja oder nein?

Jochen

Und dann hat man einen Test dafür.

Jochen

Ja, aber fast.

Johannes

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

Dominik

Jochen auch aufgenommen und wir müssen jetzt aber suchen, welcher Folge kommt.

Johannes

Du kannst uns da einen Link geben, Jochen.

Jochen

Kann ich auch an die Schauenfolge.

Das ist ja cool.

Dominik

Ja, was kann jetzt noch alles dann passieren?

Johannes

Genau, das ist jetzt sozusagen, der Jochen hat jetzt hier schon die Brücke zu dem zweiten Anwendungsfeier geschlagen, was dann eben hier aus diesem Artikel in der Diskussion rauskam.

Johannes

Man kann auch im Importsystem was anderes machen.

Johannes

Und der schöne Vorschlag, der da kam, beziehungsweise das schöne Beispiel, was da in dieser Diskussion kam, ist, dass man ja prinzipiell auch andere Sprachen integrieren könnte.

Dominik

Einfach Importsystem aufeinandetzen.

Johannes

Das kann man auch machen, dann ist man in seiner eigenen Welt.

Johannes

Aber quasi das Gegenteil davon ist, wenn kein Python-Modul gefunden wird, dann kann man mal schauen, ob man irgendwas anderes kompilieren kann, was diesen Namen hat.

Johannes

Und wenn das kompilierbar ist und kompiliert, dann einfach das importieren.

Johannes

Und es hat wohl jemand geschrieben, dass jemand sich eben so Lisp-Dateien rein importieren kann, die live kompiliert werden, wenn man sie importiert.

Johannes

Es ist reichlich abgefahren, würde ich sagen, und ich empfehle auch niemandem, diesen Weg zu gehen.

Johannes

Aber es ist schön, dass es jemanden gibt, der das gemacht hat und dass es möglich ist.

Johannes

Ich wüsste jetzt tatsächlich keinen richtig sinnvollen Anwendungszweck davon, aber.

Johannes

Es gibt irgendeinen, irgendwann wird es einen Anwendungsfall geben.

Jochen

Ich habe gerade überlegte noch so gut, der mit dem Disp ist jetzt, aber ich meine, jetzt, wenn man das jetzt mit TypeScript macht, man möchte auf dem Backend und dem Frontend den gleichen Code.

Johannes

Ja, und dann wird es noch mit dem Python, mit dem JavaScript-to-Python-Compiler noch Python gemacht.

Jochen

Hat man auf dem Server irgendwas, was WebAssembly kann?

Dominik

Kann Python schreiben für Frontend.

Johannes

Und schon eigentlich deine Dateien bestehen quasi nur noch aus Import-Stats.

Johannes

Alles wird mit Import-Statements gemacht.

Johannes

Ja, das ist so wie der C Präprozessor, der ist auch Turing vollständig.

Jochen

Ja, tja.

Dominik

Da hat jemand super wieder sein.

Vorhin haben wir noch drüber gesprochen, ob wir unser

Jochen

Flugmodus gestellt.

Jochen

Aber nicht mein Rechner.

Jochen

Auf meinem Telefon hat es auch nicht geklingelt, sondern aber mein Rechner kann halt auch dummerweise klingeln.

Dominik

Was kann denn noch alles schief gehen bei den Importen?

Dominik

Ja, eigentlich

Johannes

kann beim Importen alles schief gehen, oder?

Das ist ja.

Dominik

Da steht irgendwas komisches drin, also keine Binärcode oder irgendein anderes Zeichen, das er nicht lesen kann oder sowas.

Es können auch, ich glaube, das Schwierigste an diesem Import-System ist, dass es halt manchmal überraschend ist.

Dass es einem Sachen versucht zu importieren, die man nicht gemeint hat.

Johannes

Weil die Reihenfolge im Path falsch ist oder weil da Module liegen, die man auch nicht kennt.

Johannes

Oder weil man versehentlich einen Namen verwendet hat, den es schon gibt.

Dominik

Also wenn man halt so eine Kette durchgeht, also man möchte jetzt A importieren und A möchte aber ja C, D, E, FG und Y.

Dominik

Genau, sowas kann

natürlich auch passieren.

Dann hast du zirkuläre Imports, das dann auch schlecht.

Dominik

Ja, aber das wäre ja von A von B und B von D, B, C und C von A.

Johannes

Ja, genau, und das hat man ja manchmal.

Dominik

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

Dominik

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

Dominik

Also du könntest ja quasi eine Sache importieren, der importiert alles andere, die ganze Standardbibliothek.

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

Dominik

Genau, und das ist halt also relativ getarnt, was da passiert macht, macht relativ viel Magie schon.

Dominik

Und ja, also was halt die komplizierte Frage wäre, ob das das irgendwie dann doch langsam macht, wenn man irgendwie sowas raussucht und sagt hast, okay, beim ersten Mal schon.

Dominik

Das heißt, da kann der Starten relativ lange dauern und beim zweiten Mal dann vielleicht nicht.

Dominik

Aber es gab irgendwie so ein Problem, dass irgendwer hatte, der das mal ausprobiert hat wegen Imports.

Jochen

Ja, ja, ja.

Jochen

Also das Problem gibt es halt, wenn du halt irgendwie so auf die Richtung, weiß ich nicht, Millionen Zeilen Python oder so zugehst, dass eben dann, wenn das zum Beispiel im Entwicklungsserver, wenn der neu startet, wenn du änderst halt irgendwas, dann startet er neu und dann dauert das halt eine Minute, dann ist es halt schlecht.

Jochen

Das ist echt nicht immer so richtig flüssig beim Entwickeln.

Dominik

Es hieß ja irgendwie so, ne, Google, aber ich glaube, das war bei Instagram das Problem oder so.

Jochen

Ja, bei Instagram gibt es auch bei Eventbrite gibt es das glaube ich auch.

Ja.

Die sind nicht so groß wie Google.

Jochen

Ja, aber die haben, glaube ich, auch irgendwie einen, oder verwechsle ich das gerade nicht?

Jochen

Meines ist Eventbrite, wir haben auch ungefähr eine Million Zeilen-Code und Instagram halt auch.

Jochen

Vielleicht noch mehr, weiß ich.

Ja, okay.

Johannes

Aber das ist ja dann so ein, ja, das ist ja dann, das Problem ist ja eigentlich, dass halt die Sachen erst so in Anführungszeichen kompiliert werden, wenn ich Import sage.

Johannes

Und deshalb haben andere Sprachen das nicht, weil die machen es halt einmal vorher.

Johannes

Aber so eine richtig gute Lösung, also ich meine, es gibt PyO-Dateien und Pi C-Dateien.

Johannes

Die sind ja wohl schneller.

Oder könnte man sowas auch marshän?

Johannes

Könnte man Imports durchführen und das dann.

Johannes

Ja, im Prinzip schon, oder?

Jochen

Wahrscheinlich schon, ja.

Johannes

Einfach mal alles gepickelt.

Jochen

Tja.

Dominik

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

Ah, jetzt verstehe ich das auch.

Johannes

Ich dachte, Pickel ist so ein Einmachglas.

Dominik

Marshalls haben doch so eine Pickelhaube auf.

Johannes

Aber dann passt sie auf jeden Fall zusammen.

Also, also Pickels, sorry, weil ganz.

Johannes

Das englische Wort Pickels heißt Eingemachtes.

Ja, ja.

Johannes

Ich glaube, das ist die.

Dominik

Okay, aber zirkuläre Importe wollte ich nochmal.

Johannes

Ja, zirkuläre Importe sind auch eine Schöpfung.

Dominik

Wann passiert das aber?

Dominik

Also man kann ja sowas machen wie ein Python vom A, Import B und dann ein B machen vom B-Inport irgendwas oder Import A, Import B und D und so.

Dominik

Und das funktioniert einfach.

Dominik

Aber erst wenn man es dann ausführt, dann nicht mehr.

Dominik

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

Weil es unvollständig ist.

Johannes

Beispielsweise ist schon geladen oder ist schon am Laden.

Ja, genau.

Johannes

Genau, also wenn ich, wenn ich zirkuläre Verweise habe, ja, vom A Import B und in B sage ich vom A und B habe und in A sage ich Import B und in B sage ich Import A, dann kann ich die beide nicht importieren, weil zu dem Zeitpunkt müsste ich sie beide gleichzeitig importieren und das geht nicht.

Johannes

Und da kann ich natürlich beliebig viele dazwischen schieben.

Johannes

Ich kann A, B, C, B, E, solange dieser Kreis sich irgendwann schließt, ist schlecht.

Dominik

Also es fällt ja direkt auf, aber ich glaube, aber wenn man drei hat, dann fällt es, glaube ich, nicht immer direkt auf, sondern

Johannes

wenn man vier oder fünf hat, dann fällt es erst recht.

Also da hast du.

Johannes

Das siehst du dann beim Importieren.

Dominik

Und wie löst man das denn, wenn man jetzt so ein Problem hat?

Johannes

Ja, Laufzeitimports.

Dominik

Also lazy quasi.

Johannes

Das ist doch das, was man erstmal in so Salary-Tasks immer machen muss.

Johannes

Weil diese Tasks können von irgendwo her gestartet werden und die sollen dann irgendwas machen.

Johannes

Und die müssen ja auch irgendwie diese Modelle importieren, aber das Modell selber möchte.

Johannes

Also das ist so mein klassischer Anwendungsfall.

Johannes

Ich möchte Modell sagen, ich muss hier Werte nachberechnen, ich muss hier ein PDF erzeugen.

Johannes

Und das dauert lange und deshalb mache ich das in dem Task.

Johannes

Aber dieser Task soll ja dann wieder dieses ursprüngliche Modell speichern.

Johannes

Das heißt, ich kann in der Sellerie, in der Tasks-Datei nicht das Modell importieren, weil das Modell hat schon den Task importiert.

Johannes

Und deshalb ist das so ein Pattern, ja, wenn man Sellery-Tasks schreibt, dass diese Tasks zur Laufzeit alles importieren.

Johannes

Also in der Datei, in der Funktion, dev computePDF, habe ich erstmal ein paar Importzeilen drin, Import from Models, Import irgendwas.

Johannes

Import PDF Generator so.

Johannes

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

Johannes

Und dann werden diese Imports erst ausgeführt, wenn die Funktion gestartet wird.

Dominik

Also von mir, von meinem geistigen Auge liegen gerade so ein paar Tickets, die noch auf die To-Do-Diste müssen.

Ja, genau.

Johannes

Das bedeutet halt, dass dieser Import nicht ausgeführt wird, wenn die Datei geladen wird, was eben der Fall wäre, wenn es oben in der Datei drin stinde, sondern dieser Import wird erst ausgeführt, wenn die Funktion, die da drin ist, gestartet wird.

Dominik

Weil quasi nur der Funktionsname geladen wird und das, was passieren soll, quasi.

Johannes

Genau, richtig.

Johannes

Und wenn ich diese Funktion dann ausführe, dann wird dieses Import-Statement ausgeführt.

Dominik

Und dann sind die anderen Sachen schon da und dann hat man quasi den Laser-Import, dann kann man das dann wieder machen, weil die sind ja schon dann.

Johannes

Das ist dann schon fertig importiert, diese Models, die sind schon im Cache, dann kann ich einfach in den Cache zeigen und sagen, hey, gib mir das.

Johannes

Bin also sozusagen aus diesem Prozess raus.

Johannes

Und das ist auch sowas, was es eben, was eben anders ist als in anderen Sprachen.

Johannes

Import ist ein Statement, was einen Effekt hat.

Johannes

In C, wenn ich in C sage, Import Header.h, dann hat es keinen Effekt, das ist kein Code, der da erzeugt wird.

C sonders.

Dominik

Punkt H ist immer Header, noch ein paar Leute kein C.

Johannes

Genau, Punkt H ist immer Header, das sind so die Definitionen, was es da gibt.

Johannes

Die Deklarationen, nicht die Definition, die Deklarationen, was es da gibt.

Johannes

Und die Punkt C-Datei enthält dann die Definition normalerweise.

Dominik

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

Johannes

Die Definition der Header.

Johannes

Da muss es dann eine Datei dazu geben, die heißt Header.c und die dann halt die, ah irgendwas.

War nur ein Beispiel.

Johannes

Aber dieses Import-Statement in einem C, das wird vom Compiler ausgeführt.

Johannes

Das wird nicht zur Laufzeit ausgeführt.

Johannes

Und in Python ist das anders.

Dominik

Der Compiler, der macht das, der auch im Ebene, der macht, der schneidet die einfach zusammen, alle zu einer großen Datei und dann liest er einfach von oben nach unten durch.

Und dann gibt es noch

Johannes

den Linker, der dann dafür sorgt, dass diese Verweise alle an der korrekten Stelle in die korrekte Stelle zeigen.

Das ist so ein mehrstufiger Prozess.

Johannes

Und es ist halt alles, bevor das Programm gestartet wird.

Johannes

Und in Python ist immer alles, nachdem das Programm gestartet wird.

Johannes

Und das ist halt hier genau das Problem.

Johannes

Wenn ich Import B sage und versuche aber schon was zu importieren oder versuche schon B zu importieren, dann geht es halt nicht.

Johannes

Weil das gerade, weil das dann eben so einen Kreis bildet, der nicht aufgelöst werden kann.

Johannes

Wenn ich das aber erst später im Programm sage, wenn ich irgendwelche Funktionen geladen habe, die dann später nochmal diese Module brauchen, dann ist egal, wo die herkommen, wenn die schon im Cache sind, einwandfrei.

Dominik

Okay, aber das widerspricht ja so ein bisschen dieser Philosophie, das Import immer ganz oben stehen.

Johannes

Ja, genau.

Johannes

Deshalb ist das hier so der Nachteil daran.

Jochen

Ja, ich fühle mich da auch mal so ein bisschen schmutzig, aber ja, ich mache das auch so.

Aber es ist halt

Johannes

das Pattern und das ist der beste Weg außenrum.

Johannes

Es gibt noch eine andere Möglichkeit, die ich auch niemandem empfehlen möchte.

Johannes

Das ist ein sehr schöner Hack, den ich mal gehört habe.

Johannes

Wenn ich jetzt zum Beispiel nur einen Task importieren möchte, dann sage ich from Tasks Import GradePDF.

Johannes

Und der Importprozess führt tatsächlich nur so lange diesen Import aus, bis dieses Objekt vorhanden ist.

Johannes

Alles, was unterhalb dieses Objektes ist, wird nicht ausgeführt.

Johannes

Das heißt, wenn ich meine Import-Statements ans Ende einer Datei mache, dann kann ich zirkuläre Importe machen.

Johannes

In bestimmten Situationen, dann geht das.

Johannes

Aber das auch das, wie gesagt, ist keine Empfehlung.

Es ist nur Imports ans Ende der Datei schreiben, ist schon generell schlecht, weil man sie da nicht mehr sieht.

Johannes

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

Jochen

Das kann man dann wahrscheinlich auch nochmal so ein bisschen verschachteln oder so.

Jochen

Also alle Leute, die irgendwie so ein größeres Interesse an Jobsecurity haben, jetzt manchmal aufpassen mit Schreiben.

Jochen

Das kriegt man hinterher nie wieder auseinander die Frage.

Johannes

Und wenn man dann noch Homoglyphen nimmt und die Dateien alle gleich ausschauen, dann hat man ganz gewonnen.

Johannes

Ja, das ist ein Hack, der die interna missbraucht, würde ich nichts empfehlen.

Johannes

Aber es ist schön, dass es das gibt.

Jochen

Ja, ist auch manchmal interessant zu wissen, warum irgendwas funktioniert, wo man denkt, das kann ja nicht funktionieren, aber es funktioniert ja dann doch.

Jochen

Ja, ja.

Johannes

Nicht so selten, wie es funktioniert, was nicht, was eigentlich funktionieren sollte, aber trotzdem auch.

Jochen

Ja.

Dominik

Ja, Imputs haben wir, oder?

Erklärt.

Dominik

Oder fällt euch noch was ein?

Johannes

Ich bin mir sicher, dass da noch ganz viele Fragen kommen.

Dominik

Vor allem, wie funktionieren Imputs in anderen Sprachen?

Ja, anders.

Johannes

Ich bin mir sicher, dass da ganz, ganz, ganz viele Fragen noch offen sind und dass da ganz, ganz, ganz viele Fragen noch kommen werden.

Johannes

Aber so, ich glaube.

Jochen

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

Jochen

Also jetzt nachdem ich den Artikel zumindest teilweise so gelesen habe, dachte ich, ja, okay, da kann man schon coole Sachen mitmachen.

Jochen

Und vor allen Dingen kann man das auch, dass das eben, dass ein Modul auch nur einfach ein Objekt ist, was irgendwelche Eigenschaften, kann man ja eigentlich total gut ausnutzen, um damit irgendwie Dinge zu machen.

Aber sollte man nicht so ein bisschen.

Jochen

Sollte man vielleicht nicht, sollte man vielleicht nicht, aber nein, ich meine gerade, also zum Beispiel ein tatsächliches Problem, wo ich halt auch schon so mit Paketen und Dingen rumgespielt habe, wo ich dachte so, oh, da gibt es irgendwie keine gute Lösung für.

Jochen

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

Jochen

Ist halt, oder ich weiß nicht, vielleicht hinzu.

Jochen

Ich meine, eben im Machine Learning-Bereich, wenn man da Modelle hat, man trainiert die Modelle jetzt aber nicht.

Jochen

Also man hat normalerweise ein Produktionssystem, was irgendwie dann Dinge tut, so mit echten Usern und echten Daten und so.

Jochen

Aber da entwickelt man ja nicht und man trainiert ja auch nicht die Modelle, sondern Modelle trainierst du dann meistens irgendwie in einem Jupyter-Notebook oder so.

Jochen

Und jetzt hast du da dein Modell.

Jochen

Und jetzt willst du das irgendwie aber in deine Produktionsumgebung integrieren.

Jochen

Wie machst du das denn?

Jochen

Jetzt kannst du natürlich jedes Mal, wenn du irgendwie dein Modell trainiert hast, weil das sind ja auch Dinge, die dann auch periodisch passieren und automatisch, kannst du ein neues Paket bauen und das dann releasen.

Jochen

Aber dieser Deployment-Prozess ist halt ziemlich invasiv.

Jochen

Also der ist halt, vielleicht willst du das nicht regelmäßig oder auch nicht automatisch machen, weil du brauchst Berechtigungen auf irgendwelchen Systemen und keine Ahnung.

Jochen

Und dann gut, kannst du das natürlich auch, kannst du irgendwie Deployment automatisieren, was halt so ein bisschen höher ist.

Jochen

Und du hast dann ganz, ganz viele Paketversionen auch.

Jochen

Und es ist halt viel, also diese Modelle sind halt teilweise sehr riesig.

Jochen

Also irgendwie ist das nicht so richtig schön.

Jochen

Und das ist halt die Frage, wie macht man das eigentlich ordentlich?

Jochen

Und du hast das Problem, wenn man jetzt Sachen Pickelst zum Beispiel auch, dann ist das von dem Python-Interpreter abhängig und so.

Jochen

Und der ist möglicherweise in diesem Jupyter Notebook-Umfeld, wo jetzt die Data Scientists irgendwelche trainieren, halt auch wieder anders, aus speziellen Gründen anders als in der Produktionsumgebung, wo dann die Kinder.

Johannes

Und Pickel kann ja selbst auch Imports durchführen.

Johannes

Das auch.

Dominik

Pickel wird ein bisschen aufpassen, wenn man Versionen nimmt oder so, also Sachen pickelt und dann Python-Versionen weitergeht, das geht öfter mal kaputt.

Dominik

Das heißt, das ist nicht mehr so einfach dann.

Beziehungsweise auch wenn

Johannes

du andere Imports hast oder andere Versionen.

Pickel importiert halt die Sachen, die es braucht.

Johannes

Und ja.

Jochen

Ja, und also das ist, das kann schon, also da gibt es diverse Fallstricke und der Weg, den ich dann da irgendwann gegangen bin, ist halt dynamisch Konda-Pakete zu bauen.

Jochen

Und weil das mit Konda relativ leicht ging, aber das war, da kann, ich weiß nicht, ob es da Import-Lib, doch, Import-Lib gab es, glaube ich, auch schon, ich wusste aber nicht so viel davon, ich weiß nicht genau.

Jochen

Und die habe ich dann halt sozusagen als Django-Modelle irgendwie als Files irgendwo hingelegt und dann diese Pakete importiert.

Jochen

Und dann konnte man einfach einfach sozusagen sich, konnte man in einem Jupyter-Notebook, wenn man fertig Modell fertig trainiert hatte, konnte man sagen, deploy mir dieses Modell irgendwie und dann tauchte das halt auf und wenn man es ausgewählt hat, wurde es halt importiert.

Jochen

Und zwar einfach aus der Datenbank.

Jochen

Aus der Datenbank, beziehungsweise nicht aus der Datenbank, sondern aus der Datenbank plus irgendwie, naja, nicht in dem Fallsystem, sondern einer Fallsystemabstraktion, File Storage, Django Storages halt irgendwie.

Jochen

Und das geht wahrscheinlich auch ohne Konda, nehme ich mal an, so wenn ich das jetzt mir so überlege, was und wahrscheinlich geht das auch noch eleganter, als wie ich das damals gemacht habe.

Johannes

Ja, aber also jetzt mal die so Diskussionsfrage, ja, warum nicht wirklich aus der Datenbank importieren?

Johannes

Im Prinzip sind es ja nur irgendwelche Daten, kannst du ja als String da reinlegen und kannst sagen, importiere mir dieses Modell, kannst du einen Re-Import machen und das, also dann wirst du vermutlich noch so ein Proxy-Pattern brauchen.

Jochen

Ja, also das Ding für Konda war dann halt tatsächlich irgendwie, was ist, wenn ich jetzt irgendeine spezielle Abhängigkeit habe in meinem Modell.

Jochen

Also ich benutze jetzt irgendeine neue fancy Maschinenlearning-Bibliothek, die ich jetzt auf dem Produktionssystem jetzt aber noch nicht habe.

Ja, okay, dann stellst du es ab und.

Jochen

Genau, und dann ist halt kaputt.

Jochen

Wie kriege ich das da mit rein?

Jochen

Und zwar ohne, dass ich, ja, und das war über Conda ging das, aber.

Ja, okay.

Johannes

Das ist natürlich schwierig, ja, vor allem, wenn du dann Sachen installieren musst, die der eigentlich, was du an der Stelle eigentlich nicht willst.

Johannes

Wobei, also ich meine, Pep gibt es auch als Bibliothek.

Johannes

Da kannst du auch Paper aufrufen.

Von Python heraus.

Johannes

Also was ich für meine interaktive Programmierensache gemacht habe, ist eben so ein Proxy-Pattern.

Johannes

Dass du quasi eine Schicht dazwischen hast.

Johannes

Weil du möchtest ja an der Stelle, wenn du es neu importierst, musst du halt auch ganz viele Instanzen ersetzen.

Eigentlich.

Johannes

Und das ist schwierig, weil die hast du oft nicht selber in der Hand oder da kommst du oft einfach gar nicht dran.

Dominik

Also Instanzen ersetzen heißt, du musst die laden mit dem neuen Kontext der neuen Importe erst.

Johannes

Genau, weil die halt jetzt, weil du einen neuen Code hast und eigentlich müsstest du jetzt die Instanz.

Dominik

Also du musst aber dann quasi ja alle Transaktionen, die du auf der einen Instanz hast und gemacht hast, schon wieder nachvollziehen, aber du das State ja quasi wiederherstellen musst.

Johannes

Genau, also genau, das ist die eine Sache, du müsstest den State quasi wiederherstellen und die andere Sache ist, du müsstest den Code ersetzen, weil ich habe jetzt hier halt einen M.x und ich möchte aber ein M.X2 haben.

Dominik

Aber das State kann jetzt ganz anders sein, weil du hast jetzt nur M.

Ja, genau,

kann sein.

Johannes

Und dafür gibt es ein Pattern, das heißt Proxy-Pattern.

Johannes

Wo du quasi ein Interface definierst, was da alles drin ist.

Dominik

Ich sehe, was das denn ein Interface ist.

Dominik

Also ja, also.

Johannes

Also du definierst quasi, was ein Objekt kann.

Dominik

Also den Typ.

Johannes

Und die eigentliche Umsetzung ist aber quasi eine Klasse dahinter.

Dominik

Also du definierst quasi den Typ und dann.

Johannes

Dieser Proxy macht nichts anderes als diese Aufrufe weitergeben.

Johannes

Und dann kannst du nämlich dem Proxy sagen, ersetz mal deinen Background, ersetzt mal deinen Hintergrund, den Code, ohne den Proxy selbst anfassen zu müssen, den du halt oft nicht rauskriegst, weil der in irgendwelchen Sachen drin hängt.

Johannes

Und ich könnte mir durchaus vorstellen, dass das mit so Machine Learning-Modellen auch funktionieren könnte, ja, dass du halt einen Proxy hast, der dieses Modell wegabstrahiert und der kann die Sachen irgendwo her wiederladen, ob das jetzt aus der Datenbank ist oder aus dem Dateisystem oder sonst woher.

Johannes

Einfach, dass du eine Trennungsschicht drin hast.

Jochen

Ja, das ist wahrscheinlich auch der richtige Weg.

Das wäre

der richtige Weg.

Johannes

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

Johannes

Es ist einiges an Verwaltungsaufwand, so ein Proxy richtig zu machen.

Johannes

Und das geht in manchen Sprachen einfacher.

Johannes

Ein Interface definieren geht in Java ganz einfach, weil das gibt es da halt.

Johannes

In Python ist es halt nur eine Klasse, die lauter Not Implemented Arrows hat.

Dominik

Ja, aber ungefähr so, ja.

Jochen

Aber achso, gibt es zu diesem Projekt eigentlich auch schon einen Link oder sowas?

Johannes

Nee, ist demnächst.

Johannes

Demnächst.

Ich liefere das nach.

Johannes

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

Es ist immer gut.

Sehr schön.

Johannes

Ich hatte ja, vielleicht rede ich mich ja noch gegenüber mir selbst, kann ich mich immer sehr leicht rausreden, aber wenn ich es jetzt schon gesagt habe.

Dominik

Ja, gib mal auf jeden Fall deine Bucketlist, dann erwähnen wir es mal öffentlich.

Ja, gut.

Das ist gut.

Dominik

Ja, also interessant, was man aus so einem Blogartikel noch alles machen kann.

Dominik

Also wir hatten ja, glaube ich, ja vor, bevor wir einen Block gefunden hatten, irgendwie, und dann war ja irgendwie ergänzende Informationen.

Dominik

In demselben Blog habe ich noch so ein paar andere Sachen entdeckt, die wir auch vorhaben.

Dominik

Sowas wie Datentypen sprechen und wie das implementiert ist und wie halt das Python-Objektsystem funktioniert oder die einzelnen Dinge oder der C-Python-Compiler, wie das überhaupt geht.

Dominik

Und da müssen wir auf jeden Fall auch mal drüber sprechen.

Dominik

Aber schaut doch schon mal in diesen Blog rein.

Dominik

10.000 Meters.com, das fand ich wirklich interessant.

Jochen

Ja, da waren einige gute Sachen aber.

Ja, ziemlich nett

und relativ aktiv aktuell.

Jochen

Dieses CPyton-Internals Buch besorgt.

Jochen

Ja, mal schauen, vielleicht kann man da auch noch ein bisschen was rausholen.

Dominik

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

Dominik

Also das echt.

Jochen

Wir lesen die einfach vor.

Dominik

Nein, das ist wirklich toll und ich glaube, dass viel, was auch Hörer von uns gerne interessiert und wissen wollen, was da irgendwie so passiert, dass man so ein bisschen darüber redet, weil das machen wir ja so ein bisschen erklären wie Python so als Sprache und

Johannes

so und Wochen.

Ja, auch.

Ja, spannend.

Dominik

Ja, super.

Dominik

Ich glaube, wir haben über Impuls gar nicht mehr so viel zu sagen.

Dominik

Ich habe Gott Johannes hat sich extra einen Pick der Woche überlegt.

Ich habe mir tatsächlich einen Pick und zwar GitHub Octo.

Johannes

Das ist eine Anwendung, die GitHub geschrieben hat, mit der man Repositories visualisieren kann.

Johannes

Also die interne Struktur des Codes in einem Repository.

Johannes

So der Hintergrund ist, du kommst in ein neues Projekt rein und da sind jetzt eine Million Zeilen Pisencode drin.

Johannes

Und deine erste Aufgabe ist, mach mal hier eine Logausgabe rein.

Johannes

Es ist sehr schwer, sich da zurechtzufinden und es ist auch sehr schwer, Sachen zu finden in Projekten, wenn man sie nicht sehr genau kennt.

Johannes

Und da ist eben GitHub Octo, das macht hier so ein paar sehr schöne Graphen, das zeigt quasi grafisch, ich kann es jetzt mal ins Bild halten hier.

Johannes

Das zeigt quasi grafisch die Abhängigkeiten zwischen den verschiedenen Dateien, wo die liegen und wer sich importiert und wie die, wie die aufeinander aufbauen.

Johannes

Und dann kann man eben sehr schnell da so einen Überblick bekommen darüber, was mit was interagiert und was wohin gehört.

Johannes

Also schöne Kreisbeispiele hier.

Dominik

Wundervoll, das sieht ja richtig kreativ.

Es sieht richtig schön aus.

Dominik

Komm ausdrucken, die Wand hängen als Kunst jetzt.

Johannes

Ja, zum einen das und zum anderen auch funktionale Kunst, wo man eben nachsehen kann, von wo man, von wo nach wo man hin navigieren muss.

Johannes

Und auch interessant, weil es eben so auf eine gewisse Art und Weise die Architektur einer Software widerspiegelt, die ja sehr unterschiedlich sein kann.

Johannes

Also wenn man sich hier diese Screenshots anschaut, die sind ja zum Teil sehr unterschiedlich.

Johannes

Manche sind halt sehr flache hier reich.

Dominik

Die Screenshots werden wir auch insbreit, selbstverständlich.

Dominik

Sehr gut aufgeteilt, da sieht man vielleicht auch so ein bisschen in Style, das ist ja ganz schön.

Genau, ja, genau.

Johannes

Also es ist wirklich einfach eine Einsicht, die man sonst nur sehr schwer kriegen kann.

Johannes

Oder auch hier, also hier gibt es eins.

Das Ding musst du direkt mal in die Gruppe teilen, wirklich.

Johannes

Wo man eben sieht, dass jedes Paket quasi gleich ist und jedes Paket hat auch so eine Testpunktpile drin und das sind eben halt diese grünen Punkte hier und man sieht, okay, jedes Paket hat eins.

Johannes

Oder in einem anderen Projekt sind die grünen Punkte halt alle in einem großen Modul drin und man sieht, okay, die sind nebendran, die sind offenbar nicht integriert.

Also es gibt einfach so schnell einen Überblick über die Struktur eines Projektes, was so an sich nicht so einfach zu finden ist.

Okay.

Das ist mein Pick für diese Woche.

Dominik

Ich habe auch ein Pick.

Dominik

Ich würde picken OMIGIT.

Dominik

Das ist ein Spiel, wenn man Git lernen will.

Dominik

Das habe ich nicht.

Dominik

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

Dominik

Aber man kann es halt da mit Git spielen, mit so Card und lernen so ein bisschen über Git.

Dominik

Also natürlich auch so Beginnerlevel und so, aber das ist halt relativ spannend, wenn man so ein bisschen Advanced Git noch machen will.

Dominik

Also, jetzt ein Rebase, Interactive und dann irgendwie gucken will, dass man irgendwelche Commits-Staht, das dann irgendwie dann doch irgendwie die Message ändern und was man da nicht so alles machen kann, so ein bisschen zu verstehen, was das überhaupt.

Cool.

Hört sich auch spannend an.

Dominik

Sehr nice, ja.

Dominik

Also Gamificated, ne?

Dominik

Gamification mit Git halt als kleines Spielchen, das ist schon irgendwie cool.

Git Efication.

Dominik

Ja, man sieht halt auch, wenn man es ein bisschen visualisiert und man kann halt so Sachen klicken und das ist irgendwie ganz nett.

Dominik

Also weil, ne, ich meine, so Branchers oder so, jemand, der so ein bisschen programmiert oder hat das ja irgendwann schon mal gesehen oder viele Leute haben halt dann Git nur zum Pushen oder Pullen verwendet irgendwann.

Dominik

Man kann echt tolle Sachen mitmachen, also spannende Sachen und ja.

Dominik

Deswegen kann es interessant, um so ein bisschen Advanced dann noch so schafft zu machen.

Und geht

Johannes

ja auch in die gleiche Richtung, ist ja spannend.

Johannes

Ähnliche Picks haben die so.

Jochen

Ja, ich habe auch was mit Git zu tun.

Lustigerweise.

Jochen

Ja, auch bei dem Wagtail Media Pull Request ist mir das dann untergekommen, weil ich, ich hatte halt gar nicht gesehen, dass da irgendwelche, normalerweise halt manchmal so Linting-Steps oder so, waren jetzt irgendwie Software testet oder so.

Jochen

Das war da jetzt gar nicht.

Jochen

Dann dachte ich mir so schon mal so ein bisschen komisch.

Jochen

Und dann hat irgendwie beim, gibt es dann auch bei GitHub, hat dann irgendwie das Ding mich angemerkt hat, so dein Code ist ja irgendwie, da sind ja die ganzen Linting-Geschichten nicht richtig und da ist noch was falsch und das ist falsch.

Du warst schon überrascht,

Johannes

weil du hattest doch alles gemacht, was da drin definiert hat.

Jochen

Genau, und dann dachte ich schon so, ja gut, so mache ich das halt, das ist doch normal und das ist doch okay.

Jochen

Und dann dachte ich so, ja, wie passiert das eigentlich, dass GitHub das weiß, dass das nicht okay ist?

Jochen

Und ja, dann wurde ich mal dann oben auch darauf hingewiesen, so, ja, wir benutzen hier Pre-Comit, benutzen das auch mal auch und dann, und das ist auch ein ganz, das ist, glaube ich, auch noch ein Projekt von Anthony Sotille, oder ich weiß gar nicht, wie man den ausspricht.

Jochen

Und man definiert das quasi in so einer Art Konfigurationsdatei, was man da gerne hätte.

Jochen

Und dann sagt man Pre-Commit-Install oder so und dann installiert es alle Abhängigkeiten, die man braucht, um diese Geschichten machen zu können, lokal.

Jochen

Aber man muss diese Abhängigkeiten dann auch nicht mehr im Projekt haben.

Jochen

Man hat ja normalerweise auch mal so eine ganze Reihe von Dingen, ja, weiß ich nicht, Black, Flag 8, dieses ganze Zeugs, auch im gleichen Projekt dann immer rumhängen.

Dominik

Also Dev-Dependencies quasi, Ersatz?

Jochen

Nee, ist nicht Dev-Dependencies.

Jochen

Dev-Dependencies sind ja auch nochmal, sind nochmal andere Sachen, aber man hat halt diesen Kram dann da nicht mehr drin, sondern das, ich weiß nicht, ob das ein eigenes Virtual Environment installiert wird.

Jochen

Ich weiß jetzt gar nicht genau, wie es dann technisch funktioniert.

Jochen

Auf jeden Fall ist es dann so, wenn man sagt, dann geht commit oder so, dann läuft das dann halt automatisch durch.

Jochen

Und wenn es nicht richtig war, dann sagt es irgendwie, nee, ich kann nicht committen, weil da ist halt zum Beispiel irgendwie noch ein, da ist ein Flag 8, hat mir gesagt, da ist was faul.

Jochen

Oder es sortiert ihr halt einfach mal die Imports um mit iSort oder es macht halt irgendwie formatierende.

Dominik

Man kann seine eigenen Regeln anlegen, also jedes Mal muss man drüber was machen.

Dominik

Ja, okay.

Dominik

Genau.

Dominik

Der Dogswing ist nicht lang genug.

Jochen

Also das kannst du halt konfigurieren, wie du willst, aber es wird dann halt auch ein Commit gemacht.

Jochen

So ein Commit gemacht.

Ja, das ist schon auch nicht.

Jochen

Es ist natürlich auch so ein bisschen hart.

Dominik

Dockswing länger als eine Zeichen ist ja schon mal super.

Johannes

Das kann man ja relativ leicht hinfaken.

Dominik

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

Johannes

Ja, es ist natürlich relativ hart, aber es ist ja eigentlich schon auch der richtige Zeitpunkt.

Also du kannst nicht

committen, ohne dass alles in Ordnung ist.

Jochen

Genau, das heißt, es ist damit sichergestellt, dass nicht irgendwelcher Quatsch da drin ist.

Jochen

Also wahrscheinlich kann man das dann auch noch irgendwie umgehen.

Dominik

Ist das eine Library oder was?

Jochen

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

Jochen

Also man benutzt es als Kommandozeilentool und dann sagt im Grunde einmal Pre-Commit install und dann guckt es halt in diese Konfigurationsdateien, macht seine Magie und danach sind diese Git-Hooks gesetzt so weiter.

Dominik

Und das muss man quasi bei jedem Dev erstmal einmal installieren, damit das funktioniert.

Ja.

Ja, spannend.

Cool.

Jochen

Ja, finde ich auch gut.

Dominik

Ja, dann würde ich sagen, sind wir heute durch, auch mit dem Thema.

Dominik

Und vielen Dank, dass ihr uns wieder zugehört habt.

Dominik

Und egal wo ihr seid und morgens mittags, abends nachts und bleibt uns gewogen, hört uns gerne wieder, schaltet wieder rein und euch noch einen schönen, was auch immer, Tag, Nacht, wie auch immer.

Bis zum nächsten Mal.

Jochen

Alles klar, bis zum nächsten Mal.

Tschüss, bis Wochen.