About "Unindent does not match any outer indentation level" error in Python
Tags: python, programming
Published: 2023-02-04 15:02:01

> ✋ **Update:** This post was originally published on my blog [decodingweb.dev](https://www.decodingweb.dev), where you can read the [latest version](https://www.decodingweb.dev/python-indentationerror-unindent-does-not-match-any-outer-indentation-level-fix) for a 💯 user experience. _~reza_

The “IndentationError: unindent does not match any outer indentation level” error occurs when the indentation of a line doesn’t match up with the expected indentation level of the current code block. On the other hand,

```python
File /var/www/sandbox/test.py, line 4
  print(word)
        ^
IndentationError: unindent does not match any outer indentation level
```

In the above error message, Python complains about line 4, where the code is indented differently than what Python expects.

Copy/pasting code snippets from the Internet or another editor is the common can lead to improper indentation. 

Since the error message shows the exact location, the solution is just re-indenting the affected lines.

In this quick guide, I'll explain why this error happens and how indentation in Python works.

We'll finish the guide by learning tips on fixing indentation-related issues on three popular code editors. 

## Indentation in Python Explained 

In Python, indentation isn't a style choice; It's a part of the syntax and is required by Python flow-control features such as if statements, loops, classes, and functions.

Python uses the whitespaces at the beginning of a line to compute the indentation level of that line; It's how Python figures out to which block the statement belongs.

For instance, it'll know which statements are inside the loop to be repeated.

```python
word = 'example'
for letter in word:
    print(letter)
 print(word)
```

In the above example, Python considers the first `print` statement to be inside the loop and the second `print` statement to be outside.

Now, let's see when this indentation code occurs?

In the above example, if you indent the second `print` by a couple of whitespaces, you'd make an ambiguous situation for Python to determine the indentation level of our loop. 

Python expects the line following an indentation level (e.g., `for`) to be less indented. However, in our example, the second `print` statement is slightly indented to the right. This makes it the determining line for Python to compute the indentation level for our for loop.

And since the first `print` statement is now indented differently than the determining line, Python throws the indentation error.

```python
word = 'example'
for letter in word:
    print(letter)
 print(word)
```

Another example would be an `if/else` statement:

```python
if a==1:
    print('test')
 else:
    print('test2')
```

In the above code, `else` is slightly indented to the right. And since Python expects it to be at the same level as `if`, it throws the indentation error.

As a rule of thumb, statements ending with a colon (`:`) require the following line to be indented (a new indentation block).

The relevant statements are:

- class
- def (functions)
- if, elif, and else
- for and while
- try, except, and finally
- with
- match and case (Python 3)

## Evil tabs!

Sometimes all lines look perfectly aligned, but you still get the error. That usually happens when you copy a tab-indented code from the Internet:

A python block with is using tabs and spaces for indentation
You usually won't have to worry about it because most modern editors automatically convert tabs to spaces (or vice versa if configured accordingly). 

However, if you copy/paste a code snippet from the Internet (e.g., Stackoverflow), you'll have to re-indent them manually.

To avoid this situation, you can make all whitespaces visible in your code editor. This will give you a quick way to prevent (or debug) indentation-related mistakes.

Additionally, you can use Python's `tabnanny` module to help you detect indentation errors quickly. Tabnanny checks for consistency in the indentation of code blocks in a Python code. If such an error is detected, it will throw the indentation error.

```
dwd@dwd-sandbox:~$ python3 -m tabnanny test.py 
'test.py': Indentation Error: unindent does not match any outer indentation level (<tokenize>, line 4)
```

## How to fix unindent does not match any outer indentation level error

As mentioned earlier, you can fix this indentation error by ensuring that the indentation of the code block matches the expected indentation level. 

But there are also automatic ways to do so. That's actually the preferred method among Python developers. Let me share with you some indentation tips & tricks on three popular code editors:

- Visual Studio Code
- Sublime Text
- Vim 

**Visual Studio Code:**  Firstly, to make whitespace characters (space or tab) visible in VS code, open up the command palette by pressing `⌘+Shift+P` (on Mac) or `Ctrl+Shift+P` (on Windows), type, Toggle Render Whitespaces and hit enter (↵)

As a result, whitespaces are displayed as gray dots and tabs as tiny arrows. Having whitespaces visible enables you to spot inconsistencies as your write code - even if they look fine.

And to fix the possible tab/space inconsistencies, open up the command pallet again, and run _Convert Indentation to Spaces_ or _Convert Indentation to Tabs_ - depending on what character you use for indentation.

**Sublime Text:** If you have a space/tab indentation issue on Sublime Text, go to _View -> Indentation_ and select _Indent Using Spaces_.

And to see the whitespace characters, highlight your code (`Ctrl + A`), and you should be able to see any possible inconsistency.

**Vim:** Like the other editors, Vim automatically converts any whitespace to space characters. However, if you've copied some tab-indented code from elsewhere, you can use Vim's `:retab` command to convert them into spaces quickly.

You can make whitespace characters visible with `set list` and set `listchars` commands. 

First, run this in Vim:

```
:set list
```

And then run:

```
:set listchars=space:␣,tab:-> 
```

You can replace `␣` and `->` with the characters of your choice.

A note on Tabs and space characters in Python indentation
In Python, tabs and spaces are interchangeable when it comes to indentation. 

However, the Python style guide (**PEP 8**) recommends using spaces over tabs - four space characters per indentation level.

According to **PEP 8**, if you're working with a code that's already using tabs, you can continue using them to keep the indentation consistent. 

Additionally, Python disallows mixing tabs and spaces for indentation. So you can't use tabs and space characters in the same indentation level - Just like the above examples.

Alright, I think that does it! I hope you found this quick guide helpful.

Thanks for reading.

---

**❤️ You might like:**

- [AttributeError: 'str' object has no attribute 'decode' (Fixed)](https://www.decodingweb.dev/python-attributeerror-str-object-has-no-attribute-decode-fix)
- [How a computer program works](https://www.decodingweb.dev/how-a-computer-program-works)
- [How back-end web frameworks work?](https://www.decodingweb.dev/backend-web-frameworks)
- [Your master sword: a programming language](https://www.decodingweb.dev/your-master-sword-a-programming-language)