このBlogは移転しました。今後は aish.dev を御覧ください。

Python 3.6の概要 (その5 - ファイルシステムパス プロトコル)

ファイルシステムパス プロトコル

pathlib はPython3.4で導入されたが、pathlibで表現されるファイルパスは、 open()os.path.* などの、既存のファイル操作関連関数では使用できないため、あまり便利には使えていなかった。

Python3.6からは、pathlib.Path などのファイルパスをあらわすオブジェクトに特殊メソッド __fspath__() が実装された。ファイル名を引数として受け取る、open() などの関数は、__fspath__()を呼び出して、ファイルパスを取得するように変更された。

>>> import pathlib
>>> spam = pathlib.Path('./spam')
>>> spam.__fspath__()
'spam'
>>> open(spam, 'w')
<_io.TextIOWrapper name='spam' mode='w' encoding='UTF-8'>

また、オブジェクトからファイルパスを取得する関数として、os.fspath()が追加された。os.fspath(path)は、pathが文字列またはバイト列ならそのまま、それ以外ならpath.__fspath__()を呼び出して戻り値とする。

>>> import os, pathlib
>>> os.fspath('.')   # 文字列はそのまま
'.'
>>> os.fspath(pathlib.Path('.')) # __fspath__()メソッドがあれば呼び出す
'.'
>>> os.fspath(1)  # 以外ならエラー
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected str, bytes or os.PathLike object, not int