普段思ったことや、雑記。

Menu & Search

Pythonが好きではないいくつかの理由

2019年11月9日

Pythonコードを書かない人間がPythonコードを長時間読んでみて、Pythonの言語仕様に関して思ったことがあるので、感想を書いておく。インターネット上にあまりPythonを批判している記事がなかったので、書いてみた。なお、これを書いた人間はTypeScriptを好んで使うような人間である。

Python が好きではない7つの理由

1. ソースコードのブロックの終わりをインデントで表現することが、行数が多いソースコードでは視認性が低い

インデントによるコードブロックの表現は、制御構造が多重化している箇所なんかは特に読みづらい。あと、人によっては適切に改行を入れずに記述されると、さらに視認性が低下する。
インデントだけで判断するのは、関数やメソッドが肥大化しているケースにはいかんせん目がつらすぎる(インデントを目立たせるようにエディタで補助する必要あるように思える)。エディタにて表示上の補助をあまり使わない前提で考えると、Cスタイルの中括弧でコードブロックを表現するほうが環境に左右されないし、視認性が高いように思える。


2. 厳密な変数宣言がなく代入演算で変数を宣言する

変数の初期化のために、varとかintとかそういうものはPythonにはない。変数宣言は突如として代入演算から始まるので、処理の文脈が、初期化なのか初期化後の代入演算なのか行頭で即座に判断できない。


3. 型定義がない

これは、前述の変数宣言の仕様と相まって凶悪である。突然、型がよく分からない変数に代入を開始するので、該当行の最後まで読んでみないと処理内容が完全には分からない。


4. 定数宣言がない

たぶん、変数宣言周りだと、他の言語圏の人間からするとこれが最もインパクトが強いのではなかろうか。2や3の延長上で、変数宣言の記法はPythonにはないので、再代入禁止の変数の概念はPythonには存在しない。よって、例えば定数のように扱う変数はすべて大文字表記にするとか、プログラマはあくまで変数の見た目で判断するしかない。つらすぎる。


5.クラスのスコープに関わる定義がメソッド名の宣言に内包されている

Pythonにおけるプライベートメソッドは「__」(アンダーバー2回) と接頭詞につけてメソッドを宣言する。まあ、分かるのだが、クラスのメソッドの宣言をざっと読むときに「private」とか「public」とか書いてあったほうが、プログラムの構造の把握が早い気がする。この点については、慣れの可能性がある。

別な側面からこのプライベートメソッドの記法の弊害を考える。ソースコードを書くシーンを想定すると、メソッド名にスコープが内包されているということは、プライベートメソッドを呼ぶときも都度「__」を書かないといけないということだ。別にメソッドを呼ぶ場合は、わざわざスコープまで入れなくても良いと思うので、宣言時以外にプライベートメソッドが実際にコールされる使用のシーンまで想定すると、このような仕様は冗長な仕様に思える。


6. クラスのselfによる参照の仕様が冗長

Pythonのクラスでは、クラスのメソッド内でメンバ変数やメソッドを参照するには、selfを対象メソッドの第一引数に記述しなければならない。良い点があるとすれば、selfがなければクラス内のメンバーを参照していないということが宣言部で分かるくらいだが、実際のところクラスで実装し始めている時点で各メソッドでメンバーを参照する機会が圧倒的に多いと思われる。クラス実装時の実際の開発シーンを考えると、メンバーを参照するためにはメソッドに何かを書かないとならないことは、冗長な表現以外でしかない。


7. 言語の設計思想が課題解決ではない

Python公式を見ると、Pythonはどこでも動いて、親しみやすく、学ぶのが簡単だ、となっている。

Python is powerful… and fast;
plays well with others;
runs everywhere;
is friendly & easy to learn;
is Open.

https://www.python.org/about/

これはプログラム言語に対する個人的な趣向の話だが、プログラミング言語は、何か技術的な課題を解決しようというような思想があるほうが好感が持てる。
例えば、Node.jsでは、コネクション大量接続の問題(C10K問題)を解決するために、WebサーバのNginxなどで実績のあった非同期イベント駆動モデルを、サーバサイドのプログラム言語環境にも適用できないか?と実装されたプログラミング言語である。

Node.js はスケーラブルなネットワークアプリケーションを構築するために設計された非同期型のイベント駆動の JavaScript 環境です。 

https://nodejs.org/ja/about/

Node.jsの目指す方向性は、シングルスレッドのJavascript環境においての非同期イベント駆動モデルの限界への挑戦であり、非常に分かりやすい。

一方で、簡単に学習できるとか、親しみやすいとか、そういったものは主観的なものなので、人の感性による判断軸なので同意できない。
これまでに述べてきた6つのPythonの仕様の点から、Pythonの言語仕様は今の所は自分にとっては全く親しみを感じない。

まとめ

Pythonがデータサイエンスや研究などの分野で盛んに使われているのはよく理解しているつもりだが、いかんせんPythonの言語仕様が受け入れることができないため、積極的にはPythonを書く気にはなれない(機械学習であるとかデータサイエンスとかそういう分野には多少の興味があるので、学習機会があればPython に取り組むが)。
私が書く機会が最も多いJavascriptも仕様はアレだが、MicrosoftがTypeScriptという素晴らしい強制ギプスを積極的に開発してくれたおかげで、今やJavaScriptコードを作るときには静的型付けのプログラミング環境での開発が可能になり、保守性のあるコードは書きやすくはなっている。そういった事もあってか、良くない仕様のスクリプト言語にはそもそも強制ギプスが必要なのではないか?、というのが最近のスクリプト言語に対する印象だ (もしかしたら、PythonにもTypeScriptのようなものはあるのだろうか?)。
Pythonは世界的に特に注目されているプログラミング言語というのは理解しているのだが、言語仕様がもうちょっとなんとかならないのか…と思う。研究分野で使われる場合で、型定義なし、変数宣言が曖昧(いきなり代入演算子から始まる)、プログラム実行時にインタプリタがいちいち型を判断するのに時間かかってどうしようもないでしょう…。

Pythonについてここまで言ってるけども、私はPythonをほとんど書かない人間ということに要注意。環境的にPythonは多く求められるプログラミング言語だと思っていて、ここが良いよ!とかよく知っている方がいればぜひコメントをください。Pythonを学習するモチベーションにつながります。

Article Tags
mmiyauchi

プログラムを書きながらTranceを聴くのが良いですね。みなさんも聴いたほうがいいですよ、Trance。EDMよりハードトランスでしょ。

Related article

C言語でscanfの直後のfgetsが動かない場合の対応

C言語をちゃんとやろ…

C言語のmain関数の引数(コマンドライン引数)についてなんとなく面白いと思ってしまった

2019年5月3日 …

Vueの製品レベルの環境構築を時短でおこなうチュートリアル

Vueの製品レベルの環境構築を時短でおこなうチュートリアル

2019年9月16日…

Discussion about this post

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Type your search keyword, and press enter to search
%d人のブロガーが「いいね」をつけました。