【備忘録】 __init__.pyの使い方
はじめに
Pythonで、ディレクトリの階層で分けてファイルを管理していますが
今まで、__init__.py
ファイルを使っていませんでした...
ファイルを含むディレクトリをパッケージとしてPython に扱わせるには、ファイル __init__.py が必要です。 これにより、 string のようなよくある名前のディレクトリにより、 モジュール検索パスの後の方で見つかる正しいモジュールが意図せず隠蔽されてしまうのを防ぐためです。 最も簡単なケースでは __init__.py はただの空ファイルで構いませんが、 __init__.py ではパッケージのための初期化コードを実行したり、 後述の __all__ 変数を設定してもかまいません。
とのことで、初期化コードを実行と all 変数を設定を試してみたいと
どう試した?
お試しのディレクトリ構成は以下です
├── main.py └── lib ├── __init__.py └── logger.py
お試し版のソースは以下の通りです。
init.py
from .logger import Logger logger: Logger = Logger() __all__ = ["logger"]
logger.py.py
from logging import Formatter, getLevelName, getLogger, StreamHandler class Logger(): def __init__(): self.logger = getLogger() self.logger.setLevel(getLevelName("debug")) handler = StreamHandler() handler_format = Formatter( '%(asctime)s : process(%(process)d) : thread(%(thread)d) : [%(levelname)s] : %(message)s') handler.setFormatter(handler_format) self.logger.addHandler(handler) def debug(self, msg: str): self.logger.debug(msg) def info(self, msg: str): self.logger.info(msg) def warning(self, msg: str): self.logger.warning(msg) def error(self, msg: str): self.logger.error(msg) def critical(self, msg: str): self.logger.critical(msg)
main.py
from lib import logger logger.info("hello world")
実行結果
$ python main.py 2022-05-27 20:16:51,917 : process(56990) : thread(4490100224) : [INFO] : hello world
main.pyで、Loggerのインスタンス生成せず(logger = Logger()
と書かず)とも、ログ出力ができた。
まとめ
自分に対して言うことは、 ドキュメントをサボらずに読め
です。