Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Beides ist für meine Begriffe in den exakten Formen eher unüblich. Entweder den separaten Modulimport weglassen (Variante 1 ohne Zeile 1) oder nur das Modul importieren und dann die benötigten Elemente direkt aufrufen (Variante 2 ohne Zeile 2). Ersteres ist bequemer insb. bei kleineren Sachen, Zweiteres verhindert Namenskonflikte, die insb. bei größeren Angelegenheiten auftreten können.
Bei deiner Variante 1 findet zudem ein unnötiger Doppelimport statt, da du erst das gesamte Modul reinholst und dann noch mal ein einzelnes Element daraus. Potentielle Seiteneffekte sind insofern dieselben, als in allen Varianten Code auf Modulebene beim Import ausgeführt wird, auch wenn du nur einzelne Namen importierst.
Das Endergebnis ist in beiden Varianten das selbe. Ein Modul wird einmal geladen und es gibt zwei neue Namen im Namesraum.
Variante 2 ist aber schlechter Stil, weil es ja den from-Import gibt.
Und bei Variante 1 sollte man sich entscheiden, ob man Namen über den Modulnamen ansprechen möchte, oder einzelne Namen direkt. Nicht beides mischen.
Der Grund für das Mischen ist: ich verwende in dem Modul sehr allgemeine Namen, daher habe ich lieber den Modulnamen als Präfix. Nur an einem Punkt sind mir die entstehenden Namen zu unhandlich, daher die Sonderbehandlung.
nezzcarth hat geschrieben: Sonntag 3. August 2025, 11:13
Bei deiner Variante 1 findet zudem ein unnötiger Doppelimport statt, da du erst das gesamte Modul reinholst und dann noch mal ein einzelnes Element daraus.
Der Import findet in beiden Fällen genau einmal statt. Ein ``from foo import spam`` importiert zuerst das Modul "foo" und holt dann "spam" in den globalen Namensraum, wobei das "foo"-Modul selbst nicht im globalen Namensraum zur Verfügung steht.
Hat man vorher ``import x`` gemacht und sagt später ``from x import y`` findet ebenso wenig ein doppelter Import statt, denn der Mechanismus führt eine Auflistung aller bereits importierten Module (genauer gesagt: ein Wörterbuch) und verwendet somit beim "from-Import" das bereits importierte Modul, um den besagten Namen daraus zur Verfügung zu stellen.
Mit Import beziehe ich mich auf die Erstellung eines neuen Modul-Objekts. Rein semantisch gesehen findet bei jeder Import-Anweisung natürlich auch ein solcher statt. Ich gehe aber davon aus, dass der erste - eher technische - Aspekt bei deiner Anmerkung gemeint war.
Nur an einem Punkt sind mir die entstehenden Namen zu unhandlich, daher die Sonderbehandlung.
Wenn es dein Modul ist und die die alleinige Kontrolle über den Modulnamen sowie die Klassen- / Funktions- / Whatever-Namen hast, dann hast du doch alles in der Hand, um das zu ändern. Workarounds für _eigenen_ Code zu machen ist schon ein bisschen schräg.
Außerdem kannst du das Modul doch an einen kürzeren Namen binden, so wie es z.B. bei numpy gängig ist: `import numpy as np`.
@snafu: Interessant, welche Interpretationen ein einziges, relativ beliebig gewähltes Wort hier so auslöst. Das ist mir alles klar, war aber weder das, was ich meinte, noch worum es mir ging. Es ging ausschließlich darum, dass hier erst ein ganzes Modul importiert wird und dann ein Name daraus und dass man nicht beides braucht (ich kenne das von Python-Neulingen, dass der Eindruck besteht, man müsste erst das Modul importieren, bevor man daraus einzelne Namen importieren kann).
Wenn dann Variante 1. Auch wenn die nicht oft vorkommt, manchmal ist das schon praktisch um Namenskollisionen zu vermeiden und wenn man da nicht alles mögliche per ``as`` umbenennen will wenn man dabei sowieso nur einen Prä- oder Suffix an die Namen hängt der deutlich macht aus welchem Modul die Namen kommen. Dann kann man auch das Modul selbst als Präfix benutzen. Oder gegebenenfalls eine Abkürzung davon wie bei Numpy. Aber damit wäre ich auch vorsichtig/sparsam. Das mache ich nur bei Modulen bei denen das tatsächlich weit verbreitet ist, oder wenn wirklich viele Namen, und die auch oft, daraus verwendet werden.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Module werden nur einmal importiert. Sie werden in sys.modules zwischengespeichert. Wenn das gleiche Modul nochmal importiert wird, wird zuerst im Cache nachgesehen. Da sys.modules ein dict ist, kostet der Aufruf kaum Zeit.