Seite 1 von 1

Seiteneffekte oder Stilfrage zu Mehrfachimport aus gleichem Modul

Verfasst: Sonntag 3. August 2025, 10:24
von eddi27L
Variante 1:

Code: Alles auswählen

import my_file
from my_file import FileType
Variante 2:

Code: Alles auswählen

import my_file
FileType = my_file.FileType
Gibt es Seiteneffekte, stilistische Gründe oder andere Gründe dafür, eine der beiden Varianten zu bevorzugen?

Re: Seiteneffekte oder Stilfrage zu Mehrfachimport aus gleichem Modul

Verfasst: Sonntag 3. August 2025, 11:13
von nezzcarth
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.

Re: Seiteneffekte oder Stilfrage zu Mehrfachimport aus gleichem Modul

Verfasst: Sonntag 3. August 2025, 12:50
von Sirius3
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.

Re: Seiteneffekte oder Stilfrage zu Mehrfachimport aus gleichem Modul

Verfasst: Sonntag 3. August 2025, 13:14
von eddi27L
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.

Re: Seiteneffekte oder Stilfrage zu Mehrfachimport aus gleichem Modul

Verfasst: Sonntag 3. August 2025, 13:38
von snafu
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.

Re: Seiteneffekte oder Stilfrage zu Mehrfachimport aus gleichem Modul

Verfasst: Sonntag 3. August 2025, 13:49
von noisefloor
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`.

Gruß, noisefloor

Re: Seiteneffekte oder Stilfrage zu Mehrfachimport aus gleichem Modul

Verfasst: Sonntag 3. August 2025, 14:46
von nezzcarth
@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).

Re: Seiteneffekte oder Stilfrage zu Mehrfachimport aus gleichem Modul

Verfasst: Sonntag 3. August 2025, 14:56
von __blackjack__
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.

Re: Seiteneffekte oder Stilfrage zu Mehrfachimport aus gleichem Modul

Verfasst: Montag 4. August 2025, 08:20
von DeaD_EyE
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.

k.py

Code: Alles auswählen

import sys


old = set(sys.modules.keys())

for _ in range(1000):
    import math


for name in (sys.modules.keys() - old):
    print(name)
Unter Windows:

Code: Alles auswählen

py -3.13 -X importtime .\k.py
Ausgabe:
import time: self [us] | cumulative | imported package
import time: 146 | 146 | winreg
import time: 240 | 240 | _io
import time: 60 | 60 | marshal
import time: 244 | 244 | nt
import time: 1187 | 1729 | _frozen_importlib_external
import time: 678 | 678 | time
import time: 421 | 1098 | zipimport
import time: 59 | 59 | _codecs
import time: 721 | 779 | codecs
import time: 883 | 883 | encodings.aliases
import time: 1650 | 3311 | encodings
import time: 443 | 443 | encodings.utf_8
import time: 474 | 474 | encodings.cp1252
import time: 67 | 67 | _signal
import time: 39 | 39 | _abc
import time: 324 | 363 | abc
import time: 325 | 687 | io
import time: 81 | 81 | _stat
import time: 361 | 441 | stat
import time: 1171 | 1171 | _collections_abc
import time: 106 | 106 | genericpath
import time: 126 | 126 | _winapi
import time: 545 | 775 | ntpath
import time: 1095 | 3480 | os
import time: 111 | 111 | _sitebuiltins
import time: 98 | 98 | errno
import time: 490 | 490 | encodings.utf_8_sig
import time: 624 | 624 | types
import time: 539 | 539 | importlib
import time: 590 | 590 | importlib._abc
import time: 437 | 1566 | importlib.util
import time: 98 | 98 | importlib.machinery
import time: 726 | 726 | sitecustomize
import time: 391 | 391 | usercustomize
import time: 3548 | 11128 | site
import time: 92 | 92 | math
math
Das Modul math ist nur einmal geladen worden. Ansonsten würde man 1000 Mal import time: .... math sehen. Das ist nicht der Fall.