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 --versionPython 3.13以前でPath.infoを参照してAttributeErrorになる場合は、キャッシュが古いのではなく、そのバージョンにAPIがありません。複数のPythonが入っている環境では、エディターや仮想環境が実際に使っている版も確認します。
Path.infoが古く見える理由
Python 3.14のpathlib公式資料では、Path.infoが返すPathInfoのメソッドは結果をキャッシュすると説明されています。また、Path.iterdir()から得たPathは、親ディレクトリの走査で得た種類情報を使って初期化されることがあります。p.infoという属性を見るだけでは、追加のファイルシステム問い合わせは行われません。
この仕組みは、候補をファイル、ディレクトリ、シンボリックリンクなどに振り分ける処理で役立ちます。一方、「数秒たてば更新される」といった固定の有効期限は示されていません。状態変更後の最新確認に同じキャッシュを使い続けないことが重要です。走査由来の情報の細部は環境で異なり得るため、特定OSの観測結果を全環境へ一般化しないでください。
作成と削除を一時フォルダーで再現する
次は説明用の最小例です。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の違いも参考にできます。こちらはコピー先の決め方を扱い、型情報のキャッシュとは別の機能です。


コメント