コンテンツにスキップ

pytilpack.cache

pytilpack.cache

ファイルの最終更新日時に基づいてキャッシュを管理するモジュール。

CacheEntry(mtime, data, loader) dataclass

キャッシュエントリ。

タイムスタンプ、データ、ローダー関数を保持する。

CachedFileLoader(loader=None)

ファイルの最終更新日時に基づいてキャッシュを管理するローダー。

使用例::

# テキストファイルを読み込むローダー
loader = CachedFileLoader[str](lambda p: p.read_text())
# デフォルトローダーでファイルを読み込み
content = loader.load(pathlib.Path("file.txt"))
# カスタムローダーでオーバーライド
uppercase = loader.load(pathlib.Path("file.txt"), lambda p: p.read_text().upper())

デフォルトのローダー関数を設定してインスタンスを初期化。

引数:

名前 タイプ デスクリプション デフォルト
loader Callable[[Path], T] | None

デフォルトのローダー関数。省略可能。

None
ソースコード位置: pytilpack/cache.py
def __init__(self, loader: typing.Callable[[pathlib.Path], T] | None = None) -> None:
    """デフォルトのローダー関数を設定してインスタンスを初期化。

    Args:
        loader: デフォルトのローダー関数。省略可能。
    """
    self._loader = loader
    self._cache: dict[pathlib.Path, CacheEntry[T]] = {}

load(path, loader=None)

キャッシュを利用してファイルを読み込み。

引数:

名前 タイプ デスクリプション デフォルト
path Path

ファイルパス。

必須
loader Callable[[Path], T] | None

ローダー関数。省略時は__init__で指定したローダーを使用。

None

戻り値:

タイプ デスクリプション
T

読み込んだデータ。キャッシュがある場合はキャッシュから返す。

発生:

タイプ デスクリプション
ValueError

ローダー関数が指定されていない場合。

FileNotFoundError

ファイルが存在しない場合。

ソースコード位置: pytilpack/cache.py
def load(
    self,
    path: pathlib.Path,
    loader: typing.Callable[[pathlib.Path], T] | None = None,
) -> T:
    """キャッシュを利用してファイルを読み込み。

    Args:
        path: ファイルパス。
        loader: ローダー関数。省略時は__init__で指定したローダーを使用。

    Returns:
        読み込んだデータ。キャッシュがある場合はキャッシュから返す。

    Raises:
        ValueError: ローダー関数が指定されていない場合。
        FileNotFoundError: ファイルが存在しない場合。
    """
    if not path.exists():
        raise FileNotFoundError(str(path))

    # 現在のファイル情報を取得
    stats = path.stat()
    current_mtime = stats.st_mtime

    # キャッシュが存在し最新かチェック
    if cache_entry := self._cache.get(path):
        if cache_entry.mtime >= current_mtime and (loader is None or loader is cache_entry.loader):
            return cache_entry.data
        # ファイルが更新されたかローダーが変更された場合、キャッシュを無効化
        self.remove(path)

    # 使用するローダーを決定
    effective_loader = loader if loader is not None else self._loader
    if effective_loader is None:
        raise ValueError("ローダー関数が指定されていません")

    # データを読み込みキャッシュに保存
    data = effective_loader(path)
    self._cache[path] = CacheEntry(current_mtime, data, effective_loader)
    return data

clear()

すべてのキャッシュエントリをクリア。

ソースコード位置: pytilpack/cache.py
def clear(self) -> None:
    """すべてのキャッシュエントリをクリア。"""
    self._cache.clear()

remove(path)

指定されたパスのキャッシュを削除。

引数:

名前 タイプ デスクリプション デフォルト
path Path

削除するキャッシュのパス。

必須
ソースコード位置: pytilpack/cache.py
def remove(self, path: pathlib.Path) -> None:
    """指定されたパスのキャッシュを削除。

    Args:
        path: 削除するキャッシュのパス。
    """
    self._cache.pop(path, None)