Variablen über ein importiertes Modul erzeugen

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
capill
User
Beiträge: 3
Registriert: Dienstag 27. Juli 2021, 17:35

Moin wertes Forum,

ich habe einen Algorithmus geschrieben (als Funktion mit Unterfunktionen), der die Aufgabe hat, zwei Parameter (a und b) einer Modellfunktion an Messwerte anzupassen (ähnlich den Modul Curve-Fit aus Scipy) um anschließend eine passende Ausgleichkurve zu plotten. Diese errechneten Parameter werden in entsprechenden Variablen gespeichert. Nun möchte ich diesen Algorithmus als Modul in anderen Dateien verwenden, in denen entsprechende Messwerte liegen. Allerdings stehe ich jetzt vor dem Problem, dass ich nicht weiß, wie ich diese Variablen (a und b) an die Datei, in der ich den Algorithmus importiert habe, übergeben kann. Globale Variablen sind offensichtlich nur auf das Modul begrenzt.

Ich möchte unbedingt vermeiden irgendwelche Codeschnipsel aufzusammeln, ohne genau zu wissen was sie tatsächlich bewirken. Mit Klassen kenne ich mich derzeit noch nicht aus - daher hoffe ich auf eine einfache Lösung.

Das Kernproblem in Kurzform:
Variablen einer Datei mit einem importierten Modul erzeugen.

Vielen Dank für eure Hilfe.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Als Argumente an Funktionen. Globale Variablen sollte man nie verwenden.
capill
User
Beiträge: 3
Registriert: Dienstag 27. Juli 2021, 17:35

Das auf globale Variablen möglichst verzichtet werden sollte, habe ich bereits verinnerlicht - funktioniert an dieser Stelle auch nicht (ich habe es versucht :P). Die Ausgabe der Variablen a und b als Rückgabewert der Funktion ist hier auch unpraktisch, da soweit ich weiß, nur ein Parameter, bzw. ein Tupel zurückgegeben werden kann.

Das ganze soll wie folgt ablaufen:

1. Die Messdaten importieren
2. eine Modellfunktion aufstellen (in denen die zu bestimmenden Parameter enthalten sind)
3. Den Algorithmus (als importiertes Modul) ausführen
4. Das Modul erzeugt die beiden Variablen a und b (die Parameter für die Modellfunktion) in der aktuellen Datei.

Anschließend kann die angepasste Modellfunktion geplottet werden.

das Ganze funktioniert einwandfrei - solange der Code des Algorithmus in der Datei enthalten ist. Ich möchte aber aus verständlichen Gründen die Möglichkeit haben, einfach den Algorithmus als Modul zu importieren.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@capill,

es wäre einfacher, wenn du wenigstens einen Auszug des bestehenden Programms hier posten könntest.
Die Ausgabe der Variablen a und b als Rückgabewert der Funktion ist hier auch unpraktisch, da soweit ich weiß, nur ein Parameter, bzw. ein Tupel zurückgegeben werden kann.
Warum ist das unpraktisch? Du kannst doch die beiden Variablen dann wieder aus dem Tuple entpacken:

Code: Alles auswählen

# im zu importierenden modul
def curvefitting(measurements):
    ...
    # a und b berechnen
    return a, b


# im importierenden modul
from anderes_modul import curvefitting

a, b = curvefitting(measurements)
Statt Variablen aus einem anderen Modul zu importieren, importiert man die Funktion und führt sie im Hauptmodul aus mit den Messwerten als Eingangsparametern und a und b als Rückgabewerten.
capill
User
Beiträge: 3
Registriert: Dienstag 27. Juli 2021, 17:35

Warum ist das unpraktisch? Du kannst doch die beiden Variablen dann wieder aus dem Tuple entpacken:
Ich wollte möglichst viele "Extra-Schritte" vermeiden. Es sollte einfach nur der das importierte Modul ausführt werden, aber...

Code: Alles auswählen

# im zu importierenden modul
def curvefitting(measurements):
    ...
    # a und b berechnen
    return a, b


# im importierenden modul
from anderes_modul import curvefitting

a, b = curvefitting(measurements)
Statt Variablen aus einem anderen Modul zu importieren, importiert man die Funktion und führt sie im Hauptmodul aus mit den Messwerten als Eingangsparametern und a und b als Rückgabewerten.
... so hatte ich das noch gar nicht versucht - wohl aus Unwissenheit. Das Funktioniert allerdings hervorragend und sollte auf den ersten Blick meine Probleme lösen. Vielen Dank dafür - wieder etwas dazugelernt!
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Wenn man etwas mehr Struktur haben, aber keine eigene Klasse schreiben möchte, kann man für solche Rückgabe-Objekte auch ein namedtuple verwenden (https://docs.python.org/3/library/colle ... namedtuple).
Antworten