Python 3.14のPath.infoで変更が見えない理由|キャッシュと最新状態の確認方法

Path.infoのファイル情報カードにキャッシュ表示があり、Path.existsなどの直接確認へ更新矢印が向く説明イラスト

Python 3.14で追加されたPath.infoは、ファイルやディレクトリの種類を効率よく振り分けたい場面向けのAPIです。ただし、同じPathInfoのメソッド結果はキャッシュされます。判定後にファイルを作成・削除しても、同じp.infoを読み直すだけでは以前の結果が返ることがあります。

再利用できる種類情報として扱うならPath.info、その時点の存在や種類を確かめたいならPath.exists()、Path.is_file()、Path.is_dir()、Path.is_symlink()を使います。

目次

まずPythonのバージョンを確認する

Path.infoはPython 3.14以降の機能です。最初に実行環境を確認してください。

python --version

Python 3.13以前でPath.infoを参照してAttributeErrorになる場合は、キャッシュが古いのではなく、そのバージョンにAPIがありません。複数のPythonが入っている環境では、エディターや仮想環境が実際に使っている版も確認します。

Path.infoが古く見える理由

Python 3.14のpathlib公式資料では、Path.infoが返すPathInfoのメソッドは結果をキャッシュすると説明されています。また、Path.iterdir()から得たPathは、親ディレクトリの走査で得た種類情報を使って初期化されることがあります。p.infoという属性を見るだけでは、追加のファイルシステム問い合わせは行われません。

この仕組みは、候補をファイル、ディレクトリ、シンボリックリンクなどに振り分ける処理で役立ちます。一方、「数秒たてば更新される」といった固定の有効期限は示されていません。状態変更後の最新確認に同じキャッシュを使い続けないことが重要です。走査由来の情報の細部は環境で異なり得るため、特定OSの観測結果を全環境へ一般化しないでください。

Pythonの版を確認し、Path.infoを読み、一時領域で状態を変え、直接メソッドで再確認し、用途に応じてAPIを選ぶ5段階の図解
Path.infoの古い結果を切り分け、キャッシュ利用と最新確認を選ぶ流れを示す説明図。 · 図を拡大

作成と削除を一時フォルダーで再現する

次は説明用の最小例です。TemporaryDirectory内だけでファイルを作成・削除するため、既存ファイルには触れません。

from pathlib import Path
from tempfile import TemporaryDirectory

with TemporaryDirectory() as tmp:
    created = Path(tmp) / "created.txt"
    created_info = created.info

    print("before create / info:", created_info.exists())
    created.write_text("hello", encoding="utf-8")
    print("after create / same info:", created_info.exists())
    print("after create / exists:", created.exists())
    print("after create / new info:", Path(created).info.exists())

    deleted = Path(tmp) / "deleted.txt"
    deleted.write_text("hello", encoding="utf-8")
    deleted_info = deleted.info

    print("before delete / info:", deleted_info.is_file())
    deleted.unlink()
    print("after delete / same info:", deleted_info.is_file())
    print("after delete / is_file:", deleted.is_file())
    print("after delete / exists:", deleted.exists())
    print("after delete / new info:", Path(deleted).info.is_file())

この例で確認する差は、作成後も同じcreated_info.exists()がFalseのままなのに、created.exists()と新しいPathのinfoはTrueになることです。削除後は同じdeleted_info.is_file()がTrueのままでも、直接判定と新しいinfoはFalseになります。

キャッシュをリセットするAPIはない

Path.infoのキャッシュを消去する専用APIはありません。空のinfoキャッシュを持つ別のオブジェクトが必要なら、Path(p)で新しいPathを作れます。ただし、処理のたびに最新状態が必要なら、新しいPathを作ってinfoを読むより、目的に合う直接判定を使うのが分かりやすく、公式資料の推奨にも沿います。

用途別の選び方

確認したいこと選ぶ方法考え方
走査した項目を種類別に振り分けるchild.info.is_file()など走査時の情報やキャッシュを再利用する
今、存在するかp.exists()存在を直接確認する
今、ファイル・ディレクトリ・リンクかp.is_file()、p.is_dir()、p.is_symlink()必要な種類を直接確認する
状態変更後にinfoを使い直すPath(p).info空のinfoキャッシュを持つ新しいPathにする
直後の操作を確実に成功させたい実際の操作を行い例外を処理する事前確認だけを成功保証にしない

確認直後に変わる可能性も残る

p.exists()で最新状態を確認しても、その直後に別プロセスが削除・置換する可能性はあります。存在確認がTrueだったことは、その後の読み込み、更新、削除の成功を保証しません。重要な処理では、open()やunlink()など本来の操作を実行し、起き得る例外を適切に扱います。

整理すると、Path.infoは「同じ型情報を再利用するAPI」、直接のPath判定は「その時点を改めて確かめるAPI」です。ファイル変更が反映されないと感じたら、Pythonの版、同じPathInfoを再利用していないか、最新確認に直接判定を使っているかの順に点検すると切り分けやすくなります。

同じPython 3.14のpathlibで、コピー先の指定も確認したい場合は、Path.copyとcopy_intoの違いも参考にできます。こちらはコピー先の決め方を扱い、型情報のキャッシュとは別の機能です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次