Seite 1 von 1

"globalen" Code modularisieren

Verfasst: Dienstag 27. Februar 2018, 10:17
von Heon
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

Re: "globalen" Code modularisieren

Verfasst: Dienstag 27. Februar 2018, 10:46
von __deets__
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?

Re: "globalen" Code modularisieren

Verfasst: Dienstag 27. Februar 2018, 10:49
von Sirius3
@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.

Re: "globalen" Code modularisieren

Verfasst: Dienstag 27. Februar 2018, 11:27
von Heon
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

Re: "globalen" Code modularisieren

Verfasst: Dienstag 27. Februar 2018, 11:59
von Sirius3
@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.

Re: "globalen" Code modularisieren

Verfasst: Dienstag 27. Februar 2018, 11:59
von __deets__
Includes in dem Sinne gibt es nicht. Aber natuerlich Module. Gibt es einen Grund, die nicht zu benutzen?

Re: "globalen" Code modularisieren

Verfasst: Dienstag 27. Februar 2018, 19:53
von Heon
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!