テクノロジー · 実用ガイド

Pathlib が隠しファイルを拾う?結果を捨てず、walk を枝刈りする

結果フィルターは Python がディレクトリへ入った後です。hidden の定義を決め、top-down で枝刈りし、訪問しなかった木を記録します。

Original diagram comparing a pathlib result filter that still enters a hidden subtree with top-down pruning that prevents descent.
オリジナルイラスト:post-filter と top-down prune の違い。 Watch at Ease

Pathlib では先頭ドットは自動除外ではなく、glob は dot name を一致させます。一方 glob.glob には include_hidden があります。rglob の結果を後から捨てても、その directory と子孫への走査は既に行われています。

POSIX の dot prefix、Windows hidden attribute、application cache のどれを hidden とするか先に決めます。top-down walk で dirnames から除外 directory を消し、file は別に判定し、visited・skipped・symlink・error の ledger を残します。

hidden policy を先に書く

root、platform、Python version、目的を記録し、dot、Windows attribute、build/vendor などの application exclusion を別々に定義します。

platform metadata を確認しない一文字テストを cross-platform と呼ばないでください。

descent 前に directory を枝刈りする

Python 3.12+ では root.walk(top_down=True) を使い、許可する child name だけを dirnames[:] に戻します。除外された subtree には入りません。

旧版は os.walk(topdown=True) で同じ操作をします。変数の再代入ではなく list の in-place 更新が必要です。

file filter と glob 差分を分ける

directory を枝刈りした後、file name を同じ policy で判定し、.DS_Store などの leaf を除外します。

glob.glob を使うなら include_hidden を明記します。** の recursion は大規模 tree で高コストです。

Windows 属性と symlink を明示する

Windows では directory と file の FILE_ATTRIBUTE_HIDDEN を supported metadata API で調べます。dot convention とは別物です。

directory symlink は既定で追わず、必要なら stable identity を記録して重複を拒否します。

acceptance manifest を作る

on_error で path、operation、exception を残し、permission error を failure、incomplete、allowed skip のどれにするか決めます。

manifest に root、policy version、visited count、yielded count、skip reason、symlink policy、error を含め、小さな fixture で regression test します。

Original decision diagram separating dot-prefixed names, Windows hidden attributes, and application-specific exclusions.
オリジナルイラスト:dot、Windows attribute、application rule を分離。 Watch at Ease