Seite 1 von 1

Kurze Frage zu __all__

Verfasst: Freitag 14. Januar 2011, 11:00
von burli
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?

Re: Kurze Frage zu __all__

Verfasst: Freitag 14. Januar 2011, 11:14
von Xynon1
"__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.

Re: Kurze Frage zu __all__

Verfasst: Freitag 14. Januar 2011, 11:21
von burli
Xynon1 hat geschrieben:Hast du es nicht definiert, so wird alles importiert.
So wie ich das verstanden habe eben nicht.

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;

Re: Kurze Frage zu __all__

Verfasst: Freitag 14. Januar 2011, 11:36
von Xynon1
stimmt :oops: , ich nehm alles zurück sollte so richtig sein.

Re: Kurze Frage zu __all__

Verfasst: Freitag 14. Januar 2011, 12:13
von snafu
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.

Re: Kurze Frage zu __all__

Verfasst: Freitag 14. Januar 2011, 15:09
von burli
Gut, dann hab ich das richtig interpretiert, danke

Re: Kurze Frage zu __all__

Verfasst: Freitag 14. Januar 2011, 15:21
von snafu
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.