自分のプログラミングスキルは、C/C++をかなりの年月仕事で使っており、C#はこの半年趣味で使っていた。それを踏まえて1か月ほどPythonを使った感想などを書いておく。
コーディングの環境(エディタ関連)
今回、Visual Studio CommunityとVSCodeの両方でプログラミングを試してみた。
コーディングで感じたのは以下の点。
インテリセンスがあまり活用できなかった。
直近半年はC#を使っていたこともあり、Visual Studio Communityでのインテリセンス環境にどっぷりと慣れてしまっていた。そのためか、Pythonでクラスメソッドのヒントが出てこないのがなんとももどかしく感じた。
これはPythonだからなのか、それともインタープリタ言語だからなのか、不明。
コードのエラー解析がちょっと物足りない
文法エラー以外のエラー、例えば、メソッド名間違いなど、実行時にしか判断ができないケースが多かった。
そのためメソッド名など、最後まで正しく入力しなければならず、とても面倒に感じた。
例えば、stringのsplitをSplitと先頭を大文字で記述しまったとき、その行が実行されるまでエラーかどうか判断ができなかった。
ちなみ大文字を使ってしまったのは、C#での実装になれてしまったから。後でPythonのコーディング基準を見て、メソッド名には大文字は使わないということが分かった。
インデントマーカーが表示されない
Visual Studio Communityだけかもしれないが、インデントのマーカーがPythonのみ表示されなかった。
Pythonは字下げでコードブロックがどこかを判断するため、このマーカーがないとブロックの区切りなどが分かりづらく、実装しづらかった。
上の図は、左から順番にPython、HTML、C#。Pythonのみインデントラインが出ていない。
一応、設定を見たのだが、それらしい設定箇所はON(表示する)になっていたのだが。
ドキュメント類(リファレンスマニュアル)
日本語ドキュメントを見ているが分かりづらかった。
分かりづらいと判断したのは、メソッド一覧みたいなものがないためだと思われる。
目的の機能を探すのに、大体メソッド名を基準にしているのだが、そのメソッドの一覧がないので、お目当てのものを見つけるため、ドキュメント内を上から順にすべて追っていく必要があった。
MSDNとかだと、メソッドの一覧があるため、メソッド名から機能をある程度あたりをつけ調べられるのだが。ただ、クラス(モジュール)に関しては、箇条書きでとりあえず一覧見たいのがあるので、見やすいのだが。
このドキュメント形式も、慣れればわかりやすいのか。
実際の実装関連
エントリポイントについて
スクリプト系言語で最初に思うのが、デフォルトのエントリポイントがないこと。
これがないため、どこから実行されるのだろうか、という漠然とした気持ち悪さを感じてしまう。
これはPythonだけではなく、以前使っていたPowerShellでも同様に感じていた。
指定されたファイルを上から順に読み込み、解釈し、処理をしているだけなので、関数定義以外直接実行されてしまうのは言語仕様なのだと思うのだが。
まあ、疑似的にエントリポイントを作成し、ファイルの最後にそのエントリポイントを呼び出すようにするというようにルール付けをしておけばいいのかもしれないが。
その後、いろいろ見てみたところ、エントリポイントに近い使われ方をしていたのが、__name__とそれに設定されていた__main__というもの。
ドキュメントはここ。
この変数を判断し、どこで実行、もしくは呼び出されているのかを判断するらしい。
クラス定義
publicやprivateなどのアクセス制限を行うものがなく、基本的にすべてpublicになるところ。またクラスメソッド内で、自分自身をアクセスするために、メソッド引数1番目の変数を使うところ。
class Hoge:
def hoge(self):
self.data
上記の例ではselfという名称を使っていたが、これは基本的にどんな名称でも認識はされる。とりあえずメソッドの第1引数というところが肝らしい。
クラスインスタンス.メソッド名()
上記のような呼び出しをした場合、内部では第1引数に、インタンスが入ることで、メソッド呼び出しを実現している。
他の言語から来た場合、メソッドの定義に自分自身を入れるか?という考えがよぎる。
この部分について、ちょっと調べてみたところ、Python設計者に持論があるそうだ。日本語でまとめたものがここにあった。
過去幾度となくself論争が起こったようなのだが、毎回説得されているらしい。まあこの考え方に従うしか無いのだろう。C++やC#にはインスタンス自身を呼び出す場合には、thisをつけるので、selfという名称をthisに置き換えてやれば、納得いくコーディングになるのかな。
名前空間みたいなもの
C++/C#の様に、ファイル中のコードで名前空間を指定するのではなく、ファイル名・フォルダ名を使って名前空間のようなものを実現しているところ。
わかりやすいのかもしれないが、最初、以下のような間違いをしてしまった。
Adventurer3/Controller.pyにControllerというクラスを作成した。それをメイン側で呼び出した。
import Adventurer3
def app()
adv3 = Adventurer3.Controller()
そうすると、「Adventurer3.Controller is not callable」というエラーが出た。
C++/C#の頭があったため、Adventurer3が第1段階目の名前空間で、その下にあるクラスだから、Adventurer3.Controller()でいいのではないかと考え上記のようなコードにした。
実際には、Adventurer3(パッケージ)の下にあるController.py(モジュール)に定義してあるControllerクラスという位置づけになるため、以下のようなコードが正しいかった。
import Adventurer3.Controller
def app()
adv3 = Adventurer3.Controller.Controller()
C++/C#では、基本的に1ファイル、1クラスという考え方でコードを実装してきたため、モジュール名とクラス名を同じにしていた。
Pythonでは、命名規則やファイルのまとめ方を考えないと、名前の深さが深くなってしまうかもしれない。この部分については、ほかの実装も見て、良いものを見つけていくしかないかもしれない。
コメント