1. ホーム
  2. python

[解決済み] Pythonモジュールがそのサブモジュールをインポートしないことがあるのはなぜですか?

2023-01-28 18:44:13

質問

今日、奇妙なことに気づいたので、説明してほしい。私は、質問としてこれをフレーズする方法さえ100%確信していなかったので、googleは問題外です。loggingモジュールは、いくつかの奇妙な理由のために、モジュール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'>

なぜこのようなことが起こるのか、どなたか説明していただけませんか?

どのように解決するのですか?

Pythonでは、モジュールはアクセスできるようになる前にインポートされる必要があります。 import logging はloggingモジュールだけをインポートします。それは偶然にも logging はサブモジュールを持つパッケージですが、それらのサブモジュールはまだ自動的にロードされません。ですから、明示的にインポートする必要があります。 logging.handlers を明示的にインポートする必要があります。

なぜ余分なインポートが必要ないように見えるのか不思議に思っている方: パッケージによっては、インポート時にサブモジュールの一部または全部をインポートします -- 単に、それらのインポートを __init__.py ファイル内でインポートを行うだけです。他のケースでは、インポートする他の何かが、そのパッケージの logging.handlers . どのコードがインポートを行うかは重要ではありません。 何か がインポートされる限り、です。 logging.handlers にアクセスする前に、それがそこにあることになります。また、パッケージのように見えるモジュールが実はそうでないこともあります。 osos.path . os はパッケージではなく、(あなたのプラットフォームにとって) 正しい他のモジュールをインポートして path としてアクセスできるようにするだけです。 os.path .