Python初心者必見!インデントはスペース何文字がベスト?

Python

Pythonはその独特のインデントによる構文で広く知られています。ブロックごとにインデントレベルを固定することには、コードの可読性を向上させ、プログラマがコードの構造を直感的に理解するのを助けるというメリットがあります。

しかし、初めてPythonを学ぶ人々や他のプログラミング言語からPythonに移行する開発者はしばしば、Pythonのインデントについて「スペースを使うべきか?タブを使うべきか?何文字が正解なのか?」といった疑問を抱くことがあります。この記事では、これらの疑問に答えていきます。

Pythonのインデント:スペース vs タブ

Pythonではインデントにスペースとタブのどちらも使用することができます。ただし、公式のPythonスタイルガイド(PEP 8)ではスペースを使用することが推奨されています。なぜなら、スペースはすべての環境で一貫性が保たれ、読みやすいコードを保証するからです。一方、タブは異なるエディタや環境で異なる幅を持つ可能性があり、それがコードの読みやすさを損なう原因になることがあるからです。

Pythonのインデント:何文字が正解?

Pythonのインデントの幅については、PEP 8ではスペース4つを推奨しています。4つのスペースは視覚的に区切りがはっきりしていて、かつ過度に幅を取らないため、多くのPython開発者にとって最適だと思われます。よほどの理由がない限り、「スペース4つのインデント」を用いるのが最善でしょう。

しかし、Pythonのインタプリタは、ブロックごとにインデント幅が一貫していれば、それが2つのスペースであろうと8つのスペースであろうと受け付けます。とはいえ、なんらかのプロジェクトでPythonを用いるなら、混乱を避けるためにスペースの数は統一しておくべきでしょう。

スペース4つのインデントのサンプルコード

以下に、スペース4つのインデントを使用したPythonのサンプルコードを示します。実行した時刻に応じ、異なる挨拶文を出力するコードです。

from datetime import datetime

def greet(name):
    current_hour = datetime.now().hour
    if 5 <= current_hour < 12:
        greeting = f"おはようございます、{name}さん!"
        additional_message = "素敵な朝をお過ごしください。"
        return greeting + "\n" + additional_message
    elif 12 <= current_hour < 18:
        greeting = f"こんにちは、{name}さん!"
        additional_message = "午後の時間を有効に使いましょう。"
        return greeting + "\n" + additional_message
    elif 18 <= current_hour < 23:
        greeting = f"こんばんは、{name}さん!"
        additional_message = "リラックスして過ごしてくださいね。"
        return greeting + "\n" + additional_message
    else:
        greeting = f"おやすみなさい、{name}さん!"
        additional_message = "良い夢を見てください。"
        return greeting + "\n" + additional_message

person = "華子"
print(greet(person))

このコードでは、関数greet内部のステートメントにスペース4つのインデントが使用されています。また、関数greet内のif・elif・elseに続く各ブロックは、4+4でスペース8つのインデントが使用されています。

なお、前述の通りインデントレベルはブロックごとに一貫していれば動きはするので、以下のように書いても動作はします。

from datetime import datetime

def greet(name):
  current_hour = datetime.now().hour
  if 5 <= current_hour < 12:
   greeting = f"おはようございます、{name}さん!"
   additional_message = "素敵な朝をお過ごしください。"
   return greeting + "\n" + additional_message
  elif 12 <= current_hour < 18:
     greeting = f"こんにちは、{name}さん!"
     additional_message = "午後の時間を有効に使いましょう。"
     return greeting + "\n" + additional_message
  elif 18 <= current_hour < 23:
          greeting = f"こんばんは、{name}さん!"
          additional_message = "リラックスして過ごしてくださいね。"
          return greeting + "\n" + additional_message
  else:
              greeting = f"おやすみなさい、{name}さん!"
              additional_message = "良い夢を見てください。"
              return greeting + "\n" + additional_message

person = "華子"
print(greet(person))

この例では、関数greet内はスペース2つのインデントで、if・elif・else内のインデントはバラバラです。それでも、ブロックごとのインデントレベルは一貫しているので動作します。とはいえ、このような書き方は分かりにくいので、通常は行いません。

各エディタの「自動インデント機能」を使えば簡単

プログラミングに広く用いられているエディタなら、ほとんどが「自動インデント機能」を備えています。拡張子「.py」のファイルを編集している時は、Pythonを編集していると認識され、自動で「スペース4つ」のインデントが挿入されます。こうしたエディタの多くは、以下のような動作をします。

  • 改行時に自動で前の行と同じレベルにインデントされる
  • 行頭でTabを押すとインデントレベルが下がる(スペースを4つ追加される)
  • 行頭でShift+Tabを押すとインデントレベルが上がる(スペースが4つ追加される)

多くのエディタが、キーボードの操作方法やインデントに用いるスペース(もしくはタブ)の数をカスタマイズ可能です。こうしたエディタを使えば、わざわざ自分でスペースを打ち込む手間も無くなり、間違う心配も減ります。以下は、Pythonのコードを自動インデントする機能を備えた代表的なエディタです。

  1. VS Code(Visual Studio Code): Microsoftが開発しているフリーのコードエディタです。Pythonのプラグインをインストールすれば、自動でインデントを整えることができます。また、自動コード補完、デバッグ機能、Gitの統合など、開発に役立つ多くの機能があります。
  2. PyCharm: JetBrainsが開発したPython専用のIDEです。コード補完、リファクタリング、デバッグ、ユニットテストの実行といった機能が充実しています。また、自動でインデントを調整する機能もあります。
  3. Jupyter Notebook: ブラウザ上で動作し、コードとメモ(マークダウン形式)を組み合わせて使える便利なツールです。科学計算やデータ分析、教育目的などでよく使用されます。こちらもPythonのインデントを自動で調整してくれます。
  4. Sublime Text: シンプルでパワフルなテキストエディタで、Pythonのコードエディタとしても人気です。Pythonのインデントの自動調整はもちろん、様々なプラグインをインストールすることで機能を拡張できます。
  5. Atom: GitHubが開発したオープンソースのテキストエディタです。ユーザーのニーズに合わせて拡張できることから非常に人気があります。Pythonのプラグインをインストールすれば、自動インデント機能を利用することが可能です。また、GitとGitHubとの統合が強く、バージョン管理も容易に行えます。

まとめ:Pythonのインデントのベストプラクティス

Pythonのインデントについて最も重要なのは一貫性です。コードベース全体で一貫したインデントスタイルを維持することで、そのコードは読みやすく、理解しやすくなります。特別な理由がなければ、Pythonの公式スタイルガイド(PEP 8)の推奨事項に従って「スペース4つ」で統一するのがお勧めです。多くのエディタは自動インデント機能を持っているので、うまく活用すればインデントが重要なPythonのコードを書くのも苦にならないでしょう。

Python
\シェアお願いします/
LFI

コメント

タイトルとURLをコピーしました