TabError in Python 3 function - python

Im writing a new program for my friend,
and in a function I have a try and an except but if i run it, it gives me
an error :"File "main.py", line 19
try:
^
TabError: inconsistent use of tabs and spaces in indentation"
Im trying everything to fix it but it doesn't work...

The error that you are getting is fairly self-explanatory: TabError: inconsistent use of tabs and spaces in indentation simply means that you are using tabs in some places in your code and spaces in other places.
This can be a little difficult to diagnose as although two lines will appear to be the same level of indentation, one will be indented with a tab and the other with probably 3 or 4 spaces.
The reason this is important in Python, is that as I am sure you are aware, scopes are defined using indentation. So if you are not consistently using either tabs or spaces (as you most likely are), a TabError will be thrown!
If you are still unsure where you have used spaces instead of tabs (or the other way around), most text-editors will have the option to show white-space and tab allowing you to easily see where you've slipped up.

It is indeed very hard to distinguish spaces and tabs by our human beings! However, you can use Python IDLE GUI (in Windows) to Tabify (under Format) the whole file to make sure the indentation is consistent.

Related

VS Code Python autopep8 does not honor 2 spaces hanging indentation

I'm trying to get autopep8 work to properly indent Python code with 2 spaces instead of 4. I'm using VS Code with Python extension which uses autopep8 for formatting. I found here that autopep8 can be configured to use 2 spaces by
"python.formatting.autopep8Args": ["--indent-size=2"]
But it does not work for me.
My situation is like this. When I press enter, it correctly starts the next line with the same indentation as the previous line. Press enter after an open parenthesis, it correctly starts the new line with 2 more spaces. But when I paste or save (I have "editor.formatOnPaste" and "editor.formatOnSave" set to true), the annoying thing happened: all the 2-space indentation inside the parentheses became 4 (other 2-space indentation are unaffected). Why is it doing this and how can I make it 2 spaces everywhere?
====EDIT====
I found out that the pylint error Wrong hanging indentation (remove 2 spaces). [bad-continuation]. It's because my pylintrc has indent-after-paren=2. I'm wondering if autopep8 or other Python formatter can set this property?
I also had to include this in my array in settings.json, similar to yours.
"--ignore E121"
According to https://pypi.org/project/autopep8/, this setting ensures your indents are a multiple of 4. By not enforcing that, the configured tab size in VSCode is used.
E121 - Fix indentation to be a multiple of four.
That being said, your indentation is still "acceptable" according to pep8, so it actually will not change it to the 4 spaces you are expecting in your parens. I had to outdent mine one level, then when it ran again, it didn't change it.
Unfortunately this is actually just a workaround and it actually negatively affects other indention rules...
You can see in the code for pep8 that they hardcode the default tab size to be the "python way" (4 spaces) in:
https://github.com/hhatto/autopep8/blob/120537a051d7f3cbbb5c4ede19b9e515156bd3d1/autopep8.py#L104
That makes it look like the hanging indent is just not respecting the --indent-size option...
Adding --indent-size=2 --ignore=E121 worked for me.
had the same issue, here is the solution:
Navigate to library directory of your environment
Open autopep8.py
Search for "DEFAULT_INDENT_SIZE" and change it to 2

Python 3 allows mixing spaces and tabs?

I know there are many questions on tabs vs. spaces, but it appears that, contrary to what PEP 0008 says about Python 3, mixing tabs and spaces is not always illegal. Specifically, mixing tabs and spaces in the same block is illegal, but blocks with spaces and blocks with tabs are allowed in the same file.
For example, this throws a TabError on Python 3.4:
for x in range(10):
print(x) # Spaces
print(x) # Tab
But this runs fine:
for x in range(10):
print(x) # Spaces
for y in range(5):
print(y) # Tab
Is this by design?
Edit: The question is not whether tabs are better than spaces. The question is whether Python's allowing tabs and spaces in the same file is by design.
The test for this is pretty simple (Lib/tests/test_exceptions.py):
self.raise_catch(TabError, "TabError")
try: compile("try:\n\t1/0\n \t1/0\nfinally:\n pass\n",
'<string>', 'exec')
except TabError: pass
else: self.fail("TabError not raised")
Looking at the code where this error is actually thrown (Parser/tokenizer.c, tok_get()) it looks like this merely compares the indentation kind to what the previous line used, and not what is used throughout the file.
The documentation says (Doc/reference/lexical_analysis.rst, emphasis mine)
Indentation is rejected as inconsistent if a source file mixes tabs and spaces in a way that makes the meaning dependent on the worth of a tab in spaces; a TabError is raised in that case.
It's okay to mix tabs and spaces if the "blocks" are completely "separated" by going back to indentation level 0; as there can be no confusion about the program's logic due to tab width settings. The problem with mixing tabs and spaces in Python is that Python assumes that a tab is eight spaces wide, but that the programmer's editor may use something else. For example, code like this:
def my_fun(i):
if i == 6:
foo()
------->bar() # Tab
Will be seen as this with a tabstop of 4:
def my_fun(i):
if i == 6:
foo()
bar()
Which is obviously not what the program does!
But in cases like:
def my_fun(i):
if i == 6:
foo()
bar()
def my_fun2(i):
--->if i == 7:
--->--->foo()
--->--->bar()
It's okay from a "logic" point of view as no matter how I view tabs, it's always clear what the logic is. It's of course still a bad idea to mix tabs and spaces in a single file, but that's merely a stylistic error, and not a logic error ;-)
So to answer the question: judging from that one line in the documentation, I
would say that this is by design. I can't find a PEP for this, though, and this
case isn't tested. I would be not rely on it that all Python versions in the
future behave the same!
Python tries to segment each little block of code so that when you copy and paste, it still works, and you aren't forced to make everything perfect. One of the many beauties of python.
PEP 8 is just a convention for the most readable code, and I recommend that you do follow it, but you don't have to
If you want to look for what PEP 8 encompasses there are several editors that will inspect your code for violations that are legal in python, but not nice. I use PyCharm. PyCharm doesn't like when you use spaces and tabs in the same file and it will get snarky with the squiggle under-linings.

Why do I get a `TabError` from code that appears to be properly aligned? [duplicate]

This question already has answers here:
I'm getting an IndentationError. How do I fix it?
(6 answers)
Closed last month.
The following python code throws this error message, and I can't tell why, my tabs seem to be in line:
File "test.py", line 12
pass
^
TabError: inconsistent use of tabs and spaces in indentation
class eightPuzzle(StateSpace):
StateSpace.n = 0
def __init__(self, action, gval, state, parent = None):
StateSpace.__init__(self, action, gval, parent)
self.state = state
def successors(self) :
pass
You cannot mix tabs and spaces, according the PEP8 styleguide:
Spaces are the preferred indentation method.
Tabs should be used solely to remain consistent with code that is already indented with tabs.
Python 3 disallows mixing the use of tabs and spaces for indentation.
Python 2 code indented with a mixture of tabs and spaces should be converted to using spaces exclusively.
When invoking the Python 2 command line interpreter with the -t option, it issues warnings about code that illegally mixes tabs and spaces. When using -tt these warnings become errors. These options are highly recommended!
Using Visual Studio 2019
I was using tabs but the editor was inserting spaces and it would result in errors.
To avoid getting the spaces and tabs mixed up , set your preferences
Go to Edit->Advanced->Set Leading Whitespace->Tabs (or Whitespaces)
After I set it to Tabs, my tabs stop being represented as spaces and it worked fine thereafter
For linux nano users:
if your code includes 4 spaces instead of a tab, you should keep using 4 spaces or change all of them to a tab. If you use mixed it gives an error.
open your code in a text editor, highlight all of it (ctr+a) and go to format and select either "Tabify region" or "Untabify region". It'll just make all the indents have the same format.
not using the backspace also is important (especially in the Leafpad editor). If you want to decrease indent, use only Alt_key + TAB.
This should be done when you delete a line in a Python code.

Terminal gives indentation error, editor does not

Here is the code:
count = 0
i = 0
while count < len(newlist):
if newlist[i] == newlist[i+6] and newlist [i+6] != newlist [i+12]:
two1.append(newlist[i])
two1.append(newlist[i+1])
two1.append(newlist[i+2])
two1.append(newlist[i+3])
count=count+1
i=i+6
print two1
In the terminal, I get:
File "<stdin>", line 2
count=count+1; i=i+6
^
IndentationError: unexpected indent
In the learnpython.org editor, I get no error. Either way, two1 is printing as [], which is not what I want.
Your first line of code is indented, which is illegal, so the terminal is correct. Are you sure you haven't forgotten to paste a line from your source code?
There obviously is some program logic missing - newlist and two1 aren't defined anywhere, for instance.
There is a mixture of tab characters and spaces in your code (visible by selecting if you edit the post, not in the formatted output). Using tabs for indentation in Python is discouraged, and mixing tabs and spaces is even worse. From PEP8:
Never mix tabs and spaces.
The most popular way of indenting Python is with spaces only. The
second-most popular way is with tabs only. Code indented with a
mixture of tabs and spaces should be converted to using spaces
exclusively. When invoking the Python command line interpreter with
the -t option, it issues warnings about code that illegally mixes tabs
and spaces. When using -tt these warnings become errors. These options
are highly recommended!
For new projects, spaces-only are strongly recommended over tabs. Most
editors have features that make this easy to do.
Set up your editor to convert tabs to spaces, and life will be better.
Your program can't start on an indent.
About Scope:
http://beastie.cs.ua.edu/cs150/book/index_13.html

Unexpected Indent when defining variable

I'm new to Python and it just confounds me with Indentation errors. In the following images, why does the first one work and the second one give me an indentation error?
Works:
Doesn't work: (Notice extra tree-expander that pops up in Notepad++)
Error:
File ".\sigma.py", line 14
for val in vs:
^
IndentationError: unexpected indent
I'm using Notepad++ and there are no spaces/tabs issues anywhere. Also, tried it out on the Python console typing it in exactly the same way in the 2nd image. It works fine. I'm guessing there's a very logical explanation to this, but coming from a strong-typed background (>5 years in Java), this feels like an unnecessary error.
You are mixing tabs and spaces. Don't do this, it creates inconsistent indentation problems.
Run your script through the tab checker:
python -tt script.py
and fix any and all tabs (replace with spaces), then configure your editor to only use spaces.
For Notepad++, see:
Convert tabs to spaces in Notepad++
How does one configure Notepad++ to use spaces instead of tabs?

Categories

Resources