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

Menu & Search

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

2019年11月9日

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

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

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

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


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

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


3. 型定義がない

2021年1月24日追記:

私の勘違いがあり、Pythonに型システムはありました。以下、関連の資料を掲載します。

https://docs.python.org/ja/3.9/library/stdtypes.html

https://docs.python.org/ja/3/library/typing.html

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


4. 定数宣言がない

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


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

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

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


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

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


7. 関数内での後付けのglobal宣言

Pythonでは、グローバル変数を取り扱うために、global宣言という仕組みが用意されている。これは、変数宣言時にglobalとつけることでグローバル変数として扱うというものだが、ここまでは理解できる。
しかし、このglobal宣言、なんとglobal宣言で事前に宣言していない変数に対し、globalをつけて再宣言することにより、同一プログラムからなら対象の変数を参照し、意図する処理ができてしまうのだ。これは完全に変数のスコープを破壊しているし、開発のレギュレーション的にこのような使用を禁止しなければ、保守性の低いコードが大量に作られてしまう恐れがある。


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

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環境においての非同期イベント駆動モデルの限界への挑戦であり、非常に分かりやすい。

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

まとめ

Pythonがデータサイエンスや研究などの分野で盛んに使われているのはよく理解しているつもりだが、Pythonの言語仕様が受け入れることができないため、積極的にはPythonを書く気にはなれない(機械学習であるとかデータサイエンスとかそういう分野には多少の興味があるので、学習機会があればPython に取り組むが)。
私が書く機会が最も多いJavascriptも仕様はアレだが、MicrosoftがTypeScriptという素晴らしい強制ギプスを積極的に開発してくれたおかげで、今やJavaScriptコードを作るときには静的型付けのプログラミング環境での開発が可能になり、保守性のあるコードは書きやすくはなっている。そういった事もあってか、良くない仕様のスクリプト言語にはそもそも強制ギプスが必要なのではないか?、というのが最近のスクリプト言語に対する印象だ (もしかしたら、PythonにもTypeScriptのようなものはあるのだろうか?)。

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

Article Tags
mmiyauchi

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

Related article

Redux(react-redux)における適切な配列要素の更新

2021年8月23日…

CloudFlareの『SSL/TLS 暗号化モード(HTTPS通信設定)』を使用したとき、『ERR SSL VERSION OR CIPHER MISMATCH』のエラーでChromeで発生し、接続できない場合の対処

英語の記事は見当たっ…

Dart(Flutter)についての所見

Dart(Flutter)についての所見

第一印象では、クロス…

2 Discussion to this post

  1. 鈴木靖 より:

    私のモヤモヤを整理していただきありがとうございます。
    昔々のBASICから初めて、変数で苦労して、宣言とかスコープが分かりやすくなって安心していたのですが、pythonの流儀でドキドキしています。

    • mmiyauchi より:

      > 鈴木靖さん
      コメントありがとうございます!
      BASICに関しては、学生時代含め接点がなく、なんともコメントがしがたいのですが、Pythonに関する本記事がお役に立てたならば幸いです。

      本記事ではPythonの言語仕様自体についてはあくまで否定的な立場ではありますが、世界的に見た場合、Pythonのシェアは依然大きいです
      (参考: Stack Overflow Developer Survey 2020)。

      Pythonはデータサイエンスの分野に特に強みがある言語ではありますが、海外では、日本でいうところのPHPやRubyの感覚で、Webアプリケーションへの適用事例も多いようです。
      Pythonを学習中とのことですので、記事中にて、Pythonを否定した分のフォローをこちらにてさせて頂きました。Pythonは、市場価値向上につながる良い技術だと思います。

コメントを残す

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

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

Type your search keyword, and press enter to search