7 Stimmen

Wie man auf __init__.py Variablen von tieferen Teilen eines Pakets zugreift

Ich entschuldige mich für eine weitere __init__.py Frage.

Ich habe die folgende Paketstruktur:

+contrib
  +--__init__.py
  |
  +database
      +--__init__.py
      |
      +--connection.py

In der __init__.py auf der obersten Ebene definiere ich: USER='me'. Wenn ich von der Befehlszeile aus import contrib, dann kann ich auf contrib.USER zugreifen.

Jetzt möchte ich von innerhalb von connection.py auf contrib.user zugreifen, aber ich kann es nicht.

Die __init__.py auf der obersten Ebene wird aufgerufen, wenn ich from contrib.database import connection ausführe, also erstellt Python wirklich den Parameter USER.

Also die Frage lautet: Wie greifen Sie auf die in der __init__.py auf der obersten Ebene deklarierten Parameter und Variablen von den Kindern aus zu.

Danke.

EDIT:

Ich sehe ein, dass Sie import contrib zu connection.py hinzufügen können, aber es scheint redundant zu sein, da offensichtlich (falsch?) ist, dass Sie contrib bereits importiert haben, wenn Sie connection.py benötigen.

13voto

Wai Yip Tung Punkte 17066

Hinzufügen von import contrib zu connection.py ist der richtige Weg. Ja, das contrib-Modul ist bereits importiert (Sie können dies aus sys.modules herausfinden). Das Problem ist, dass es keine Referenz zum Modul in Ihrem Code in connection.py gibt. Durch ein weiteres Importieren erhalten Sie die Referenz. Sie müssen sich keine Sorgen um zusätzliche Ladezeit machen, da das Modul bereits geladen ist.

1 Stimmen

In der Theorie könnten Sie es aus sys.modules herausholen, da Sie wissen, dass es dort ist, aber ich würde dringend davon abraten, das zu tun. Die Antwort von Wai Yip Tung ist viel besser.

0voto

Yann Ramin Punkte 32375

Sie müssen contrib in connection importieren. Verwenden Sie entweder einen relativen Import (..contrib) oder einen absoluten Import.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X