読者です 読者をやめる 読者になる 読者になる

methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

Pythonは他の言語の慣習の持ち込みを嫌う

Python

拡張引用構文覚えた!

こういう経験があると、たかが「List = list」ごときで何を大げさなと思ってしまうけど、Pythonista的にはこういうのも受け入れられないんだろう。

Pythonistaはtypedefすら拒絶する? (Re: Python での組み込み型をより自然な名前にする) - kなんとかの日記

Pythonは一貫性を重視する言語なので、他の言語の慣習を持ち込んで一貫性を崩すことに対するアレルギー反応が強い。

前にも書いたけど、Pythonのtype名が小文字始まりであることについては、特に技術的な利点とかそういうのがあるわけじゃなくて、単に最初の仕様がそうであって、それがそのまま継続されているっていうだけだよね? (違ってたら教えてください) だから大文字始まりのエイリアスを作るぐらい、そんなに目くじらを立てることとは思えない。それなら「typedef unsigned int uint」のほうがよっぽどマズい。

続: Python での組み込み型をより自然な名前にする - kなんとかの日記

C言語の慣習の中に生きていれば、 uint a,b,c というコードを見ると、 uint が unsigned int の typedef だということを推測できる。 unsigned short よりタイプしやすいっていう大きな利点があるために、typedefが一般的に使われているから。
それに比べて、Pythonの慣習の中で生きていると、 list = List() を見ると困惑する。listの名前をListにすることに意義を見出せる人がいないし、一般的でないから。
「Listってのは標準のlistとは違う特殊なシーケンス型か?いや、でもなぜlistって名前を上書きしてるんだ?ひょっとするとListは型じゃなくて型を返すファクトリで、List()の結果がlistに似たシーケンス型なのか?」って考えて、Listの宣言を確認して、「この人はなんでこんなことをしているんだ?」となる。
その言語の慣習を無視して他の人を混乱させるという意味で、 List = list は、 typdef unsigned short ushort よりも、 #define IF if( に近い。

RubyJava ではクラス名は大文字から始まるので、変数名とバッティングすることはほぼない。素晴らしい。

Python での組み込み型をより自然な名前にする - kなんとかの日記

Javaでもプリミティブ型は小文字で始まるよね。int int なんて出来ない。C#のstringも。Pythonの組み込み型は、こういった存在に近い。

そもそも、 id:kwatch さんはローカル変数名にstrとかlistとか使えないのがよほど気に食わなくて、ビルトイン型をタイプしやすくユーザー定義型と区別しやすい小文字で始めるJava,C#,C++,Python の仕様を「悪い慣習」とまで言ってしまっているが、その感覚があまり一般的でなく、Ruby至上主義の人間が「Rubyの仕様は善!他は悪!」といって他の言語にそれを押し付けているようにしか見えない。

たとえば、strをローカル変数名に使えるようになったとして、strを使うという慣習ができるだろうか?その型の変数が複数あったら、 str, str2, str3 とでもする?ナンセンスだ。その変数に意味のある名前を付けられるなら、その意味をつけたほうが良い。型名から取った変数名をつけるのは、重要じゃない、短いスコープで使われる変数だけだ。
そんいう重要な意味の無いローカル変数名とビルトイン型の名前には、比べ物にならないほどの重要度の差がある。だから、ローカル変数名のためにビルトイン型の名前を変えようなんて意見をPython-dev MLに投げる人はいないし、投げても一瞬で却下されるだろう。

そんだけわかりやすい名前が好きなら、見た目で文字列連結とわからない Array.join を Array.join_as_String とでもエイリアスしたらいい。