Quantcast
Channel: プログラミング
Viewing all articles
Browse latest Browse all 8890

Pythonでメソッドチェーンしたい - なんじゃくにっき

$
0
0

やりたいこと

だいたいどんなプログラミング言語でも配列(or リスト)をmapしてfilterして結果をprintしたい、なんてケースがよくあるものですが、

pythonだと関数の入れ子で書かないといけない。

前から順番に処理を書いていきたいのに関数の入れ子を書くためにはカーソル位置を前後させながら処理を繋げていけない。

これがめんどい。

例:

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 Programming Language

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リポジトリを見つけてしまった。


Viewing all articles
Browse latest Browse all 8890

Latest Images

Trending Articles