2013.06.06
Pythonでのパス操作をオブジェクト指向っぽくする「path.py」
Python Package Index - path.py
https://pypi.python.org/pypi/path.py/

GitHub - jaraco / path.py
https://github.com/jaraco/path.py

「path.py」は、Pythonでのパス操作をオブジェクト指向っぽくするもの。

パスを文字列でなく、pathオブジェクトとして扱う。標準ライブラリの「os.path」などの操作は、pathオブジェクトのメソッドとして呼び出せるようになっている。

以下のような使用例が出ている。

from path import path
d = path('/home/guido/bin')
for f in d.files('*.py'):
    f.chmod(0755)

Pythonの標準ライブラリを使うなら、os.listdir()やos.chmod()などを使って、それにパスを文字列で渡す、というのが普通だ。

path.pyを使うと、こうしたさまざまな標準ライブラリをいちいちimportしたりする必要がなく、すべてpathオブジェクトのメソッドとして操作可能になっているようだ。

上の例では、dというpathオブジェクトを作り、それに対してforループのところで、files()というメソッドを呼び出している。その返り値がpathオブジェクトのリスト(みたいなもの)なので、forループ内でのfがまたpathオブジェクトであり、それに対してchmod()メソッドを呼ぶ、というふうになっている。

パスをひたすら文字列として渡していく標準ライブラリよりも、こちらのほうがオブジェクト指向的で、APIの設計としてはきれいかもしれない。pathオブジェクトに対する操作から別のpathオブジェクトができるという方式は、ちょっとjQueryっぽいかも。

リファクタリング的にいえば、これはまさに「Primitive Obsession(基本データ型への執着)」を克服するリファクタリングだ、と言えるかもしれない。パスを文字列という基本データ型のままで扱うのではなく、pathという専用クラスをつくって、そのインスタンスとして扱っているわけだ。


関連エントリ:
「Primitive Obsession(基本データ型への執着)」を克服するリファクタリング
http://mojix.org/2013/05/17/primitive-obsession