Kurze Frage zu __all__
Hi, ich habe nur eine kurze Verständnisfrage zu __all__. Wenn man ein Package mit einer __init__.py Datei erstellt braucht man __all__ doch nur zu verwenden, wenn man das Package mit "from package import *" importieren will, ist das soweit richtig?
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
"__all__" dient dazu die Namesräume soweit wie möglich bei *-importen freizuhalten, denn nur was in der "__all__"-Liste steht wird auch importiert. Hast du es nicht definiert, so wird alles importiert.
Also hast du Pakete/Module/Klassen/Funktionen/Andere-Variablen welche nicht bei *-importen mit importiert werden sollen, solltest du "__all__" auf jeden Fall mit definieren.
Also hast du Pakete/Module/Klassen/Funktionen/Andere-Variablen welche nicht bei *-importen mit importiert werden sollen, solltest du "__all__" auf jeden Fall mit definieren.
So wie ich das verstanden habe eben nicht.Xynon1 hat geschrieben:Hast du es nicht definiert, so wird alles importiert.
Das Tutorial sagt:
If __all__ is not defined, the statement from sound.effects import * does not import all submodules from the package sound.effects into the current namespace;
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Es werden nur diejenigen Namen übernommen, welche sich im globalen Namensraum des mit Sternchen importierten Moduls befinden. Wenn ein "Untermodul" dort nicht auf globaler Ebene referenziert wird, dann wird es entsprechend auch nicht auf magische Weise übernommen. Mehr soll dieser Hinweis sicher nicht sagen. Bei einer Verzeichnisstruktur ist mit `/foo/*` ja auch nicht alles, was sich rekursiv unter `foo` befindet, gemeint, sondern es wird lediglich um eine Ebene abgestiegen.
Ich denke aber, es sollte klar sein, dass sich dieses Verhalten sukzessive auf alle importierten Module bezieht. Das importierte Modul `foo` könnte immer noch `bar` importieren, wodurch ggf auch `bar`-Code, welcher nicht durch Funktionen geschützt ist, ausgeführt werden kann. Der globale Namensraum des ursprünglichen "Importeurs" wird damit aber natürlich nicht zugemüllt.
