Kurze Frage zu __all__

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
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

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:
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

"__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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

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;
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

stimmt :oops: , ich nehm alles zurück sollte so richtig sein.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Gut, dann hab ich das richtig interpretiert, danke
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Antworten