日記
このところ、ある機材と接続するため、Pythonでシリアル通信用のプログラムを書いているのだけれど、最初こそPythonって変数とか関数の型宣言をしなくていいのが楽でいいなあと思っていたのだけれど、とんでもない話だった。
人間の(オイラの?)記憶なんて当てにならないもので、ステップ数が増えていくにしたがって何がどんな変数だったか忘れてどんどんデータの流れが読めなくなっていく。
これがCだったら冒頭の型宣言を見ればある程度思い出すか、どんな変数か推定もできるのだが・・・
加えて、関数も、型宣言がないので、どんな引数を渡せばいいか、どんなデータが返ってくるのか一目ではわからない。
自分で作ったプログラムならまだしも、始めて見るライブラリ関数なんかだと、しっかりリファレンスとかネットなどで情報を確認する必要があるのだけれど、ポピュラーな関数になると、当たり前過ぎるからか、引数で渡すのが数字なのか文字列なのかすらはっきり書いてなかったりして辛い。
それと、今回割と低レベル(ハードに近い)のプログラムなので、バイナリでのデータ送受信が主なのだけれど、Pythonではその表記の仕方も、良く言えば柔軟、悪く言うと書き手次第なところがあって、例えば
[0xff,0xfe,0xfd,0xfc](int型配列)と
b'\xff\xfe\xfd\xfc'(バイト列)は同じような扱いができる。
"\xff\xfe\xfd\xfc"(バイト文字列)でもデータを渡せる。
(厳密には違うが)
上二つはそれほどでもないけれど、下の一つは似て非なるもので、扱いも全然違ってくる。
にも関わらず似たようなデータを渡せてしまうので始末が悪い。
そしてこれらが
x = [0xff,0xfe,0xfd,0xfc] でも
x = b'\xff\xfe\xfd\xfc' でも
x = "\xff\xfe\xfd\xfc" でも
ひとつの変数 x に無条件で、いつでも代入できてしまう。
プログラムの途中で再代入も自由自在。
(Cだったら代入しようとした時点で激しく怒られるけどね)
意図的にプログラムの途中で変数の型を変更するなんてことはまず無いだろうけれど、人間は間違う生き物であるから、b'\xff\xfe,~~~の頭のbを書き忘れたなんてのはあり得る話。
さらに、関数も型宣言がないから、ある意味どんな変数が引数で来てもエラーにはなりにくい。
さらに内部的に、意味をなさないデータはNoneで扱う・みたいな処理がされていたりするとこりゃもう、暖簾に腕押し、糠に釘。
エラーは出ないけどさっぱり動かないね~、というような状況が出来上がる。
まあ、書き手が悪いわけではあるけれど、これで2週間とは言わないが10日ほどは本気で悩んだ。
Pythonは、インタプリタなので気軽に使えるのに、ライブラリも豊富で、複雑で本格的な処理も簡単に書ける。
当然生産効率も高そうだし、低レベルのプログラムでも充分な速度が望めるようだ。
参考図書も多いし利用者も増え、プログラム言語のシェアはNo.1だそうだ。
・・・・・・でもなんか嫌い。(笑)