2016-05-22 12 views
1

Ich habe PEP 8 gelesen, aber ich verstehe nicht, warum Python3 sich damit beschäftigt, Tabulatoren und Leerzeichen mit dieser Fehlermeldung zu mischen.Warum gibt es einen Fehler beim Mischen von Tabulatoren und Leerzeichen, aber nicht bei anderen PEP8-Verletzungen?

TabError: inconsistent use of tabs and spaces in indentation

verstehe ich die Bedeutung der Konsistenz, sondern eine Fehlermeldung, die Ausführung extrem stoppt scheint, zumal gemischter Tabs und Leerzeichen keinen Unterschied zu den Compiler machen und die meisten guten Editoren unterstützen Tab/Raumkonvertierungen. Darüber hinaus hat Python3 kein Problem damit, andere PEP-Konventionen zu ignorieren (zum Beispiel mit drei Leerstellen anstelle von vier), Sie erhalten nicht einmal eine Warnmeldung dafür.

Also was ist der Deal, warum behandelt Python3 plötzlich Mixing-Spaces und Tabs wie das ultimative Böse?

+0

'vor allem, da gemischte Tabs und Leerzeichen für den Compiler keinen Unterschied machen '- Nach dem, was ich gelesen habe, verlässt sich der Compiler vollständig auf' \ t'. Andere Leerzeichen sind Diskrepanzen. – finnrayment

+0

Es "stoppt die Ausführung" nicht so sehr wie die Ausführung verweigern. :) –

Antwort

2

Sie können Tabs und Leerzeichen in einer Python-Datei perfekt kombinieren (obwohl PEP8 besagt, dass Sie dies nicht tun sollten).

(Stackoverflow druckt Tab als 4 Räume, zB Registerkarten in this gist korrekt sind, testen sie selbst!)

Hier ist eine absolut gültige Python-Funktion:

def foo(): 
    print("one tab") # all indentation is one tab. 
    if True: 
     print("two spaces") 
    else: 
     print("four spaces") 

was kann man nicht Sie ist mix Tabulatoren und Leerzeichen in dem gleichen Block:

def foo(): 
    print("one tab") 
     print("eight spaces") 

Dies ergibt eine TabError.

Auch wenn diese in Ihrem Texteditor aufgereiht sind.


Dies liegt daran, (grob) sie kann bis Zeile unterschiedlich in Texteditor jemand anderes und wie ein anderes Verfahren suchen. Um ein dummes Beispiel:

def foo(): 
    while True: 
     "we should exit immediately" 
     return True # suppose this was tab indented 

Die letzte Zeile wie es reiht sich mit der Zeichenfolge aussehen kann, und daher kehrt sofort zurück, aber da es Tab gegliederten vielleicht ist es reihen sich mit der while (so die while-Schleife nie Ausfahrten). ???

Hier liegt die Mehrdeutigkeit, und so der Parser Nein sagen.


PEP8 besagt jedoch, dass Sie immer nur 4 Leerzeichen verwenden sollten, um diese Mehrdeutigkeit zu vermeiden.

+1

Okay, ich denke ich sehe. Wenn Sie also einen gemischten Tabulator- und Leerzeichen-Code schreiben, bei dem die Registerkarte 4 Leerzeichen enthält, erhalten Sie eine Fehlausrichtung, wenn Sie diese in einen Editor einfügen, bei dem die Registerkarte auf 8 Leerzeichen gesetzt ist. Das könnte zu einem stillen Fehler führen, der den Tag ruiniert. Vielen Dank. – jmdeamer