为什么Python模块有时不会导入他们的子模块?

chr*_*ley 76 python python-import

我注意到今天我想解释一些奇怪的东西.我不是100%肯定如何将这个问题作为一个问题,所以谷歌是不可能的.由于某些奇怪的原因,日志记录模块无法访问模块logging.handlers.如果你不相信我,请亲自尝试一下:

>>> 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'>
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么会这样?

Tho*_*ers 101

在Python中,模块需要在可访问之前导入.import logging只导入日志记录模块.碰巧这logging是一个包含子模块的包,但这些子模块仍然没有自动加载.因此,您需要先显式导入,logging.handlers然后才能访问它.

如果你想知道为什么它看起来有时你不需要那些额外的导入:一些包在导入时导入它们的部分或全部子模块 - 只需在它们的__init__.py文件中进行那些导入.在其他情况下,它可能是您导入的其他内容,也是导入的logging.handlers.导入哪一段代码无关紧要; 只要您的进程中的某些内容在您logging.handlers访问之前导入,它就会存在.有时,看起来像包的模块真的不是一个,就像osos.path.os它不是一个软件包,它只是导入正确的其他模块(适用于您的平台)并调用它path,只是为了您可以访问它os.path.