Reputation: 15629
When I compile the Python code below, I get
IndentationError: unindent does not match any outer indentation level
import sys
def Factorial(n): # Return factorial
result = 1
for i in range (1,n):
result = result * i
print "factorial is ",result
return result
Why?
Upvotes: 809
Views: 2710843
Reputation: 1415
I actually get this in Pylint from a bracket in the wrong place.
I'm adding this answer, because I sent a lot of time looking for tabs. In this case, it has nothing to do with tabs or spaces.
def some_instance_function(self):
json_response = self.some_other_function()
def compare_result(json_str, variable):
"""
Sub function for comparison
"""
json_value = self.json_response.get(json_str, f"{json_str} not found")
if str(json_value) != str(variable):
logging.error("Error message: %s, %s",
json_value,
variable) # <-- Putting the bracket here causes the error below
#) <-- Moving the bracket here fixes the issue
return False
return True
logging.debug("Response: %s", self.json_response)
# ^----The pylint error reports here
Upvotes: -1
Reputation: 319
If you use Colaboratory, then you can do this to avoid the error by these commands:
It's all [tab] indentation converted to [space] indentation. Then OK.
Upvotes: 10
Reputation: 9532
I had the same error because of another thing, and it was not about tabs vs. spaces. I had the first if
slightly more indented than an else:
much further down. If it is just about a space or two; you might oversee it after a long code block. The same thing with docstrings:
"""comment comment
comment
"""
They also need to be aligned; see the other answer on the same page here.
Reproducible with a few lines:
if a==1:
print('test')
else:
print('test2')
Throws:
File "<ipython-input-127-52bbac35ad7d>", line 3
else:
^
IndentationError: unindent does not match any outer indentation level
Upvotes: 0
Reputation: 748
I'm using Sublime Text in the Ubuntu OS. To fix this issue, go to:
Menu View → Indentation → Convert indentation to tabs.
Upvotes: 6
Reputation: 1174
Using Visual Studio Code
If you are using Visual Studio Code, then it will convert all mixed indentation to either space or tabs using these simple steps below.
press Ctrl + Shift + P
type indent using spaces
Press Enter
Upvotes: 15
Reputation: 1431
I got this error even though I didn't have any tabs in my code, and the reason was there was a superfluous closing parenthesis somewhere in my code. I should have figured this out earlier, because it was messing up spaces before and after some equal signs...
If you find anything off even after running Reformat code in your IDE (or manually running autopep8), make sure all your parentheses match, starting backwards from the weird spaces before/after the first equals sign.
Upvotes: 1
Reputation: 857
I am using Sublime Text 3 with a Flask project. I fixed the error using menu View → Indentation → Tab Width: 4 after unselected Indent Using Spaces.
Upvotes: 2
Reputation: 221
For example:
1. def convert_distance(miles):
2. km = miles * 1.6
3. return km
In this code, the same situation occurred for me. Just delete the previous indent spaces of line 2 and 3, and then either use tab or space. Never use both. Give proper indentation while writing code in Python.
For Spyder, go to menu Source → Fix Indentation. The same goes for Visual Studio Code, Sublime Text or any other editor. Fix the indentation.
Upvotes: 2
Reputation: 149
For Spyder users, go to
menu Source → Fix Indentation
to fix the issue immediately.
Upvotes: 12
Reputation: 1139
For what it’s worth, my docstring was indented too much and this also throws the same error
class junk:
"""docstring is indented too much"""
def fun(): return
IndentationError: unindent does not match any outer indentation level
Upvotes: 7
Reputation: 89
I was using Jupyter Notebook and tried almost all of the solutions in previous answers (adapting to my scenario) to no use. I then went line by line, deleted all spaces for each line and replaced with tab. That solved the issue.
Upvotes: 4
Reputation: 5303
I had a function defined, but it did not have any content apart from its function comments...
def foo(bar):
# Some awesome temporary comment.
# But there is actually nothing in the function!
# D'Oh!
It yelled:
File "foobar.py", line 69
^
IndentationError: expected an indented block
(note that the line the ^
mark points to is empty)
--
Multiple solutions:
1: Just comment out the function
2: Add function comment
def foo(bar):
'' Some awesome comment. This comment could be just one space.''
3: Add a line that does not do anything
def foo(bar):
0
In any case, make sure to make it obvious why it is an empty function - for yourself, or for your peers that will use your code.
Upvotes: 1
Reputation: 13309
Since I realize there isn't any answer specific to Spyder, I'll add one:
Basically, carefully look at your if
statement and make sure all if
s, elif
s and else
s have the same spacing, that is, they're at the same line at the start like so:
def your_choice(answer):
if answer>5:
print("You're overaged")
elif answer<=5 and answer>1:
print("Welcome to the toddler's club!")
else:
print("No worries, mate!")
Upvotes: 2
Reputation: 134
For Atom users, Packages → white space → remove trailing white spaces. This worked for me.
Upvotes: 1
Reputation: 61
I had the same issue yesterday. It was an indentation error. I was using the Sublime Text editor.
It took my hours trying to fix it, and at the end I ended up copying the code into the vi text editor. It just worked fine.
PS: Python is too whitespace sensitive. Make sure not to mix spaces and tabs.
Upvotes: 0
Reputation: 6547
Important:
Spaces are the preferred method - see PEP 8 Indentation and Tabs or Spaces?. (Thanks to @Siha for this.)
For Sublime Text users:
Set Sublime Text to use tabs for indentation: Menu View → Indentation → Convert Indentation to Tabs
Uncheck the Indent Using Spaces option as well in the same sub-menu above. This will immediately resolve this issue.
Upvotes: 333
Reputation: 239
If you use Notepad++, do a "replace" with extended search mode to find \t and replace with four spaces.
Upvotes: 9
Reputation: 11
This is because there is a mix up of both tabs and spaces. You can either remove all the spaces and replace them with tabs.
Or, try writing this:
#!/usr/bin/python -tt
at the beginning of the code. This line resolves any differences between tabs and spaces.
Upvotes: 1
Reputation: 21161
One possible cause for this error is that there might be spaces mixed with tabs for indentation. Try doing a search & replace to replace all tabs with a few spaces.
Try this:
import sys
def Factorial(n): # return factorial
result = 1
for i in range (1,n):
result = result * i
print "factorial is ",result
return result
print Factorial(10)
Upvotes: 867
Reputation: 21
Another way of correcting the indentation error is to copy your code to PyCharm if you have configured that already and reformat the file it will automatically indent correctly.
Upvotes: 1
Reputation: 1
I got the similar error below:
IndentationError: expected an indented block
When I forgot to put pass
to the class or function below, then other code was written after the class or function as shown below:
class Person:
# pass
x = 10
def test():
# pass
x = 10
And, when other code was not written after the class or function as shown below:
class Person:
# pass
# x = 10
def test():
# pass
# x = 10
I got the error below:
SyntaxError: unexpected EOF while parsing
Upvotes: 0
Reputation: 593
If you use Python's IDLE editor you can do as it suggests in one of similar error messages:
1) select all, e.g. Ctrl + A
2) Go to Format -> Untabify Region
3) Double check your indenting is still correct, save and rerun your program.
I'm using Python 2.5.4
Upvotes: 18
Reputation: 141
Firstly, just to remind you there is a logical error you better keep result=1 or else your output will be result=0 even after the loop runs.
Secondly you can write it like this:
import sys
def Factorial(n): # Return factorial
result = 0
for i in range (1,n):
result = result * i
print "factorial is ",result
return result
Leaving a line will tell the python shell that the FOR statements have ended. If you have experience using the python shell then you can understand why we have to leave a line.
Upvotes: 1
Reputation:
Just a addition. I had a similar problem with the both indentations in Notepad++.
Outer Indentation Level
Go to ----> Search tab ----> tap on replace ----> hit the radio button Extended below ---> Now replace \t with four spaces
Go to ----> Search tab ----> tap on replace ----> hit the radio button Extended below ---> Now replace \n with nothing
Upvotes: 4
Reputation: 683
If you are using Vim, hit escape and then type
gg=G
This auto indents everything and will clear up any spaces you have thrown in.
Upvotes: 23
Reputation: 16271
On Atom
go to
Packages > Whitespace > Convert Spaces to Tabs
Then check again your file indentation:
python -m tabnanny yourFile.py
or
>python
>>> help("yourFile.py")
Upvotes: 10
Reputation: 29
It could be because the function above it is not indented the same way. i.e.
class a:
def blah:
print("Hello world")
def blah1:
print("Hello world")
Upvotes: 2
Reputation: 823
Looks to be an indentation problem. You don't have to match curly brackets in Python but you do have to match indentation levels.
The best way to prevent space/tab problems is to display invisible characters within your text editor. This will give you a quick way to prevent and/or resolve indentation-related errors.
Also, injecting copy-pasted code is a common source for this type of problem.
Upvotes: 8
Reputation: 29450
Are you sure you are not mixing tabs and spaces in your indentation white space? (That will cause that error.)
Note, it is recommended that you don't use tabs in Python code. See the style guide. You should configure Notepad++ to insert spaces for tabs.
Upvotes: 51
Reputation: 13327
To easily check for problems with tabs/spaces you can actually do this:
python -m tabnanny yourfile.py
or you can just set up your editor correctly of course :-)
Upvotes: 156