Gestaltung Package / __init__.py

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
homerunjack
User
Beiträge: 24
Registriert: Donnerstag 21. Juli 2016, 12:12

Hallo,

beim erstellen von Packages ist mir etwas aufgefallen, was ich mir spontan nicht erklären kann.

Folgendes Setup:
main.py
package
-->__init__.py
-->subpackage
---->__init__.py

In package/__init__.py includiere ich das subpackage. Wenn ich nun die package/__init__.py laufen lasse, wird durch das importieren alles doppelt ausgeführt??? Wie lässt sich das erklären?

main.py

Code: Alles auswählen

import package

x = package.hallo1()
package/__init__.py

Code: Alles auswählen

import package.subpackage as sub

class hallo1():
    def __init__(self):
        print('Das ist ein Package')

print('Hallo')
y = sub.hallo2()
subpackage/__init__.py

Code: Alles auswählen

class hallo2():

    def __init__(self):
        print('Hallo2')
        a = 1
        b = 2
        print(a+b)
Wenn ich die Main starte, wird alles wie man es erwartet ausgegeben:

Code: Alles auswählen

Hallo
Hallo2
3
Das ist ein Package
Wenn ich das package/__init__.py ausführe, wird alles doppelt ausgeführt (wegen dem import?):

Code: Alles auswählen

Hallo
Hallo2
3
Hallo
Hallo2
3
Wie kann man verhindern, dass beim Importieren von package.subpackage auch package ausgeführt wird?
Wie würde eine ordentlich Struktur aussehen?

Beste Grüße
homerunjack
BlackJack

@homerunjack: Das was Du ausführst darf nicht noch mal beim ausführen von irgendwo anders her importiert werden denn beim ausführen hat es einen anderen Namen (`__main__`). Das ist keine Frage der Struktur sondern das man auf Modulebene einfach nichts ausführt das solche Seiteneffekte hat und den Code der als Programm ausgeführt werden soll über ``if __name__ == '__main__':`` absichert, so das es kein Problem darstellt dass das Modul das als Programm ausgeführt wird, eventuell zweimal importiert wird.
Antworten