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!
Non sono sicuro di aver capito cosa intendi con "tenta di segmentare ogni piccolo blocco di codice"? – Carpetsmoker