たのしいアンパック

皆さんこんにちは、鈴木です。

この度、MarketEnterprise Tech Blogが始まりました。
日々の開発ではPythonで行っています。

今回はアンパックの話をしたいと思います。
現在行っている開発で実際に使ってみてよいなと思ったものです。

拡張子を取り出したい

ファイルの拡張子に基づいて何か操作をする、プログラミングをするとよく見かける光景です。
Pythonで実現する場合、標準モジュール os.path を使えば簡単にできます。

簡単ですね。
しかし、os.path.splitext(path_name)[1]はちょっとわかりずらい。
[1]って何?やらos.path.splitextってどの順序で返すんだっけ?などつい忘れてしまいます。
Pythonはドキュメントが充実していますが都度調べるのは面倒。

ここでシーケンス(リストやタプルなど)のアンパックを活用します。
アンパックとは長さ N のシーケンスを N 個の変数へ代入する操作です。
通常の代入と同じようにできます。os.path.splitext(root, ext)のペアが返されるので次のように書くことができます。

os.path.splitext(root, ext)のペアで返される、というのがはっきりとわかります。
どっちが拡張子だっけ?と悩む必要はありません。

拡張子だけが欲しい、後はいらないという場合は変数に_を使って「使わない変数」であることを明記します。

わかりやすいですね!

ディレクトリ名とファイル名を切り出したい

次は絶対パスが与えられた際に末尾のディレクトリ名とファイル名を取得する例を考えます。
常に末尾に所望のものが来ると仮定します。

明らかに怪しいニオイがしますがとりあえずはうまくいきます。

しかし、path_name = "/path/to/to/to/to/the/target/file.txt"だったら?

先ほどの例では「os.path.splitext(root, ext)のペアが返される」と事前に分かっていました。
つまりシーケンスの長さが N=2 でした。この長さが常に定数ならば苦労しませんが悲しいことに定数ではありません。
私もtempfile.TemporaryDirectory()を用いた際に遭遇しました。環境によって一時ディレクトリが作成される場所が微妙に違います。

ここでスター式を使います。変数に*をつけてアンパックするだけで出来ます。

末尾だけ欲しい場合は先ほどと同様に_を使います。

便利ですね!

まとめ

日々の開発で便利だと思った事柄の中からアンパックを実例を交えて紹介しました。
アンパックを活用してわかりやすいコードを書いていきましょう。

参考文献

    Python Cookbook, 3rd edition, by David Beazley and Brian K. Jones (O’Reilly).