【備忘録】 __init__.pyの使い方

はじめに

Pythonで、ディレクトリの階層で分けてファイルを管理していますが 今まで、__init__.py ファイルを使っていませんでした...

Pythonチュートリアルを読む(一部抜粋)と

ファイルを含むディレクトリをパッケージとして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()と書かず)とも、ログ出力ができた。

まとめ

自分に対して言うことは、 ドキュメントをサボらずに読め です。