Domanda

Perché la funzione eval non funziona con \ r \ n ma con \ n. per esempio eval (" for i in range (5): \ r \ n print 'hello' ") non funziona eval (" for i in range (5): \ n print 'hello' ") funziona

So che non c'è un problema perché l'uso di un sostituto (" \ r ", " ") è corretto, ma qualcuno sa perché succede?

- Edit-- Oh! scusa, esattamente, intendevo dire. I ritorni a capo sono apparsi perché sto leggendo da una textarea HTML tramite POST (sono su un box Linux). ora è più chiaro, grazie a tutti.

È stato utile?

Soluzione

Hai una strana definizione di " lavoro " ;:

>>> eval("for i in range(5):\n print 'hello'")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    for i in range(5):
      ^
SyntaxError: invalid syntax
>>> 

Non sono sicuro del motivo per cui stai usando eval - sospetto che tu intenda exec . Le espressioni e le dichiarazioni sono entità drasticamente diverse in Python - eval si occupa solo di espressioni (un'espressione nuda è anche un'istruzione, quindi exec può gestire con esso così come altre dichiarazioni).

Passando a exec , e riflettendo sulla situazione come committer principale di Python, penso che sia un piccolo errore di progettazione: proprio come spazi, schede e feed (ridondanti e inutili) appena prima di una NEWLINE sono accettati e ignorati, così come dovrebbero essere (altrettanto ridondanti e inutili) i resi di trasporto. Chiedo scusa: penso che non avremmo mai considerato che qualcuno potesse volere inserire lì i ritorni in carrozza - ma poi non ha più senso avere ad es. il modulo si nutre lì, e accettiamo che ... quindi non vedo alcuna logica per rifiutare i ritorni a capo (o altri spazi bianchi non ANSI Unicode, ora, ora che in Python 3 accettiamo non Unicode arbitrario Alfanumerici ANSI negli identificatori).

Se ti interessa, ti preghiamo di aprire un problema sul tracker dei problemi di Python e (salvo l'opposizione imprevista di altri committenti) Penso di poterlo risolvere da Python 3.2 (che dovrebbe essere pubblicato tra 12 e 18 mesi - è una stima [ipotesi informata], non una promessa ;-).

Altri suggerimenti

Intendi eval o exec? Pubblica esattamente ciò che hai eseguito, oltre al traceback completo e al messaggio di errore.

Il problema è probabilmente dovuto al fatto che la grammatica di Python dice che le linee sono terminate da newline ('\ n'), non dalla sequenza di due caratteri '\ r \ n'.

In generale, sarebbe più sicuro per te utilizzare replace ('\ r \ n', '\ n') nel caso in cui ci sia un '\ r' significativo da qualche parte. Sarebbe meglio se non avessi il '\ r' lì in primo luogo ... come stai ottenendo il testo - lettura binaria su una finestra di Windows ??

Parlando di sicurezza, dovresti stare attento a usare eval o exec su qualsiasi vecchio codice ottenuto da un possibile nemico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top