studylog/北の雲

chainer/python/nlp

pythonのインデント

最初に結論を書くと

  • pythonのインデントはスペース4つ
  • タブを使うと色んなデメリットがある
  • スペース4つ打ちが面倒ならエディタの設定でタブキーをスペース4つに置き換える


もうかれこれ4年はpython使っててこれまでインデントについて深く考えた事がありませんでした。
pythonのインデントはスペース4つ」と最初に覚えてからそれを疑いもせずにこれまでやってきたんですが、今日他の人のコードを見てていくつかビックリした点が。pythonのインデントって結構自由なんですね…(あんまりいい意味じゃなくて)。

事の発端はchainerのフォーラムで貼られてたコードを自分も試してみようと思ったらインデントがめちゃくちゃ。ブラウザで見たときは正しいインデントなんだけど自分のエディタでは崩れる。何でだろうと思ったらスペースじゃなくてほとんどタブでインデントされてて、さらにタブとスペースが混在してるところもある。

そこからインデントについて調べてみたのだけれど、

1.インデント幅は1でも2でも7でもいい 何でもいい
2.コード全体で一つのインデント幅に固定されてるわけじゃなく、ブロックごとに統一されてればいい

という事を知ってビックリ。
1についてはまあわかる。でも2はどうなんだろう。

for i in range(0,10):
 print(i)
 if i == 4:
                  print("あいうえお")

こんな変なインデントでも許容されるらしい。確かにエラーが出ない。てっきりコード内で最初に現れたインデント幅をコード全体に適用するみたいな設計になってると思ってた。

3.タブは内部で8文字スペースに置き換えられる
4.タブとスペースの混合インデントはpython3でエラー

という事も今日初めて知った。

3で問題になるのはエディタ側でタブを4文字インデントだと解釈して表示しちゃってる場合は見た目上のインデントが崩れるってこと。
4で問題になるのはpython2で書かれたタブとスペース混合のコードが3で動かないってこと。


pep8というコーディング規約ではスペース4つインデントを推奨しているし、ほとんどのライブラリもそれに従ってるのでタブは使わない方がいいんじゃないかと思います。自分だけで使う分には何だっていいのかもしれないけどタブを使ってる人は絶対どこかしらでスペースが混入して混合インデントになってるはずで、いつかpython3に移行するときに面倒なことになりそうです。

pythonのインデントはスペース4つが基本。
面倒だなあとう人はエディタの設定でタブキーをスペース4つに置き換える。

あと本題と関係は無いけれど、できればprintにも括弧付けて欲しいです。
付けてた方がいつか3系に移行する時に楽だし、何より3系の人がそのコードを気軽に実行できるのでフォーラム等で質問した時に回答がつく確率が高まりそう。