Re: Python での組み込み型をより自然な名前にする

ネタなのかツリなのかマジなのかさっぱり判断が付かないんだが、マジだとしたらそんなの勘弁してと思うし、ネタだとしてもはっきりそうだとわからない書き方のせいで影響される人がいたらイヤなので、あえてマジレスしとく。

jijixi's diary - Re: Python での組み込み型をより自然な名前にする - kwatchの日記 , Re: 大量のハッシュデータを簡潔に作成する - kwatchの日記

本人は大マジなんだけど。どうもお気に召さなかったようだ。

ある言語の慣例を無視するような行為はナンセンスとしか言いようがない。

そんなことはないと思うけどなあ。その慣例がよくないものなら、その慣例を無視して別のアイデアを試してみるのが悪いこととは思えない。批判するなら、新しいアイデアにメリットがない、あるいはデメリットが大きいことに対してであり、慣例を無視すること自体は非難されるようなことではない。
今回のケースは、もとの慣例自体があまりいいものじゃないんだから、無視して新しいアイデアを試してみても別にいいんじゃない?『慣例を無視するような行為はナンセンス』なんて、前例を最重要視する公務員みたいな印象を受ける。

特に組み込み型に別名を付けて、そっちをメインで使うなんてコードを読みにくくするだけ。

List を list の alias とするのが、そんなに問題かな。Array = list; Hash = dict; とかしたらさすがに問題だろうけど、list を List にするくらいなら、読みにくくなるとは思えない。

個人的には str だの list だのいう「ほとんど意味の無い」名前はせいぜいそういう「どうでもいい」シチュエーションでしか使わないから、もし str が予約されてたとしても、じゃあ s でいいやぐらいのもんなんだけど、まあそこは置いといて。

「s」はまだいいとしても、「l」や「d」はちょっとね。「l」は「1」や「I」と見分けがつきにくいから、一文字変数名としてはよくない。「S」や「L」や「D」は、定数でもクラス名でもないただのローカル変数を大文字で始めることにけっこうな抵抗があるので、避けることができるなら避けたい。

あと、この文章は「strやlistやdictという変数名を使おうとすること自体がまずい」ということを言いたいんだと思う(違ったらごめんなさい)。けど「S」や「L」や「D」や「lst」や「dct」や「s」や「l」や「d」なんていうわかりにくい変数名はいたるところで使われていて、そんなわかりにくい変数名を使うぐらいなら、素直に「str」や「list」や「dict」をローカル変数名に使えるようにする工夫はあってもおかしくないと思う。

とりあえず Python で、どうしても str とかって変数を使いたいなら以下のように書くべきだと思う。

# cat test.py
str = "foo"
list = [1, 2, 3]
dict = {"one": 1, "two": 2}
print __builtins__.str, __builtins__.list, __builtins__.dict
print __builtins__.str(100)
% python test.py
<type 'str'> <type 'list'> <type 'dict'>
100

__builtins__ を 4 回も書くのがかったるいっていうなら、適当なローカル変数に代入して使えばいい。

えーとですね、「strやlistやdictを変数名として使いたい」というか、「ローカル変数でグローバル変数をshadowingしたくない」というのがあります。__builtins__.strとかするまえに、そもそもstrやlistやdictという名前をbuilt-in typeに使っているのが問題ですよね。

Pythonでstrやlistやdictが小文字ベースになっているのは、たぶんC言語の型名がintやfloatやcharのように小文字ベースになっていることの延長ってなだけで、必ずしも「Listよりlistのほうがいいんだ!」という強い信念のもとにそうなっているわけじゃないと思う。だから「built-in typeの名前をclass名と同じようにCamelCaseにする」という*思いつき*は、それほどおかしなものとは思えない。