#pyfes 2013.11 で教えてもらった pathlib が python2.6 で使えなくて愕然とした話。

タイトルで言い切ってしまった。

昨日は Python Developers Festa 2013.11 に参加してきました。
時間までに発表資料を作るタイムトライアル系のイベントだとずっと勘違いしていたのですが、
今回は話すネタがなかったのでまったり過ごすことができました。

午前中は whipering-gopher を題材にした Go ハンズオンに参加してました。
課題がよく練られていて、テンポよく Go プログラミングをつかむことができたのは非常によいですね。
こうした機会がないと、Go に手を付けることはなかったので講師の @ymotongpoo には感謝しています。

午後はあれやこれやの発表がありましたが、そこは @kashew_nuts さんのエントリがよくまとまっているのでさっくり割愛。

その中で気になったのは、@torufurukawa (39) の python3.4 の発表。
新たに追加された pathlib って python2.x でも使えないかしらー? とツイートしたところ、
@methane に既存のものがベースになっているんだと教えてもらいました。


触ってみた

というわけで、使い物になるのか調べてみました。

以下、Twitter での悲鳴の様子。


具体的なメッセージは以下のとおり。

$ pip install pathlib
Downloading/unpacking pathlib
  Downloading pathlib-0.8.tar.gz
  Running setup.py egg_info for package pathlib
Installing collected packages: pathlib
  Running setup.py install for pathlib
    SyntaxError: ('invalid syntax', ('/Users/tkomiya/work/foo/lib/python2.6/site-packages/pathlib.py', 108, 15, "        {'CON', 'PRN', 'AUX', 'NUL'} |\n"))

Successfully installed pathlib
Cleaning up...

SyntaxError が出ていても successfully installed と言われていますね。あれれ。

明らかにおかしいのですが、一応 import してみます。

$ python
Python 2.6.7 (r267:88850, Oct 11 2012, 20:15:00)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pathlib
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/tkomiya/work/foo/lib/python2.6/site-packages/pathlib.py", line 108
    {'CON', 'PRN', 'AUX', 'NUL'} |
          ^
SyntaxError: invalid syntax

だあああああああああああああああ。

BTS を見てみると 2.7 だけサポートすることにしたようです。


まとめ

python 2.7 ではちゃんと使えたものの、python 2.6 では pathlib は動作しないようです。
現在、僕はツールを書くときのポリシーとして python 2.6/2.7/3.2/3.3 をサポートすることを念頭においているので*1
この pathlib は残念ながら僕には使えないようです。

ターゲットを python 2.7 や 3.x に移行している人は PyPI の pathlib を使うことができるので
入れておくと余計なコードが減って幸せになれるかもしれません。

おまけ

/ join が大人気。






*1:RHEL では 2.7 のパッケージが提供されていないし、Debian では 3.2 がパッケージングされています。僕のツールは "わざわざ Python をビルドしてまで使いたいツール" ではないので、こういうサポートポリシーになるのです。