Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Understanding Python interpreter -t (-tt) option

I'm trying to figure out what the options -t and -tt do.

From the doc:

Issue a warning when a source file mixes tabs and spaces for indentation in a way that makes it depend on the worth of a tab expressed in spaces. Issue an error when the option is given twice (-tt).

I'm not getting it, in particular the bolded sentence, what does it mean? A tab is a tab ('\t') a space is a space (' ') and in ascii table they also have 2 different codes.

I'll ty to make an example to explain better myself. I code:

if True:
    print('hello') # here a tab that my editor represents with 4 spaces
    print('world') # here just used 4 spaces

Now this code, I tried, doesn't work neither in Python3 nor in Python2, so what does -t do?

Could you give me a clarification?

like image 202
zer0uno Avatar asked Jan 11 '23 02:01

zer0uno


1 Answers

When used as indentation, tabs must be interpreted as equivalent to a number of spaces. How many spaces depends on how you configured your editor, and how many spaces preceded the tab on the same line. That's because tabs represent a jump to the next tabstop. If you used 2 spaces plus a tab, you have signalled a jump to column 8, as if you inserted 6 spaces.

In addition, some people set their tabstops to be the equivalent of 4 spaces, others set it to be the same as 8 spaces. These people then use tabs in indentation in different ways too. You could use 4 spaces for one indentation level, then use tabs at 8 spaces for the next, then use a tab plus 4 spaces, etc. Or you could use tabs for all indentation levels, having set the tab size to represent 4 spaces.

Python needs to handle mixing of tabs and spaces, and then hope that you used it consistently; e.g. you didn't use 4 spaces first, then a tab to indent to what you thought was an indentation equivalent to 12 spaces. Python can easily get this wrong when you are inconsistent.

The -t and -tt options point out where you may have gotten this wrong by doing more rigorous and thorough testing of all lines.

The ease by which you can produce confusing results, between various tab sizes and mixing tabs and spaces, is the reason why the Python Style Guide (PEP 8) strongly recommends that you use spaces only:

Spaces are the preferred indentation method.

Tabs should be used solely to remain consistent with code that is already indented with tabs.

In Python 3, mixing tabs and spaces for indentation is now an error.

To be precise: Python starts out assuming you used 8 spaces for a tab. See the Indentation documentation, part of the Lexical Analysis specification:

First, tabs are replaced (from left to right) by one to eight spaces such that the total number of characters up to and including the replacement is a multiple of eight (this is intended to be the same rule as used by Unix). The total number of spaces preceding the first non-blank character then determines the line’s indentation. Indentation cannot be split over multiple physical lines using backslashes; the whitespace up to the first backslash determines the indentation.

Python 2 also looks for Emacs and VI-style configuration comments; if the tokenizer finds a comment with tab-width:, :tabstop=, :ts= or set tabsize= in it, followed by digits, like:

# -*- tab-width: 4 -*- (emacs)
# :tabstop=4 (vi)

or similar variants, then Python sets the tabsize from that. This support was removed from Python 3.

If you then mix tabs and spaces that may be inconsistent, and use -t, the text <filename>: inconsistent use of tabs and spaces in indentation is written to sys.stderr once for that file. If you used -tt, a TabError exception is raised instead.

like image 131
Martijn Pieters Avatar answered Jan 21 '23 18:01

Martijn Pieters