Multiple Variablen in anderer .py Datei nutzen

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
drnicolas
User
Beiträge: 105
Registriert: Sonntag 24. Juli 2016, 10:32

Ich habe mein Projekt in mehrere einzelne Dateien aufgesplittet.

Entsprechend rufe ich aus 1.py Funktionen in 2.py auf.

Gleichzeitig habe ich aber in 1.py eine ganze Reihe von Variablen, die eigentlich auch in 2.py bekannt sein sollen - grob alle möglichen Konfigurationseinstellungen

Wie übergebe ich diese Variablen, resp. wie mache ich diese Variablen in 2.py bekannt?

Das hat nicht gut funktioinert:
- ich importiere die Variablen von 1.py in 2.py, etwa so ...

Code: Alles auswählen

from 1.py import var1, var2,  var 3
Das funktioniert zwar, enthält aber nur die Default-Werte, mit denen ich die Varaiblen in 1.py vrobelegt habe.
Die Änderungen, beispeilsweise durch cmdline-Parameter tauchen da überraschenderweise nicht auf.

Vielleicht ist mein Verfahren aber auch grundlegend verkehrt.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Globaler Zustand, der nachträglich verändert wird, ist grundlegend verkehrt. Darum sollte man das schlicht nicht machen. Wenn deine Funktionen Einstellungen brauchen, übergib die als simple Argumente an deine Funktion.

Der Import den du verwendest Holt dir die Werte gebunden an die Namen in dein Modul. Dadurch sieht man da keine Änderungen. Ein simples “import one” und Zugriffe mit “one.wert” löst das. Aber nochmal: globale Variablen sind grundlegend Verkehrt.
Benutzeravatar
noisefloor
User
Beiträge: 4195
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

alles, was du importierst, hat den Wert zum Zeitpunkt des Imports. Egal ob Variable oder Funktion oder Klasse. Und das ist ja auch genau richtig so, weil du sonst ja nicht wirklich weiß, was du genau importiert hast.

Gruß, noisefloor
drnicolas
User
Beiträge: 105
Registriert: Sonntag 24. Juli 2016, 10:32

Schon umgesetzt.
Leider keine Änderung. Es kommen genau wieder die Deafult-Werte wie mit der ursprünglichen Variante.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da wirst du mehr Code zeigen müssen. Aber nochmal: so macht man das nicht.
drnicolas
User
Beiträge: 105
Registriert: Sonntag 24. Juli 2016, 10:32

Wie wäre denn ein besserer Weg?

Ich habe recht viele Konfigurationsvariablen. Die sind fast alle mit Default-Werten belegt, werden dann aber durch Parameter modifiziert

Diese "globalen" Variablen werden in mehr oder minder grosser Zahl in verschiedenen Funktionen benötigt.
Jede Variable als Parameter zu übergeben ist sicherlich machbar, gibt aber z.T. endlose Übergabelisten

Ich bin unerfahren in python.
In C würde ich das mit einer struct machen und in weiteren Dateien mit import der .h-Datei den Aufbau der struct bekannt machen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das geht ja auch in Python. Zb kannst du dir eine Datenklasse (gibt ein eingebautes Modul) machen, und die reinreichen.
Sirius3
User
Beiträge: 18278
Registriert: Sonntag 21. Oktober 2012, 17:20

In Python gibt es Klassen. Aber selbst die Configparser-Instanz herumzureichen ist schon besser, als globale Variablen. Wenn eine Funktion eine große Zahl an Variablen braucht, dann ist das ein Zeichen dafür, dass die Funktion zu viele verschiedene Dinge macht und besser in mehrere aufgeteilt sein sollte.
Antworten