いや、もうね、昔からずっと思ってるんだけどね、言いたかった。Pythonが好かん。
Pythonのここがいい
Pythonが好かんとか言いながら、相変わらずPython使ってるのには、やはりPythonにはPythonのメリットがあるからだ。
それは1にライブラリの多さ、2に手軽さ、3に(Clojureに比べて)起動が高速。(いや、まぁ、Clojureが遅すぎるだけだけど。)
大した処理をしないスクリプトならGaucheやBash、AWKで済むけど、やっぱライブラリが使いたいとかなると、手軽さと起動の速さとLinuxで準備しなくても使えるという点から、基本的にはPerlかPythonになってしまう。
今更もうPerl5とかあれだ(もう10年使ってないよ)。
数値解析したいとなるとPython以外の選択肢を教えて欲しい。
結局Python一択だ。
Pythonのここが嫌い
filter、mapが致命的に糞
Clojureで以下の様に書けるmapやらflattenやfilterの連打をPythonで気持ちよく書けない。しかも、map(lambda x:x+1,array)とか読みにくい。内包表記なんてもっと読みにくい。Pandasが必要ない様な場面でも常にPandasを使えとでも言うのだろうか?
言語的に糞とよく言われるJava以下だ。JavaのStreamは気持ちいいと思う。
(->> some-data (map #(% :value)) (flatten) (filter #(= (bit-and % 1) 0)) (map #(* % 10)) (take 10))
統一感がない
いつも思うのだが、どうもPythonは言語全体として統一感がない。
その一番の理由が組み込み関数だ。strだとか、lenだとか、皆は使っていて疑問に思わないのだろうか。なぜ関数とメソッドが言語レベルでチャンポンになっているのだ。
いや、まだ関数とメソッドならまだしも、更にin、and等の様に演算子までチャンポン。
いつも毎日Pythonを触ってるというのなら、覚えてしまって気にならないのかも知れない。だが、使うのが月に1回ぐらいだと、何が組み込みで何が関数なのかとか、そんなものを記憶しろというのが無理だ。IQ10あるかないかの低性能な私の脳には、記憶力なんて高等な機能は備わっていないのだ。
一方で、Clojureを見よ。全部関数かマクロだ。悩むことがない。何か処理がしたければ、とりあえず補完を表示して、とりあえず何かそれっぽい単語で絞れば良いのだ。
だいたい、lenだとかstrだとかその中途半端なatoi的な省略も気に入らない。length、stringとしてくれ。え?Clojureのstr?Clojureは良いんですよ(´・∀・`)ダブスタ
変数のスコープも意味が分からない。同じスコープ内にいるつもりなのに、変数が見える書き方と、見えない書き方がある。この間ハマった。グローバル変数は読めるのに書けない。でも、グローバル変数としてアクセスしていなければ、ローカル変数として書き込める。すなわち、文法が実行状態依存だ。意味が分からない。書けないなら読めないべきだし、読めるなら書けるべきだ。どう考えても統一性がない。変数宣言の構文がないのが最大の癌なのだろう。
もう一つ、無名関数の統一感の無さもヤバいと思う。
def method(arg1,arg2): pass reduce(lambda arg1,arg2: arg1+arg2; , list)
この構文を考えた奴は何故()のありなしを変更したのか。実に読みにくいと思う。どっちかに統一してほしい。
オブジェクト指向が邪魔
私はオブジェクト指向が大好きだ。JavaやC++を愛している。TypeScriptも好きだ。C#とScalaは残念ながらあまり使う機会が無かった。
何にせよ、オブジェクト指向自体は全く批判する気が無い。
だが思うのだ。オブジェクト指向のメリットはカプセル化やポリモーフィズムなどなど、色々あるが、最大のメリットって、やっぱ補完だと。
予めキッチリかっちりインターフェースでメソッド宣言しておき、実際に実装する時のメソッドの使い方や何があったかなんかは、補完で出せば良いのだ。
すなわち、型がエディタにとってわかりやすいからこそ、オブジェクト指向は素晴らしいのだ。
翻って、Pythonはどうだろう。私はjediを使っているが、エディタの補完がしょぼい。しかも何か動作がもっさりする。何の為のオブジェクト指向だ。Type Hints?残念だけどデフォルトでPython3入ってないんだよね。デフォルトで入ってるの2系なんだよね。それも2.6とか。そして、Type Hintを使っても、あるクラスのメソッド定義に、自分のクラスを使うことは出来ない。あほちゃうか?
class A: def hoge(self,a:A): だめ
むろん、Pythonで大型のプログラムを書く人は、オブジェクト指向の型以外のメリットを十分に享受しているのだろう。
だが残念だが、私はスクリプト的にしか使っていない。
なのに、クラスのメソッドと、関数を使い分けさせられる。ついでにwithやらinやら?もう、勘弁してくれ。全部関数にしてくれ。あぁ、Clojureは素晴らしいなぁ。(起動遅い & Javaのメソッド呼ぶ時は補完でわかりにくい)
まとめ
結局の所、私はPythonを使い慣れていない、使う機会が少ないが故に、記憶が出来ないのに、言語に統一感がなく、チャンポンなせいで一々ドキュメントを引くのが面倒くさい、というのがPythonが嫌いな一番の原因だろう。
ちょっとしたことが組み込み関数だったり、演算子だったり、構文だったり、メソッドだったりで分かれているのが非常に面倒くさい。時々ペロッとスクリプト書くなら、手軽さならBashやGauche、処理に時間がかかるなどで、起動コストを気にしなくて良いならClojureが一番だと思う。
が、やはりそこそこの速度とライブラリの充実さでPythonを選ばざるを得ないから、時々こうやってストレスが溜まるのだ。