Pythonにおけるインデントについて…
スペースは4つなのか、2つなのか
タブなのか、スペースなのか
ハードタブとソフトタブの違いはっきりわかってないぞ
など、Pythonのインデント論争は絶えませんよね。結局どうすれば良いのと思ってる人も多いのではないでしょうか?
はじめまして、長いことPythonを触ってきたかいです。
本日は、Pythonの長きに渡るインデント論争をに終止符を打つべく、記事を作成しました。インデントの正解が自分の中で固まっていない方はぜひ参考にしていただければ幸いです!
この記事はこんな人のために書きました
- Pythonにおいてインデントの持つ意味がわからない
- 適切なスペースの数が分からない
- ハードタブを使うべき、ソフトタブを使うべきか、そもそもその概念が分からない
なお、Pythonの記事については、こちらにまとめています。
Pythonにおけるインデントの意味
まずは、最初にPythonにおいてインデントがどのような意味を持っているのかをしっかりと抑えておきましょう。
Pythonでインデントはブロックである
Pythonにおいてインデントは、ブロックまたはスコープです。と言われてもイメージしずらいですよね。
変数の適応される範囲をその変数のスコープといいましたよね。また、関数の中で定義した変数は他の関数でそのままでは使えませんよね。
スコープの適用される塊をブロックと言ったりしますが、つまりPythonのインデントはこのブロックを表しているのです。Rubyでは明示的にdo – endなどでブロックを囲んだりしますが、Pythonでは全てインデントで管理します。
インデントがずれるとエラーになる
前述したように当然ですが、このインデントがずれるとエラーになります。適切なインデントをつけなかったり、不要なインデントをつけてはいけません。
a = 3 b = 4 print(a, b)
def test(): a = 3 test()
a = 3 b = 4 print(a, b)
上記のような書き方はPythonでは全てエラーになります。
インデントはスペース4つか2つか
インデントが大切なのは分かったけどスペース何個分のインデントが良いの?
という疑問もありますよね。これに関しては、人やプロジェクトによっても違って2つが良いという人もいれば4つが良いという人もいます。
結論4つにしておこう
しかし、初学者の方は特別な理由がない限りインデントはスペース換算で4つ分にしておきましょう。理由は、世界中のPythonのコードで4つのコードが格段に多いからです。
プロジェクトが2つであったり、いや自分は2つがやりやすい!という人はそちらでも問題ありません。
スペースの数が統一されないとエラーになる
ただ、ここで気をつけて欲しいのは一度インデントの数を決めたらそのコードの中では統一するようにしましょう。
def test(): print('say') for i in range(2): print('hello') test()
このように、インデントを2つに統一するのは良いですが、以下のように2つと4つを織り交ぜるとエラーとなります。
def test(): print('say') for i in range(2): print('hello') test()
File "<string>", line 9 for i in range(2): ^ IndentationError: unexpected indent
インデントのタイプ
さて、次はインデントのタイプについてみていきます。インデントはタブで行うこととスペースで行うことができます。
タブ
タブとはtで表される改行の仕方です。タブには以下のようなメリット、デメリットがあります。
【メリット】
- 半角空白を複数で1インデントとすることにより、少ない文字数で表現でき、ファイルサイズが小さくなる
- インデントが正しく構成されているか一目でわかる
- タブキーを叩けば終わる
【デメリット】
- yamlなどではタブによるインデントは認識されない
- タブはすべて「半角スペース8文字」と認識して動くため、意図せずインデントが崩れることがある
- タブは環境に依存することがある
スペース
スペースはみなさん知っての通りのあのスペースです。メリットとデメリットをまとめてみます。
【メリット】
- Gitなどで崩れることがない
- 環境依存などない
【デメリット】
- スペースを連打する必要がある
- タブよりデータ量が多い
スペースはこのようになっていますね。ちなみに、世界的に多いのはスペース派のようです。
正直どちらでも良いですが、絶対に混在しないようにしましょう。
タブのタイプ
タブとスペースの違いは分かっていただけたと思うのですが、実はエディタの設定などによってタブはタブでもハードタブとソフトタブというものがあります。
ハードタブ
ハードタブとは、イメージしているタブそのものでtによるタブなのですが、後述するソフトタブという概念があるため、対照的にハードタブと名付けられました。一般的なタブと思っていただければ問題ありません。
ソフトタブ
ソフトタブとは、任意のスペース数を使ってタブを表現します。スペースを使ったインデントをタブと呼ぶのは違和感のある人もいるかもしれませんが、tabキーを押すことで”t”ではなく、スペースの塊を挿入でき、それをインデントとします。
ちなみに筆者はソフトタブをよく用いています。
注意点
ソフトタブとは、スペースの塊であるため、先述したとおりソフトタブとハードタブを混在したコードというのも許されません。以下のコードをみてください。
def test(): print('say') for i in range(2): print('hello') test()
一見普通に動作しそうですよね。しかし実行できません。
File "test.py", line 4 print('hello') ^ TabError: inconsistent use of tabs and spaces in indentation
以下の画像をみてください。
このように、スペースとタブ、つまりソフトタブとハードタブが混在しているのが分かりますね。エディタでソフトタブとハードタブの切り替えが可能ですが、これをしっかり理解しておかないと、ネットからコピペしたコードに自分のコードを書き足したら実行できなくなったという現象がおき初心者の方ははまりがちなポイントとなっています。
そのため、自分が何気なしに行なっているインデントも
- タブなのか
- スペースなのか
- tabキーを叩いているからと言ってハードタブなのか
- ソフトタブなのか
などをしっかり理解しておくことが大切です。
まとめ
いかがでしたでしょうか?
Pythonにおけるインデントの意味ということから、タブとスペースの違い、ハードタブとソフトタブの違いという所を解説していきました。ここらへんは、言葉の定義も間違えやすく、誤解して認識しがちですのでしっかりと理解して自分なりのスタイルを作っていきましょう!
それでは!!