2010-09-23 4 views
56

Mir ist heute etwas komisches aufgefallen, das ich gerne erklärt hätte. Ich war mir nicht 100% sicher, wie man das als Frage formuliert, also kommt Google nicht in Frage. Das Protokollierungsmodul hat aus irgendeinem Grund keinen Zugriff auf das Modul logging.handlers. Probieren Sie es selbst aus, wenn Sie mir nicht glauben:Warum importieren Python-Module manchmal ihre Untermodule nicht?

Kann jemand erklären, warum das passiert?

Antwort

73

In Python müssen Module importiert werden, bevor sie zugänglich sind. import logging importiert nur das Protokollierungsmodul. Es kommt vor, dass logging ein Paket mit Submodulen ist, aber diese Submodule werden immer noch nicht automatisch geladen. Sie müssen daher logging.handlers explizit importieren, bevor Sie darauf zugreifen können.

Wenn Sie sich wundern, warum es manchmal so aussieht, brauchen Sie diese zusätzlichen Importe nicht: Einige Pakete importieren einige oder alle ihre Submodule, wenn sie importiert werden - einfach indem Sie diese Importe in ihre __init__.py Dateien vornehmen. In anderen Fällen könnte es sein, dass etwas anderes, das Sie importieren, auch logging.handlers importiert wird. Es spielt keine Rolle, welcher Codecode importiert wird. Solange etwas in Ihrem Prozess logging.handlers importiert, bevor Sie darauf zugreifen, wird es da sein. Und manchmal ist ein Modul, das wie ein Paket aussieht, wirklich nicht eins, wie os und os.path. os ist kein Paket, es importiert nur das korrekte andere Modul (für Ihre Plattform) und ruft es path auf, nur damit Sie darauf als os.path zugreifen können.

3

Ich bin auch neu in Python und nach jetzt viel Übung, die ich zwischen Paket (Ordner), Modul (Py), Klassen, Variablen ... etc ...

unterscheiden kann, wenn Sie wollen, dass jeder Ihrer Ordner Python-Paket sein - Es muss __init__.py Datei enthalten auch leere Datei wird es tun!

und wie Thomas sagte, können Sie zusätzliches Modul in __init__.p y importieren, wenn Sie wollen !!! aber Module/Pakete sind nur zugänglich, nachdem sie den Import ...

wenn man alles von einem Modul importieren möchten, können Sie

from logging import * 

Rest verwenden, können Sie die Handler wie unten Modul zugreifen,

from loggin import handlers 
print dir(handlers) 
+3

Bitte nicht 'von Modulimport *' verwenden. Es ist fast immer ein Fehler. –

+0

Wenn Sie möchten, dass alles in einem Paket automatisch importiert wird, führen Sie diese Importe in __init__.py durch, statt __all__ in __init__.py zu setzen und irgendwo von Paketimport *. –

+0

ja, du hast Recht! – shahjapan

1

Ich habe vor kurzem die gleiche seltsame Situation konfrontiert. Also, ich wette, Sie haben einige Lib-Import von Drittanbietern entfernt. Diese entfernte Lib enthielt oder from logging import * und stellte Ihnen handlers zur Verfügung. Und in einem anderen Skript haben Sie etwas wie import logging und nur logging.handlers verwendet und Sie haben gedacht, dass die Dinge so funktionieren wie ich.

Verwandte Themen