2016-03-17 11 views
5

So che ci sono molte domande su schede e spazi, ma sembra che, contrariamente a quanto dice PEP 0008 su Python 3, le schede e gli spazi di missaggio non sono sempre illegali. In particolare, la miscelazione di tabulazioni e spazi nello stesso blocco è illegale, ma i blocchi con spazi e blocchi con schede sono consentiti nello stesso file.Python 3 consente di mescolare spazi e tabulazioni?

Ad esempio, questo getta un TabError su Python 3.4:

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

Ma questo funziona bene:

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

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

È questo in base alla progettazione?

Modifica: la domanda è non se le schede sono migliori degli spazi. La domanda è se le schede e gli spazi di Python nello stesso file siano di progettazione.

risposta

4

La prova di questo è abbastanza semplice (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") 

Guardando il codice in cui questo errore è in realtà gettato (Parser/tokenizer.c, tok_get()) Sembra che questo semplicemente a confronto il tipo di indentazione a ciò che è stata utilizzata la riga precedente e non a ciò che viene utilizzato in tutto il file.

La documentazione dice (Doc/reference/lexical_analysis.rst, sottolineatura mia)

rientro è respinta in quanto incoerente se un file di origine mescola le schede e gli spazi in un modo che rende il significato dipende dal valore di una linguetta in spazi ; in tal caso viene sollevato un numero TabError.

È possibile combinare schede e spazi se i "blocchi" sono completamente "separati" tornando al livello di indentazione 0; in quanto non ci può essere confusione sulla logica del programma a causa delle impostazioni della larghezza della scheda. Il problema con le schede e gli spazi di missaggio in Python è che Python assume che una scheda è larga otto spazi, ma che l'editor del programmatore può usare qualcos'altro.Ad esempio, il codice come questo:

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

sarà visto come questo con un tabstop di 4:

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

che ovviamente non è cosa fa il programma!

Ma in casi come:

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

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

Va bene da un punto di "logica" di vista, non importa quanto ho vista le schede, è sempre chiaro quale sia la logica è. E 'naturalmente ancora una cattiva idea di mescolare le schede e gli spazi in un unico file, ma questo è solo un errore di stilistica, e non un errore logico ;-)

Quindi, per rispondere alla domanda: a giudicare da questa unica riga la documentazione, I direbbe che questo è di progettazione. Non riesco a trovare un PEP per questo, però, e questo caso non è testato. Non mi farei affidamento sul fatto che tutte le versioni di Python nel futuro si comportano allo stesso modo!

1

Python tenta di segmentare ogni piccolo blocco di codice in modo che quando si copia e incolla, funziona ancora, e non si è costretti a rendere tutto perfetto. Una delle tante bellezze di Python.

PEP 8 è solo una convenzione per il codice più leggibile, e vi consiglio di fare seguirla, ma non devono

Se si vuole cercare ciò che PEP 8 comprende ci sono diversi editor che esamineranno il tuo codice per le violazioni legali in Python, ma non sono belle. Io uso PyCharm. A PyCharm non piacciono quando usi spazi e tabulazioni nello stesso file e diventerà snarky con i sottotitoli ondulati.

+0

Non sono sicuro di aver capito cosa intendi con "tenta di segmentare ogni piccolo blocco di codice"? – Carpetsmoker