Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Entrangeté à l'import d'un module

3 réponses
Avatar
Alex Marandon
Bonjour,

Voici quelque chose qui m'a fait perdre quelques minutes :

>>> import logging
>>> logging.handlers.RotatingFileHandler
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'handlers'
>>> import logging.handlers
>>> logging.handlers.RotatingFileHandler
<class logging.handlers.RotatingFileHandler at 0x785db0>


Alors que d'habitude:

>>> import os
>>> os.path.join
<function join at 0x3f770>


Pourquoi dans le premier cas est-on obligé d'importer explicitement le
sous module et pas dans le second ?

Bonne fin de vendredi à tous :)

3 réponses

Avatar
Laurent Pointal
Le Fri, 13 Jun 2008 16:09:38 +0100, Alex Marandon a écrit :

Bonjour,

Voici quelque chose qui m'a fait perdre quelques minutes :

import logging
logging.handlers.RotatingFileHandler
Traceback (most recent call last):



File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'handlers'
import logging.handlers
logging.handlers.RotatingFileHandler
<class logging.handlers.RotatingFileHandler at 0x785db0>





Alors que d'habitude:

import os
os.path.join
<function join at 0x3f770>





Pourquoi dans le premier cas est-on obligé d'importer explicitement le
sous module et pas dans le second ?


Si tu regardes dans les modules standards Python, tu verras qu'il y a un
*module* os.py, qui exporte explicitement un symbole path. Par contre,
logging est bien un *package* et - à moins qu'ils n'automatisent des
choses via le __init__.py, il faut explicitement importer les sous-
modules.

Voilà.

Bonne fin de vendredi à tous :)


Itou.



--
Laurent POINTAL -




Avatar
Alex Marandon
Laurent Pointal wrote:
import logging
logging.handlers.RotatingFileHandler
Traceback (most recent call last):



File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'handlers'
import logging.handlers
logging.handlers.RotatingFileHandler
<class logging.handlers.RotatingFileHandler at 0x785db0>




Alors que d'habitude:

import os
os.path.join
<function join at 0x3f770>




Pourquoi dans le premier cas est-on obligé d'importer explicitement le
sous module et pas dans le second ?


Si tu regardes dans les modules standards Python, tu verras qu'il y a un
*module* os.py, qui exporte explicitement un symbole path. Par contre,
logging est bien un *package* et - à moins qu'ils n'automatisent des
choses via le __init__.py, il faut explicitement importer les sous-
modules.



D'accord, je comprends. Y a-t-il alors une imprécision au début de
http://docs.python.org/lib/module-logging.html ? Je cite :

"""
14.5 logging -- Logging facility for Python

New in version 2.3. This module defines functions and classes which
implement a flexible error logging system for applications.
"""

Plus loin dans cette page, logging est effectivement décrit comme étant
un package.





Avatar
Laurent Pointal
Le Mon, 16 Jun 2008 10:07:48 +0100, Alex Marandon a écrit :

Laurent Pointal wrote:
Le Fri, 13 Jun 2008 16:09:38 +0100, Alex Marandon a écrit :
>>> import logging
>>> logging.handlers.RotatingFileHandler
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'handlers'
>>> import logging.handlers
>>> logging.handlers.RotatingFileHandler
<class logging.handlers.RotatingFileHandler at 0x785db0>

Alors que d'habitude:

>>> import os
>>> os.path.join
<function join at 0x3f770>

Pourquoi dans le premier cas est-on obligé d'importer explicitement le
sous module et pas dans le second ?



Si tu regardes dans les modules standards Python, tu verras qu'il y a
un *module* os.py, qui exporte explicitement un symbole path. Par
contre, logging est bien un *package* et - à moins qu'ils
n'automatisent des choses via le __init__.py, il faut explicitement
importer les sous- modules.




D'accord, je comprends. Y a-t-il alors une imprécision au début de
http://docs.python.org/lib/module-logging.html ? Je cite :

"""
14.5 logging -- Logging facility for Python

New in version 2.3. This module defines functions and classes which
implement a flexible error logging system for applications. """

Plus loin dans cette page, logging est effectivement décrit comme étant
un package.




Si dans le __init__.py d'un package, tu défini des noms, ceux-ci sont
alors accessibles directement par un import du package lui-même.




--
Laurent POINTAL -