#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 に既存のものがベースになっているんだと教えてもらいました。
@tk0miya むしろ既存のライブラリがたたき台になってますね。
https://t.co/C0Af64dnYx
— INADA Naoki (@methane) 2013, 11月 30
触ってみた
というわけで、使い物になるのか調べてみました。
以下、Twitter での悲鳴の様子。
"but pathlib is also usable with Python 2.7" これは py26 で使えないフラグか… / pathlib 0.8 : Python Package Index https://t.co/PoNUB6307Z
— Takeshi KOMIYA (@tk0miya) 2013, 12月 1
py2.6 に pathlib 入れてみたけど SyntaxError で死ぬ。set リテラルって py2.7 で backport されたものなのねー。あかんわ。
— Takeshi KOMIYA (@tk0miya) 2013, 12月 1
具体的なメッセージは以下のとおり。
$ 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 だけサポートすることにしたようです。
2.6 はもういいよね、という感じか / pitrou / pathlib / issues / #3 - Port to Python 2 — Bitbucket http://t.co/eWWYJvVpE5
— Takeshi KOMIYA (@tk0miya) 2013, 12月 1
まとめ
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 が大人気。
path / 'subdir' で join してくれる。pathlib こわい #pyfes
— Takeshi KOMIYA (@tk0miya) 2013, 11月 30
スラッシュでjoin w #pyfes
— 金子亮佑 (@yamaneko1212) 2013, 11月 30
「/」キモい… #pyfes
— akihiro takizawa (@turky) 2013, 11月 30
path / "target" で join は python らしくない。 #pyfes
— Kenji YANO (@yanolab) 2013, 11月 30
/ で join w #pyfes
— ɐʇɥoɐ (@aohta) 2013, 11月 30
newpath = path / 'target' ←これ提案したやつセンスなさすぎだろ #pyfes
— Yoshifumi YAMAGUCHI (@ymotongpoo) 2013, 11月 30