python触り初めて嫌に感じたところ
私はほとんど vimscript しか触ってこなかったのだけど、最近必要に応じて他の言語にも手を出すようになった。
それでちょっと触り初めて気持ち悪く感じたところ。
なんかあったら追記する。
三項演算子が汚いこと
三項演算子を使うと行を減らせるし、うまく使えば論理が理解しやすくなる。(下手くそな使い方をすると暗号になってしまうが)
vimscriptでは特に代入時に三項演算子を多用していた。そうすれば最終的にやりたいことは代入であるということをはじめに示せる。
それで一般的な三項演算子は先に条件を書いて、?
と:
で結果を区切る。ところがpythonの三項演算子はなんと先にTrueの値を書いてその後にif
で条件を書き、else
の後にFalse時の値を書く。
一般的な三項演算子
条件 ? True時の値 : False時の値
True時の値 if 条件 else False時の値
前から読み下す場合、True時の値を先に見てこの値だと認識したところでif
が来た時点でその認識を修正しなければいけない思考の流れが不自然だし、三項演算子を連結させると更に理解しにくくなる。
一般的な三項演算子の連結
条件1 ? 値1 : 条件2 ? 値2 : どちらも満たさないときの値
値1 if 条件1 else 値2 if 条件2 else どちらも満たさないときの値
あと、これは一般的なことだが、式に使うキーワードはなるべく英単語(if
やelse
など)でなく記号にしてほしい。それもできるだけ短いものを。
短い記号が式の構成要素だと値の変数名が明瞭に目に入って認識しやすいが、英単語が式の構成要素だとそうはいかない。
リスト内包記法
Haskellのリスト内包と違って汚く感じるのは無理矢理 for in を使ってるからだよ。三項演算子のところでも行ったけど、まず式の構成要素に英単語をなるべく使わないでほしい。特にいくらでも複雑になり得るものについては。
空のブロックはpassというキーワードを入れねばならないこと
私は冗長な表現を嫌うので、ブロック区切り記号の代わりにインデントを区切りにしたことはとても歓迎していた。
空のブロックにpass
と入れなければいけないと知るまでは。
コードの構造を軽く下書きするときには関数の中身まで書かないってことあるけど、そのカラッポの関数にいちいち全てpassを書けというのか?
そして実際に実装するときにはpassを消して中身を書くって?
冗談じゃない。というか、まずpassとだけ書かれた関数の汚いこと。
せめてpassじゃなくて:
とかならまだ許せたかもしれない。タイプ数一文字だし。まだ見た目に感じる汚さがマシだし。:
はシェルスクリプトでも何もしないコマンドだから論理的統一感があるし。
ifやwhileやdefなど制御構文の末尾に:を付けなければいけないこと
この:
、絶対、冗長だろう。明らかな制御構文なんだからわざわざ末に:
を付けなくても改行したらそこから先は処理ブロックでしょう。わざわざ:
を付けなければいけないのが冗長で嫌だ。そもそも私はC言語やJavaでの、文末尾の;
も毛嫌いしている。本当にせっかく基本の文の区切りが改行で、基本のブロック区切りがインデントなのに、こういうところで冗長な表現を使って台無しにしてるのが勿体ない。
変数名として使うと不都合なワード
pythonは予約後が少ないとされているけれど、変数名に使える単語の自由度がまだ足りない。
例えばグローバルな関数名(len
やstr
やdict
など、またdir
は使えなくはないけれど標準関数名と被る。)を変数名に使うと不都合が生じる。
こういう一般的なワードを使えないのは、変数と関数の区別が曖昧だからだ。これは利点でもあるのだろうけれど、そのせいで中間結果を一時保存する変数名の自由度を著しく下げている。