サードパーティ製パッケージ
前回、Pythonでモジュールを作成してデプロイし、コードから読み込んで利用する方法を紹介した。ここまで進めばサードパーティ製パッケージを利用するための準備はほとんどできたようなものだ。「The Python Tutorial」にサウンドパッケージを作成する場合のサンプルが載っており、これを見るとパッケージのことがよくわかるようになる。
まずは「サードパーティ製パッケージ」というのが何なのかを知っておいたほうがよいだろう。Pythonのサードパーティ製パッケージは「PyPI - the Python Package Index」に多くが登録されている。まずは、このサイトを覗いてみてほしい。
例えばPythonを使っていて、タブ区切りのデータファイルを処理する必要が出てきたとする。自分で処理を書いてもよいのだが、タブ区切りデータというのは結構一般的なデータ形式の1つなので、すでにこのデータを扱うための機能が実装されている可能性が高い。PyPIでタブ区切りデータ(tsv; tab-separated-value data)で検索すると、次のようにいくつもパッケージ(ライブラリ)を見つけることができる。
こうやって自分の欲しいパッケージを探し出せれば、自分で実装する場合と比べて開発時間を短縮することが可能になる。となると、スキルとしてはパッケージの検索やどのパッケージが良いのかを見極める能力が重要になるわけだ。自分で実装するのではなく、すでに実装されているものを探してきて使う。――これは本連載の主旨である”手抜きをする”ための最も基本的な方法でもある。
パッケージとは「モジュールをまとめたもの」
そこで、この便利なパッケージを使うために、まずはパッケージとはどういったものであるかを知っておきたい。答えはシンプルで、パッケージとは「モジュールをまとめたもの」だ。チュートリアルに掲載されている次のディレクトリ構造例を見ると、それがよく理解できる。
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
上記では「sound」というディレクトリがパッケージのトップディレクトリで、そのなかに「formats」「effects」「filters」というサブディレクトリが存在している。サブディレクトリには、モジュールにあたるPythonファイルが置いてある。このディレクトリ構造がそのままimportで指定するパスになっているわけだ。このように、複数のディレクトリを作成して利用できるようにすることで名前空間の切り分けを可能にしており、パッケージ間の名前の衝突を回避しやすくしているのである。
ここで、トップディレクトリの下に「__init__.py」というファイルが用意されている点に注目しておきたい。このファイルが存在していると、Pythonはこのディレクトリがパッケージのトップディレクトリだと認識する。__init__.pyファイルの中身は空でもよく、まずは存在していることが大切だ。
後は、このディレクトリを読み込み対象となるディレクトリにデプロイしておけばよい。この場合、例えばパッケージに含まれているモジュールを個別に読み込んで使用することができる。上記の場合、「echo.py」を利用したいなら、次のようにimportすればよい。
import sound.effects.echo
こんな感じで特定のモジュールを読み込んだ場合、次のようにフルパスを指定してモジュールに記載されている関数を利用する。
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
これを毎回書くのは面倒なので、次のようにimportすればもうちょっと短い名前で利用することができる。
from sound.effects import echo
この場合、次のように先ほどよりも短い記述でアクセスすることができる。
echo.echofilter(input, output, delay=0.7, atten=4)
名前が衝突しないようなら、次のように関数を直接importするような使い方も可能だ。
from sound.effects.echo import echofilter
この場合は直接関数名を指定して記述することができる。かなりスッキリ書けるようになったことがわかる。
echofilter(input, output, delay=0.7, atten=4)
このように、パッケージはモジュールをまとめたものなので、基本的にはモジュールを使うのと同じ要領で利用すればよい。
パッケージを活用しよう
では、パッケージがたくさん存在しているから開発が楽になるかと言うと、ちょっとそれはまた別の話だったりはする。パッケージを利用するというのは、他人が書いたドキュメントまたはソースコードやAPIリストを見て、その人がどのような考え方でそのコードを書き、利用可能な関数がどういった動きをするかを予測する能力というのを求められる。そうしたことが苦手な場合には、パッケージの利用は逆に多大な苦痛を伴うことになると思う。
それならば、ゴリゴリ自前で全部作ってしまえばよいのだが、開発時間的にそれは現実的ではないこともある。ある程度楽をしようとすれば、やはり多くのユーザーが利用していて、バグ修正なども活発に行われているパッケージを利用することを考えたい。うまく行けば、自分の労力をほとんど費やさずに、ほんの数十分のコーディングで目的を達成することができるようになるからだ。
他人のソースコードやドキュメントを読み、中身を予測して飲み込み、すぐに使いこなせるようになること。これは、これからのシステム管理者や開発者に求められるとても大切な能力だ。
・ The Python Tutorial