🐍 Python
resolve() / absolute() で絶対パスに変換する
相対パスをカレントディレクトリ基準の絶対パスに変換したいとき、resolve()を使います。単に絶対パス化するだけでなく、..のようなドット記法の正規化やシンボリックリンクの解決まで行うのが特徴です。
p.resolve() # 絶対パス化+..の正規化+シンボリックリンク解決
p.absolute() # 絶対パス化のみ(正規化はしない、非推奨気味)
# カレントディレクトリからの相対パス"."はcwd()と一致する
from pathlib import Path
rel = Path(".")
print(rel.resolve() == Path.cwd())
# True
# ..を含むパスはresolve()で正規化される
from pathlib import Path
weird = Path("some/a/../a") # 実在しなくても構文的に組み立てられる
print(weird)
# some\a\..\a
print(weird.resolve())
# (実行環境の絶対パス)\some\a ← ../aの部分が正規化され、aだけが残る
resolve()の主な効果
- 絶対パス化
- 相対パスをカレントディレクトリ基準の絶対パスに変換する
./..の正規化- パス中のカレントディレクトリ記法・親ディレクトリ記法を解決し、実際の階層に畳み込む
- シンボリックリンクの解決
- 途中にシンボリックリンクがあれば、実体のパスに変換する(Windowsのジャンクション/シンボリックリンクにも一部対応)
💡 AIコードレビュー観点:resolve()はパスが実在しなくても動く
resolve()は文字列としてのパス操作なので、対象のファイルやディレクトリが実際に存在しなくてもエラーにならず、構文的に正規化した絶対パスを返します(シンボリックリンクの解決部分は実在するリンクにのみ働きます)。「パスが存在するかどうか」を確認したいなら、別途exists()を呼ぶ必要があります。AIが生成したコードでresolve()が成功したことを「ファイルが存在する証拠」として扱っていたら、それは誤解です。