Pythonのインデント周りの罠を解消する方法

Python

はじめに

Pythonプログラミングでは、インデントがコードの構造を決定するために非常に重要です。インデントが不適切だと、下記のようなエラーが発生してしまいます。

  • IndentationError: unexpected indent
  • SyntaxError: unexpected indent

とくに初心者が書いたコードや、別のエディタからコピペしたコードでよく見られるエラーです。本記事では、インデントに関する一般的な問題と、その解決策を詳しく解説します。


インデントって何?

Pythonのインデントは、行頭にスペースやタブを使ってコードを1段下げることを指します。多くの場合、4つのスペースを1インデントとするのが標準的です。たとえば、下記のような関数定義では、本体部分を4つのスペースで下げています。

def example_function():
    print("Hello, World!")

このように、インデントの深さでブロック構造を表現しているのがPythonの大きな特徴です。関数定義やfor文、if文などのブロックを作るときに使います。


インデント問題の主な原因と解決方法

1. インデントのルールに従っていない

  • 間違った例
def example_function():
print("Hello, World!")  # インデントできていない

  • 正しい例
def example_function():
    print("Hello, World!")
  • 解決策
    • ブロック構造(def, if, for など)を開始するたびに、1段深いインデントを使用する。
    • 原則としてPythonでは4つのスペースを用いるのがPEP8で推奨されている。

2. タブとスペースが混在している

  • 問題点
    • 異なるエディタや環境でコピー&ペーストした際に、タブとスペースが混在してインデントがずれてしまう。
    • タブ幅が環境によって異なるため、一見整っているように見えてもPythonが認識するインデント量が一致しないことがある。
  • 混在した例
for i in range(10):
 for j in range(10):  # ここはタブ
        print(i, j)  # ここはスペース (4×2個)

  • 解決策
    • エディタの設定でタブをスペースに変換するようにする(insertSpacesなどのオプション)。
    • Visual Studio Code の例:
// settings.json
{
  "editor.insertSpaces": true,
  "editor.tabSize": 4
}
  • 既存のコードに混在がある場合は、全選択 → インデントを上げる → 下げる、などの操作で統一する。
  • 自動フォーマッターblack, autopep8 など)を使うのも有効。

3. エンコーディングが異なる

  • 問題点
    • ファイルの文字コードが原因で、見えない制御文字が含まれる場合がある。
    • 特にWindowsで作成したファイルをmacOSやLinuxで編集するときなど、想定外の文字コードが入り込むことがある。
  • 解決策
    • ファイルを統一して扱う。(例: UTF-8)
    • Python でファイルを扱う際に明示的にエンコーディングを指定する:
with open('example.py', 'r', encoding='utf-8') as f:
    content = f.read()
  • エディタ上でもファイルの保存設定を統一する。(例: UTF-8)

インデント問題の対処法・チェックリスト

以上を踏まえて、インデント問題に対処するチェックリストを以下に示します。一度チェックしてみましょう。

  1. エディタの設定を見直す
    • タブ幅やスペースへの自動変換を有効にする。
    • Visual Studio Code, PyCharm, Atom, Sublime Text など、主要エディタはほぼ対応している。
  2. 自動フォーマットツールの活用
    • blackautopep8 を使うと、インデントや余計な空白を整形してくれる。
    • チーム開発や大規模プロジェクトでは、CIパイプラインに組み込むこともある。
  3. 見えない文字を可視化する
    • 多くのエディタには見えない文字(タブ・スペースなど)を表示する機能がある。
    • 簡単な手順:VS Code のコマンドパレットで “Toggle Render Whitespace” を実行すると、タブやスペースが記号として可視化される。
  4. コード例で差分を確認する
for i in range(10):
 for j in range(10):  # ここはタブ
        print(i, j)  # ここはスペース (4×2個)
  • 「自分のエディタだと整って見える」場合でも、Pythonとしては認識が異なることがあるので注意。


まとめ

Pythonでは、インデントがプログラムの構造そのものに影響を与えます。

  • 4つのスペースを1インデントとするのが標準
  • エディタの設定でタブをスペースに変換する
  • 自動フォーマッター見えない文字の可視化を活用するとトラブルを防げる

いったん対策をしてしまえば、わずらわしいエラーの多くを防げます。ぜひ上記の方法を取り入れてみてください。

さらに学びたい方へ

Udemyのこちらの動画が勉強になります。
(Udemy動画は結構高いものもありますが、セールで80%OFFになったりもするので、セールのタイミングで一気に購入してしまうのがおすすめです)

コメント

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