Seite 1 von 1

Gestaltung Package / __init__.py

Verfasst: Freitag 21. Juli 2017, 14:51
von homerunjack
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

Re: Gestaltung Package / __init__.py

Verfasst: Freitag 21. Juli 2017, 16:24
von 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.