やりたいこと
だいたいどんなプログラミング言語でも配列(or リスト)をmapしてfilterして結果をprintしたい、なんてケースがよくあるものですが、
前から順番に処理を書いていきたいのに関数の入れ子を書くためにはカーソル位置を前後させながら処理を繋げていけない。
これがめんどい。
例:
print(list(filter(lambda x: x>0, map(lambda x: x * 2, [0, 1, 2, 3]))))
というわけでメソッドチェーンで書きたい。
ライブラリを使う方法
そう思う人はいっぱいいて、ライブラリは探すと色々出てきます。
Pipe
from pipe importmap, filterprint(list([0, 1, 2, 3] | map(lambda x: x*2) | filter(lambda x: x>0)))
決められたfunctionしかpipeの次に渡せなく、to_list的なものが見当たらなくて最後全体をlistとprintで囲わないといけないのが微妙。
PyFunctional
https://github.com/EntilZha/PyFunctional
from functional import seq print(seq([0,1,2,3]).map(lambda x: x * 2).filter(lambda x: x>0))
最後printで囲わないとダメそう。
Alt Pythonを使う方法
Coconut
CoconutというAlt Python(?)の言語があります。
Pythonにコンパイルされる言語で、Pythonのsupersetです。
ブラウザで実行できるものもあるんですが、何故か文法あってるはずなのにparse errorになるときがあるのでローカル実行か後述のGoogle Colabで実行したほうが良いかも知れません。
Coconutを使って書いた版
%%coconut [0, 1, 2, 3] |> map$(.*2) |> filter$(. > 0) |> list |> print
前から順にかけて良い感じ。
Coconutを使う場合の問題点
Coconut使うと上記のように書けてスッキリするんですが問題点が。
LSPが文法チェックしかしてくれなくて、Pythonのようなコード補完機能がありません。
(issueは上がってますがやはり補完機能実装は大変なのでなかなか実現しそうにない)
なのでPythonとCoconutでどちらがサクサク書けるかはケースバイケースかなという感じです(個人の感想)。
また、当然ながら競技プログラミングなどでCoconut使えずにPythonしか使えない場合はあります。
Google ColabでCoconutを使う方法
以前(っていってもだいぶ前)は面倒だったんですが
notebook内で
!pip install coconut[jupyter]
%load_ext coconut
とすると使えます。
github issueで紹介されているnotebookでもOK ↓
https://github.com/evhub/coconut/issues/518
https://colab.research.google.com/drive/1y5PthNvzL869zAxO0QGlLRsu4lC0cwTx
Google ColabでCoconutを使う問題点
Google Colabでは12時間で環境が消されてしまうので、毎度Coconutのインストールをしないといけません。
5分くらいかかります。
ボクはこう思ったッス
良い加減Pythonの言語仕様側で書きやすくするように変更してほしい(望み薄だけど)
余談
GitHub - vindarel/languages-that-compile-to-python: List of languages that compile to python
languages-that-compile-to-python (pythonにコンパイルされる言語) というgithubリポジトリを見つけてしまった。