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

渡米生活。(日記)

渡米生活。本家から切り離しました。あまり渡米生活に関係のないプログラムネタや音楽ネタなど。

Pythonのインデント

次から次へと、なんだか新しい道具を使わされるのが大変めまぐるしいんですが、、、

最近、C++のモジュールをPythonで動かすというのが流行ってますね。
(もう最近でもないか)
コンパイルいらずで、インタプリタで動くのが嬉しい、ってことなんでしょうが。
で、例に漏れず、あたらしもの好きなソフトウェアグループに押し切られて、Pythonスクリプトを弄ることになりました。
早々とROOTでCINTを使ってコンパイルフリーな生活を送っていた人種には、CINTでええやん!!!と叫びたくなる毎日です。
(まあ、最近ROOTもpython対応になってきてるみたいだけどさ、、、)

しかし、吠えても仕事はすすまないので、、、、

Pythonの関連Webを漁ってみます。ところが、これがあまり日本語のサイトはないんですねえ……。
いや、別に本家サイトをちゃんと読んでもいいのだが、どうせスクリプトレベルだから、モジュールのロードやら何やら、大体のことは、例題を見れば何をやっているかはわかるし、条件分岐やら何やらも特に目新しいところはないのです。だから、一から全部読むのは時間の無駄。
もっと痒いところに手が届く、困った時のTipsが集めてあるようなサイトがあればいいのになー!

まあ、そんな勝手なことをほざきつつ、例題を漁っていたら、大変こまった事に気づきました。
人様の例題をながめていると、if文のインデントが滅茶苦茶なのです(涙)。
大体、私はC++でもインデントにタブを使うのが大嫌いで、全部スペースで埋める派なのです。なぜかというと、タブは見る環境によって幅が違うから。
12inchのノートパソコンにターミナル窓4枚開いてちまちまと仕事しているときに、8文字幅のタブでインデントされたソースコードなんぞ見た日にはブチ切れます。凄い勢いで改行されて何がなんだか分かりゃしない!!!
いや、8文字幅で、というのは自分が見ている環境によるわけで、まあ設定変えりゃいいと言えばそれまでですが、共通アカウントでリモートマシンに入ったりとか、まあいろいろそうもいかない場面があるわけです。大学のプロジェクトで学生もポスドクも一緒に弄ってるコードなんかだと、みんな自分の環境で奇麗に見えるようにタブだのスペースだの挟むから、もう何を弄ってもガタガタになるし……だから、自分が触るコードは片っ端から勝手にタブをスペースに置き換えて保存しちゃう、ってくらい嫌いなのです。

それでも、まあ、C++ならインデントは単に見栄えの問題ですから、プログラムが発狂することはない、と安心出来る。でも、パイソンというやつは、このインデントが決定的に重要なんですよね……つまり、スコープはインデントによって決まる、という訳で……

で、件のコードを見たときには、大変混乱致しました。下手にインデントしなおそうものなら、別のコードになってしまうかもしれないからです。かといって、このままでは何がなんだか訳がわからん!!!

そもそも、こんなに滅茶苦茶なインデントのコード(誰かの環境ではきれいに見えているんだろうけど)がなんでまともに動いているのか、全くわからなくて、ネットサーフィンの旅に出ました。
ふむ。日本Pythonユーザ会によれば、関数やif文の範囲は「行頭のスペースとタブの数で」決める、と書いてある。
「スペースまたはタブ」ではないところがオソロシイというか、つまり混在OKというわけ?!
でも、この状態のコードを勝手に見える通りインデントしたら、絶対意味が変わるぞ?!

で、ようやく、こちらのサイトの記事でナゾが解けました……

http://omake.accense.com/wiki/PythonIntroIndent

……ああそう。タブの幅は絶対8文字、なのね……(涙)

つまり、Pythonは、タブを8スペースと自動カウントするらしいです……。
ということは、私の大嫌いなタブ幅=8に設定しないと、まともに読めないし、書けない、ということです……
viなら、次のようにセットすればよいとのこと。

set ts=8

なるほど、これで、まともにインデントが揃って見えるようになりました!
でも………狭いターミナルウィンドウの中で、激しくワードラップされている………(涙)
もう、この時点で、My PowerBook 12inchで仕事する気がゼロになりました(断言)。


Pythonオフサイドルール(インデントで関数のスコープを決める)を賞賛する方々に、一言言いたい。
まあ、このルールがコードの見栄えを統一するのに貢献しているというのは認めてもいいです。。
でも、そんなこと言うなら、いっそ

インデントはタブ以外不可

にしてほしかった………(涙)
そうしたら、勝手に自分でタブを好きな幅に設定出来るのに!!!

百歩譲って、(いや1000歩譲って)混在もOKだとしよう。
しかし、何故タブ幅が8文字なのか?!!
4文字でも多いと思ってるのに!!!
8文字なんて、3重スコープ作ったらインデントがターミナルの端までいっちゃうよ!!!

それとも、3重もスコープつくるな、そんなコードは全部モジュールにしろ、という嫌がらせなのか?!

まあ、でも、これを理由に、この手の仕事は仕事場のでかい画面でやるだけにして、もう家のノートではやらないことにします。残業もなしだ! バンザイ!!!

と、踏ん切りがついたところで、はたと疑問が。
……まさか、これがタブ8文字設定の真の理由だったりして………(^^;;)。。。


2008/3/29 追記
最近、ようやくみなさんpythonに馴れて来たのか、良いプログラマーが書いたコードは4文字インデントが多くなりました。
え、、Pythonって、絶対8文字じゃないとダメなんじゃなかったの?! と思い込んでいた私はお馬鹿さん♪で、要はタブさえ使わなければ、何文字インデントだってOKというわけです。。
タブがあると、勝手に8文字と解釈されてしまうので。
なので、訂正。

インデントはタブ以外不可

のかわりに、

インデントはスペース以外不可

にしてくれ! (切実)

……なんて思ってたら、
こんなネタがエイプリルフールに上がってたり(苦笑)

まあ、言語レベルで禁止しなくても、紳士協定を作ればいい話か……。。

2014/1/28 追記

ついにタブとインデントの混在禁止になる、とかいう噂をきいたんだが、今みたらネットのどこにもそんな情報ない…(汗)
あれは夢だったのか?!