2012-12-04 13 views
9

Edit: Prima di down-voto, si ricorda che ho davvero, in realtà sono fatto in modo che non ci siano spazi solo a livello 4-spazio-utilizzati per indentazione e ho reso questo perfettamente chiaro nella domanda. No, davvero, nella realtà attuale, in realtà ho effettivamente reso al 100% certo oltre il dubbio irragionevole. C'è una parte particolare della realtà che condividiamo tutti, in cui c'è luce e suono e interagiamo tutti con energia e materia; IN QUESTA REALTÀ, ho reso sicuro al 100% che NON è questo, ripeto, che NON è un caso di schede e spazi inconsistenti. Ho trovato la soluzione e non aveva nulla a che fare con spazi o tabulazioni inconsistenti. Ora sentitevi liberi di votare, ma per favore dimmi perché, in un commento, in modo che io sappia cosa migliorare. Grazie.Python: "rientro inaspettato", ma il rientro è apparentemente corretta e coerente

domanda originale:

sto ottenendo un errore di indentazione strano in Python.

L'errore è: IndentationError: unexpected indent

for uuid in uuids: 
    sys.stdout.write('Checking \'' + uuid + '\'...') 
    result = qp.get('v2/customer/' + uuid + '/') 
    sys.stdout.write(' exists with status=' + result.status + '.') 

    if result.status != 'S': 
     sys.stdout.write(' Fixing... ') 
     qp.put('v2/customer/' + uuid + '/', { 'status': 'S' }) 
     sys.stdout.write('done.') 

    sys.stdout.write('\n') # <- This is where the error occurs 

ci sono solo spazi utilizzati, senza schede. L'indentazione sembra davvero soddisfacente. Non ho trovato nulla di utile su questo online; ogni singola risposta cita incoerenza tab/spazio o trova qualcosa di sbagliato con la rientranza stessa, ma in questo caso, davvero non riesco a vedere quale potrebbe essere il problema.

Sto utilizzando Vim come editor, nel caso in cui sia importante.

Grazie in anticipo.

+0

controllare se si dispone di spazi misti e schede .... – avasal

+0

Come ho detto nella descrizione, l'ho già verificato. Questa non è incoerenza tab/spazio. Domanda aggiornata per evidenziare quella parte. – Teekin

+0

Generalmente si tratta di formattazione, non si stanno davvero mescolando tab e spazi? Prova a riscrivere, copia questo codice da qualche altra parte e verifica se l'errore persiste. – nathan

risposta

8

UPDATE

alla fine ho trovato il motivo per cui il problema si è verificato molto tempo dopo ho scoperto come ottenere lo passò. Il problema si è verificato perché stavo inserendo i dati nella shell di Django. Era qualcosa per l'effetto di "./manage.py shell < some_file.py" anche se non ricordo le specifiche dell'ambiente. Oggi vorrei creare un comando Django personalizzato ([appname]/management/commands/some_command.py) ed eseguire ./manage.py some_command ma al momento ho avuto questo problema, non ero a conoscenza di tale opzione.

Suppongo che abbia qualcosa a che fare con il modo in cui la shell del sistema operativo (ad esempio Bash, non Django o Python) interpreta gli spazi e le schede durante il piping del testo. Trovo ancora strano il luogo segnalato dell'errore.

Quello che segue è la mia risposta originale, inclusa la frustrazione.

risposta originale/soluzione

Beh, che sicuramente è stato frustrante. Ma ho trovato la risposta, per quanto sciocca.

Come tutti sappiamo, è perfettamente ok avere linee vuote tra le istruzioni in Python.Per esempio, questo dovrebbe essere a posto:

if True: 
    something = 'whatever' 

    #the line above here does NOT contain spaces, it's just a newline 
    another_thing = something 

eccezione, a quanto pare, a volte Python decide che è importante, solo per dispetto.

Ovviamente, quando ho posto la domanda, avevo già provato (più volte) a togliere la linea vuota sopra la linea di offesa, e avevo anche provato a indentarla anche se non avrebbe dovuto importare. Nessuno dei due ha funzionato.

Ma il problema inizia effettivamente nella riga sotto sys.stdout.write(' exists with status=' + result.status + '.'). Questo è ciò che fa scattare il problema con la seconda riga vuota, che a sua volta fa lamentare Python su quello sotto, apparentemente perché dire allo sviluppatore della linea corretta sarebbe ... troppo semplice, immagino.

for uuid in uuids: 
    sys.stdout.write('Checking \'' + uuid + '\'...') 
    result = qp.get('v2/customer/' + uuid + '/') 
    sys.stdout.write(' exists with status=' + result.status + '.') 

    # The line above this comment must have " " 
    if result.status != 'S': 
     sys.stdout.write(' Fixing... ') 
     qp.put('v2/customer/' + uuid + '/', { 'status': 'S' }) 
     sys.stdout.write('done.') 

    # The line above this comment must also have " " 
    sys.stdout.write('\n') # <- This is where Python, idiotically enough, complains. 

Questo a volte capita. Non ho mai dovuto farlo prima e non so perché Python lo voglia in questo modo in questo caso.

Ovviamente, tutto questo è chiaramente assurdo, ma ci vai. Questa è la soluzione. Se questo accade a te, riempi tutte le linee vuote con indentazione.

+0

Non riesco a riprodurre la necessità di avere una linea distanziata lì in qualsiasi versione di Python; questo è un bug molto oscuro o hai erroneamente diagnosticato il problema. Cosa restituisce 'python -tt nomefile.py 'sul codice originale che non funziona? – DSM

+0

Sì, mi sto abituando a nessuno che crede a una parola che dico quando si tratta dei miei problemi con Python, ma giuro su Dio, la descrizione nella domanda è corretta, sono certo degli spazi bianchi e sono certo che questo è ciò che l'ha risolto Chi non mi crede dovrà solo non credermi, non mi interessa nemmeno più. Per me, è chiaramente un bug oscuro. – Teekin

+4

È certamente vero che potresti essere al 100% giusto e semplicemente nella sfortunata posizione di (1) avere un insetto con sintomi che assomigliano a un errore che abbiamo visto tutti un milione di volte, e (2) essere riluttanti a fornire le informazioni necessarie per le persone a giudicare se hai ragione o no. Mi è successo una volta: semplicemente non ho avuto il tempo di dare alle persone le informazioni di cui avevano bisogno per vedere che avevo ragione. (E ho delle patch nel core di Python, quindi sono certamente disposto a credere nei bachi Python.) Ma non dovresti essere sorpreso se le persone traggano la conclusione più semplice. – DSM

0

Questo potrebbe essere un problema strano con il software di editor di testo.

Ho sperimentato questo in passato e per risolvere I eliminare tutte le rientranze e reindent con spazi, non schede.

+0

Già fatto. Ecco perché sono spazi. :) – Teekin

+0

quale editor stai usando? – rikAtee

+0

Vim. Ho anche provato varie cose con Sublime Text 2 (Mac OS) – Teekin

2

Sembra che sia necessario aggiungere spazi alle linee vuote. È possibile osservare questo cercando il seguente codice:

non funziona:

for uuid in uuids: 
    sys.stdout.write('Checking \'' + uuid + '\'...') 
    result = qp.get('v2/customer/' + uuid + '/') 
    sys.stdout.write(' exists with status=' + result.status + '.') 
# 
    if (result.status != 'S'): 
     sys.stdout.write(' Fixing... ') 
     qp.put('v2/customer/' + uuid + '/', { 'status': 'S' }) 
     sys.stdout.write('done.') 
# 
    sys.stdout.write('\n') # <- This is where the error occurs 

Works:

for uuid in uuids: 
    sys.stdout.write('Checking \'' + uuid + '\'...') 
    result = qp.get('v2/customer/' + uuid + '/') 
    sys.stdout.write(' exists with status=' + result.status + '.') 
    # 
    if (result.status != 'S'): 
     sys.stdout.write(' Fixing... ') 
     qp.put('v2/customer/' + uuid + '/', { 'status': 'S' }) 
     sys.stdout.write('done.') 
    # 
    sys.stdout.write('\n') # <- This is where the error occurs 

spiegazione possibile: osservare la differenza nella rientranza di quanto sopra codici alle due righe vuote in cui ho aggiunto i simboli di commento (#). Sembra che le righe contenenti solo spazi non siano gestite correttamente dall'editor di questo sito web. Infatti, se ricopro lo stesso codice come sopra (quello che funziona), perdo il rientro (una volta che la mia risposta è stata postata o nella finestra di anteprima dell'editor) sulle 2 linee che contengono solo spazi. Provare per credere:

si aspetterebbe a questo lavoro (ma non è così):

for uuid in uuids: 
    sys.stdout.write('Checking \'' + uuid + '\'...') 
    result = qp.get('v2/customer/' + uuid + '/') 
    sys.stdout.write(' exists with status=' + result.status + '.') 

    if (result.status != 'S'): 
     sys.stdout.write(' Fixing... ') 
     qp.put('v2/customer/' + uuid + '/', { 'status': 'S' }) 
     sys.stdout.write('done.') 

    sys.stdout.write('\n') # <- This is where the error occurs 

Questo forse può essere fissato evitando righe di codice che contengono uno spazio unico bianco durante la copia/invio domanda/risposta da questo sito, anche se questo non è molto pratico. Ad esempio:

funziona di nuovo

for uuid in uuids: 
    sys.stdout.write('Checking \'' + uuid + '\'...') 
    result = qp.get('v2/customer/' + uuid + '/') 
    sys.stdout.write(' exists with status=' + result.status + '.') 
    if (result.status != 'S'): 
     sys.stdout.write(' Fixing... ') 
     qp.put('v2/customer/' + uuid + '/', { 'status': 'S' }) 
     sys.stdout.write('done.') 
    sys.stdout.write('\n') # <- This is where the error occurs 

Presumo solo quello che sto dicendo, e so che potrei sbagliarmi. Tuttavia, spero che questo aiuti.

+0

Sì, è quello che ha finito per essere, come per la risposta che ho messo dentro di me una volta che l'avevo capito. La cosa strana è che non ho mai visto questo essere richiesto in Python prima. Spero che un giorno scoprirò perché esattamente lo vuole in questo modo questa volta. – Teekin