Variablen an Import übergeben

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.
Antworten
taake
User
Beiträge: 125
Registriert: Donnerstag 14. Oktober 2010, 08:49

Hey,
mal ein kleiner Umriss:
Folgendes, ich habe ein ziemlich großes python script ist im laufe der Zeit auf ~ 1,5k Codezeilen angewachsen, sehr unübersichtlich.
Daher bin ich gerade daran quasi die haupt und unterfunktionen in extra Dateien zu stecken und dann zu importieren, so weit so klar.

Zur Frage:
Kann und wenn ja wie, ich Variablen die ich im "Hauptscript" gesetzt habe auch an die imports weitergeben ?

Also klar ich kann die einfach auch in die Datei schreiben die ich importiere, allerdings müsste ich sie dort auch jedes mal anpassen wenn ich sie im hauptscript ändere, was ich halt wenn möglich gerne vermeiden würde.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@taake: Variablen werden an Funktionen als Argumente übergeben.
BlackJack

@taake: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. *Keine Variablen*! Auch das Hauptprogramm sollte in einer Funktion stehen, üblicherweise `main()` genannt. Globale Variablen sind einer der Gründe warum Code schnell unübersichtlich wird und man Funktionen schlecht separat testen oder verwenden kann, oder halt auch schlecht in ein anderes Modul verschieben kann weil die Funktion keine in sich abgeschlossene Einheit mehr ist wenn sie von Variablen aus der ”Umgebung” abhängig ist.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

taake hat geschrieben:Kann und wenn ja wie, ich Variablen die ich im "Hauptscript" gesetzt habe auch an die imports weitergeben ?
Gar nicht. Die Übergabe von Variablen an Module ist nicht möglich. Ein Modul ist eher wie ein Namensraum zu verstehen. Und wie BlackJack schon schrieb: Globale Variablen sollten komplett vermieden werden. Lediglich Konstanten sind auf globaler Ebene in Ordnung.

Du könntest, falls es sich um sehr viele Variablen handelt, höchstens eine Art Kontext-Objekt schreiben, dessen Datenstruktur in allen betroffenen Modulen bekannt ist. Dann könnten in deinem Hauptmodul die Aufrufe der Hilfsfunktion mit Übergabe des Kontext-Objektes umgesetzt werden, welches die benötigten Variablen enthält. So ein Kontext-Objekt könnte z.B. einfach ein `dict` oder ein `namedtuple` sein.

Aber wie gesagt: Die deutlich schönere Variante ist, den Code so umzuschreiben, dass keinerlei globale Variablen mehr benötigt werden.
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

Hallo,

die paar Zeilen Code sind jetzt nur mal so auf die Schnelle hingeschrieben. Sie sollen mal das Grundprinzip vereinfacht darstellen.

funktion.py

Code: Alles auswählen

def main():
    print(addiere(6, 5))

def addiere(a, b):
    return a + b

if __name__ == '__main__':
    main()
mainscript.py

Code: Alles auswählen

import funktion

def main():
    print(funktion.addiere(2, 3))

if __name__ == '__main__':
    main()
Das Script funktion.py enthält die Funktionen main und addiere. Main wird ausgeführt, wenn das Script direkt gestartet wird. Wird das Script als Modul importiert passiert nix.

Im Script maiscript.py wird das Script als Modul funktion.py importiert. Wird dieses Script direkt ausgeführt, dann wird die Funktion main aufgerufen, diese ruft wiederrum aus dem Modul funktion die Funktion addiere auf.
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

und das ist der Grund, wieso man *-Import einfach nicht machen sollte:

Code: Alles auswählen

from funktion import *

def main():
    #woher kommt die Funktion addiere???????
    print(addiere(2, 3))

if __name__ == '__main__':
    main()
Hier in dem Beispielt steht nur eine import-Anweisung. Was ist aber wenn da 10, 20, 30 stehen? Außerdem kann es so passieren, dass die Funktion addiere eine andere Funktion addiere aus einem anderen Modul überschreibt oder umgekehrt.
Antworten