2010-09-23 7 views
56

Dziś zauważyłem coś dziwnego, co chciałbym wyjaśnić. Nie byłem w 100% pewny, jak to sformułować jako pytanie, więc google jest wykluczone. Moduł logowania nie ma dostępu do modułu logging.handlers z jakiegoś dziwnego powodu. Spróbuj sam, jeśli mi nie wierzysz:Dlaczego moduły Pythona czasami nie importują swoich podmodułów?

>>> import logging 
>>> logging.handlers 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute 'handlers' 
>>> import logging.handlers 
>>> logging.handlers 
<module 'logging.handlers' from '/usr/lib/python2.6/logging/handlers.pyc'> 

Czy ktoś może wyjaśnić, dlaczego tak się dzieje?

Odpowiedz

73

W języku Python moduły muszą zostać zaimportowane, zanim będą dostępne. import logging importuje tylko moduł rejestrowania. Tak się składa, że ​​logging jest pakietem z submodułami, ale te moduły wciąż nie są automatycznie ładowane. Musisz więc jawnie zaimportować logging.handlers, zanim uzyskasz do niego dostęp.

Jeśli zastanawiasz się, dlaczego wygląda na to, że nie potrzebujesz tych dodatkowych importów: niektóre paczki importują niektóre lub wszystkie swoje submoduły, gdy są importowane - po prostu robiąc import w swoich plikach __init__.py. W innych przypadkach może się zdarzyć, że coś innego zaimportujesz, również zaimportowane logging.handlers. Nie ma znaczenia, który fragment kodu importuje; tak długo jak coś w twoim procesie importuje logging.handlers zanim uzyskasz dostęp, będzie tam. Czasami moduł, który wygląda jak pakiet, naprawdę nie jest taki, jak na przykład: os i. os nie jest pakietem, po prostu importuje właściwy inny moduł (dla twojej platformy) i nazywa go path, aby można było uzyskać do niego dostęp jako os.path.

3

Jestem również nowy w Pythonie i po dużo praktyki teraz mogę rozróżniać, opakowaniu (folderu), moduł (.py), klasy, zmienne ... etc ...

jeśli chcesz, aby którykolwiek z twoich folderów był pakietem python - Musi zawierać __init__.py plik, który zrobi pusty plik !!!

i jak powiedział Thomas, możesz zaimportować dodatkowy moduł w __init__.p y jeśli chcesz !!! ale moduły/pakiety są dostępne tylko po zaimportowaniu go ...

jeśli chcesz zaimportować wszystko z modułu można użyć

from logging import * 

resztę można uzyskać dostęp do procedury obsługi modułu jak poniżej też

from loggin import handlers 
print dir(handlers) 
+3

Proszę nie używać 'from module import *'. To prawie zawsze błąd. –

+0

Jeśli chcesz, aby wszystko w paczce zostało zaimportowane automatycznie, importuj je w __init__.py, zamiast ustawiać __all__ w __init__.py i robić "z importu paczek *" gdzieś. –

+0

tak, masz rację! – shahjapan

1

Ostatnio miałem do czynienia z tą samą dziwną sytuacją. Założę się więc, że usunięto importowanie lib innej firmy. Ta usunięta biblioteka zawierała from logging import handlers lub from logging import * i dostarczyła ci handlers. A w innym skrypcie masz coś takiego jak import logging i właśnie użyłeś logging.handlers i myślałeś, że to jest sposób, w jaki działa tak jak ja.

Powiązane problemy