98 votes

Pourquoi les modules Python n'importent-ils parfois pas leurs sous-modules?

J'ai remarqué quelque chose de bizarre aujourd'hui que j'aimerais expliquer. Je n'étais pas sûr à 100% de la formulation même de cette question, alors Google est hors de question. Le module de journalisation n'a pas accès au module logging.handlers pour une raison quelconque. Essayez vous-même si vous ne me croyez pas:

 >>> 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'>
 

Quelqu'un peut-il expliquer pourquoi cela se produit?

127voto

Thomas Wouters Points 38811

En Python, les modules doivent être importés avant qu'ils ne soient accessibles. import logging des importations juste le module de journalisation. Il arrive que l' logging est un package avec submodules, mais ceux submodules sont toujours pas chargé automatiquement. Donc, vous devez explicitement à l'importation logging.handlers avant de pouvoir y accéder.

Si vous vous demandez pourquoi il ressemble à parfois, vous n'avez pas besoin de ces importations: certains paquets importer tout ou partie de leur submodules, lorsqu'ils sont importés -- simplement en faisant les importations dans leur __init__.py fichiers. Dans d'autres cas, il peut être que quelque chose d'autre que vous importez, également importé logging.handlers. Il n'a pas d'importance qui morceau de code ne l'importation; aussi longtemps que quelque chose dans votre processus d'importations en logging.handlers avant d'y accéder, il va y être. Et parfois, un module qui ressemble à un paquet n'est pas vraiment un, comme os et os.path. os n'est pas un paquet, il est juste importations de le corriger d'un autre module (pour votre plate-forme) et l'appelle path, de sorte que vous pouvez accéder en tant que os.path.

4voto

shahjapan Points 4043

Je suis aussi python et après avoir eu beaucoup de pratique maintenant, je peux différencier, paquet (dossier) , le module(.py) , les classes,les variables...etc...

si vous souhaitez tout de votre dossier dans le paquet python - Il doit contenir __init__.py le fichier de même fichier vide va faire !!!

et comme Thomas a dit, vous pouvez importer le module supplémentaire en __init__.py si vous voulez !!! mais les modules/packages ne sont accessibles qu'après l'importation, il...

si vous voulez tout importer à partir d'un module, vous pouvez utiliser

from logging import *

reste vous pouvez accéder aux gestionnaires de module comme ci-dessous trop,

from loggin import handlers
print dir(handlers)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X