"globalen" Code modularisieren

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
Heon
User
Beiträge: 8
Registriert: Dienstag 27. Februar 2018, 10:03

Dienstag 27. Februar 2018, 10:17

Hallo zusammen,

ich bin ein ziemlicher Neuling und hoffe meine Frage ist jetzt nicht zu trivial (habe aber zumindest in Tutorials und mit de Suche keine sinnige Lösung gefunden)

Ich möchte zu Anfang meiner Skripte einige Sachen initialisieren
z.B. bestimmte globale Variablen füllen
oder eine Anweisung wie logger = logging.getLogger(__name__) usw.

Um die Skripte besser lesbar zu machen würde ich diese "Start-Initialisierung" gerne modularisieren. Wenn ich dies aber mit einer Funktion tue passiert die Initialisierung ja auf deren Ebene und nicht global.

Wie man macht man sowas am besten oder geht das gar nicht ?

Heon
__deets__
User
Beiträge: 2841
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 27. Februar 2018, 10:46

Fuer das konkrete Beispiel kannst du natuerlich problemlos

Code: Alles auswählen

from mylib import init

logger = init(__name__)
machen, aber ganz ehrlich: das ist nicht wirklich so gut. Und was ausser dem Logger (der ja auch nicht in jedes Modul *muss*, kann ja auch im Package darueber einer sein, das reicht dann ggf) soll denn da so stehen, was *alle* Module haben?
Sirius3
User
Beiträge: 7772
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 27. Februar 2018, 10:49

@Heon: es gibt eigentlich nichts, was man in jedem Modul am Anfang machen müßte, so dass es keinen Sinn macht, das wieder in ein anderes Modul auszulagern. `logger` sind für jedes Modul individuell und globale Variablen sollte es nicht geben. Handelt es sich um Konstanten, dann ginge ja der Kontext verloren, dass es sich um Konstanten dieses Moduls handelt, dann wären es ja Konstanten des neuen Moduls.
Heon
User
Beiträge: 8
Registriert: Dienstag 27. Februar 2018, 10:03

Dienstag 27. Februar 2018, 11:27

Hallo,

vielleicht habe ich es unklar ausgedrückt oder ich denke einfach in die falsche Richtung.
Ich habe in meinem Modul ein Hauptprogramm (wenn das in Python so überhaupt heißt) und viele Funktionen.
Zum Start meines Hauptprogrammes mache ich viele Dinge, wie dass ich z.B. den Logger starte oder eben initiale Werte an Variablen zuweise oder eben auch Konstanten definiere. Und ich persönlich finde es eben schlecht lesbar wenn da erstmal soviel Spagetti-Initialsierung stattfindet. In ABAP kann man solch einen Code-Schnipsel z.B. in ein Include auslagern.

Heon
Sirius3
User
Beiträge: 7772
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 27. Februar 2018, 11:59

@Heon: kannst Du ein Beispiel posten?

Eine typisches Python-Modul sieht so aus:

Code: Alles auswählen

import a
import b
import logging
logger = logging.getLogger(__name__)

KONSTANTE_A = 1
KONSTANTE_B = 2

def funktion1():
    ...

def funktion2():
    ...

def main():
    das Hauptprogramm

if __name__ == '__main__':
    main()
Wird einem das zu viel, kann man Funktionen und Konstanten in sinnvolle Gruppen zusammenfassen und als weiteres Modul importieren. Steht in `main` zu viel Initialisierung, kann man dafür ja auch einfach eine Funktion schreiben. Zu viel geht eigentlich aber auch gar nicht, weil bei mehr als einer Handvoll lokaler Variablen ist die Funktion sowieso zu lang und sollte weiter aufgeteilt werden, und eventuell Klassen eingeführt werden.
__deets__
User
Beiträge: 2841
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 27. Februar 2018, 11:59

Includes in dem Sinne gibt es nicht. Aber natuerlich Module. Gibt es einen Grund, die nicht zu benutzen?
Heon
User
Beiträge: 8
Registriert: Dienstag 27. Februar 2018, 10:03

Dienstag 27. Februar 2018, 19:53

OK,
jetzt habe ich es glaubich kapiert, das Beispiel hat mir weitergeholfen, das was ich als Initialisierung meinte steht da ja auch außerhalb des Hauptprogramms, das passt dann.

Danke!
Antworten