このサイトについて

大人 meets プログラミング,Pythonで人生をハックしよう。
8月12日(日),プログラミングとAIのリテラシーをサックリと学ぶ講座を開発します。 (主催:角川アスキー総合研究所)

Pythonのプログラムをワンライナー化するOnelinerizerがいろんな意味ですごい

Pythonのプログラムをワンライナー化するOnelinerizerがいろんな意味ですごい

Pythonのプログラムを構成する要素には大きく分けて「式(Expression)」「文(Statement)」がある。式とは演算式や比較式,オブジェクトのリテラル,関数呼び出しなど。一方,文は,if文,for文や関数定義,クラス定義やモジュール/パッケージのインポート,そして代入,など。式は改行を要求しないので,一行にいくらでも連ねることができるけど,文は改行や,しばしばインデントを伴うブロックを要求する。

Pythonは文と式がきっかり分かれている。そんなわけで,Pythonではプログラムを一行で書くいわゆる「ワンライナー」がつくりにくいと言われている。Pythonでワンライナー作るとき,文をいかにして式に変換するか,というテクニックを駆使することになるんだけど,lambda式を駆使したり名前空間を無理矢理貪ったりするような技巧の数々はたいてい変態的で,だからこそプログラマの魂を揺さぶって一定の人々の興味を常にかき立てるのかも知れない。

ここで紹介するOneliner-izerは,Python2のワンライナーに斜め上から挑戦したツール。スクリプトを食わせると,文法解析して自動的にワンライナー化してくれる。

たとえば,次のようなコード

s = "いっぱい"
print s.replace("い", "お", 1)

次のように変換されます。

(lambda __g, __print: [(__print(s.replace('\xe3\x81\x84', '\xe3\x81\x8a', 1)), None)[1] for __g['s'] in [('\xe3\x81\x84\xe3\x81\xa3\xe3\x81\xb1\xe3\x81\x84')]][0])(globals(), __import__('__builtin__').__dict__['print'])

なんだかすごい。昔書いたこの記事を思い出した。

コードを読んでみると,ast使って変換してるらしい。GitHubのページ見ると「from XX import *とyieldとwithには未対応」ってなっていて,逆に言うとそれ以外には対応してるってことらしくてすごい。なお,yieldとwithはOpen Problemsとなっており,あきらめてないっぷりがすごい。

作者のチェルシーさんはMITの学生さん。PyCon 2016でトークしてて,内容もすごいしっかりしてるし,Pythonの勉強になってすごい。完全なる才能の無駄遣いっぽいけどそれがまたすごい。どうやったらうちの姫様をこんな素敵なお嬢さんを育てることができるのだろうか。

2016-11-09 17:00