Python 3 erlaubt mischen Leerzeichen und tabs?

Ich weiß es sind viele Fragen auf, tabs vs. spaces, aber es scheint, dass, im Gegensatz zu dem, was PEP 0008 sagt über Python 3, die Vermischung von Tabulatoren und Leerzeichen ist nicht immer illegal. Insbesondere die Vermischung von Tabulatoren und Leerzeichen im gleichen block ist illegal, aber der Blöcke mit Leerzeichen und Blöcke mit tabs erlaubt sind in der gleichen Datei.

Beispielsweise das wirft ein TabError auf Python 3.4:

for x in range(10):
    print(x)  # Spaces
    print(x)  # Tab

Aber das läuft gut:

for x in range(10):
    print(x)  # Spaces

for y in range(5):
    print(y)  # Tab

Ist das so gewollt?

Edit: Die Frage ist nicht ob tabs besser sind als Räume. Die Frage ist, ob Python so dass tabs und Leerzeichen in der gleichen Datei ist by design.

InformationsquelleAutor Pedro | 2016-03-17



2 Replies
  1. 5

    Den test für dieses ist ziemlich einfach (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")

    Blick auf den code, wo dieser Fehler eigentlich geworfen (Parser/tokenizer.c, tok_get()) sieht es so aus bloß vergleicht die Einrückung Art zu dem, was die vorherigen – Linie verwendet und nicht, was in der gesamten Datei.

    Die Dokumentation sagt (Doc/reference/lexical_analysis.rst, Hervorhebung von mir)

    Einzug abgelehnt wird als inkonsistent, wenn eine Quellcode-Datei Mischungen von Tabulatoren und Leerzeichen in einer Weise, dass die Bedeutung abhängiger auf dem Wert der tab-in Leerzeichen; ein TabError ausgelöst wird, in diesem Fall.

    Es ist okay zu mischen, tabs und Leerzeichen, wenn die „Blöcke“ vollständig „getrennt“ gehen Sie wieder zur Einrückung 0; so gibt es keine Verwirrung über die Programmlogik durch Tabulator-Breite-Einstellungen. Das problem mit der Mischung von tabs und Leerzeichen sind in Python ist, dass Python übernimmt, dass ein tab ist acht Felder breit, aber der programmer ‚ s editor kann etwas anderes verwenden. Zum Beispiel, code wie diesen:

    def my_fun(i):
        if i == 6:
            foo()
    ------->bar()  # Tab

    Gesehen werden als dies mit einem tabstop von 4:

    def my_fun(i):
        if i == 6:
            foo()
        bar()

    Das ist natürlich nicht das, was das Programm tut!

    Aber in Fällen wie:

    def my_fun(i):
        if i == 6:
            foo()
            bar()
    
    def my_fun2(i):
    --->if i == 7:
    --->--->foo()
    --->--->bar()

    Es ist okay, von einer „Logik“ Sicht, da egal wie ich die tabs, es ist immer klar, was die Logik ist. Es ist natürlich noch eine schlechte Idee, Mischung von Tabulatoren und Leerzeichen in einer einzigen Datei, aber das ist nur eine stilistische Fehler, und nicht ein logischer Fehler 😉

    Also um die Frage zu beantworten: die Beurteilung aus, dass eine Zeile in der Dokumentation, die ich
    würde sagen, das ist by design. Ich kann nicht finden, eine PEP für diese, aber, und diese
    Fall nicht getestet. Ich würde mich nicht darauf verlassen, dass alle Python-Versionen in der
    Zukunft Verhalten!

  2. 1

    Python versucht zu segmentieren und die einzelnen kleinen block von code, so dass, wenn Sie kopieren und einfügen, es funktioniert immer noch, und Sie sind nicht gezwungen, alles perfekt. Eine der vielen Schönheiten von python.

    PEP 8 ist nur eine Konvention für die meisten lesbaren code, und ich empfehle, dass Sie tun, zu Folgen, aber Sie nicht müssen

    Wenn Sie wollen, zu suchen, was PEP 8 umfasst, gibt es mehrere Editoren, überprüfen Sie Ihren code für Verstöße, die sind legal in python, aber nicht schön. Ich benutze PyCharm. PyCharm mag es nicht, wenn Sie die Verwendung von Leerzeichen und tabs in der gleichen Datei, und es wird snarky mit dem Schnörkel unter-Auskleidungen.

    • Ich bin mir nicht sicher, ob ich verstehe, was du meinst mit „versucht zu segmentieren jeden noch so kleinen code-block“?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.