\ r \ n vs \ n en la función eval de python
Pregunta
Por qué la función eval no funciona con \ r \ n sino con \ n. por ejemplo eval (" for i in range (5): \ r \ n print 'hello' ") no funciona eval (" for i in range (5): \ n print 'hello' ") funciona
Sé que no hay un problema porque se corrige el reemplazo (" \ r ", " "), pero alguien sabe por qué sucede.
--Editar-- Oh! lo siento, exactamente, quise decir exec Los retornos de carro aparecieron porque estoy leyendo de un área de texto HTML a través de POST (estoy en una caja de Linux). ahora está más claro, gracias a todos.
Solución
Tienes una definición extraña de " trabajo " ;:
>>> 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
>>>
No estoy seguro de por qué estás usando eval
. Sospecho que te refieres a exec
. Las expresiones y las declaraciones son entidades drásticamente diferentes en Python: eval
solo trata con expresiones (una simple expresión es también es una declaración, por lo que exec
puede tratar con él, así como otras declaraciones).
Pasando a exec
, y considerando la situación como un intercambiador de Python, creo que es un pequeño error de diseño: al igual que los espacios, las pestañas y los feeds de formularios (redundantes e inútiles) justo antes de un NEWLINE son aceptados e ignorados, por lo que los retornos de carro deben ser (igual de redundantes e inútiles). Me disculpo: creo que nunca consideramos que alguien podría querer colocar retornos de carro allí, pero entonces, no tiene más sentido tenerlo, por ejemplo. la fuente se alimenta allí, y aceptamos eso ... así que no veo ninguna razón para rechazar los retornos de carro (u otro espacio en blanco Unicode no ANSI, tampoco, ahora que en Python 3 aceptamos Unicode arbitrario Alfanuméricos ANSI en identificadores).
Si te importa, abre un problema en el rastreador de problemas de Python, y (a menos que haya una oposición imprevista por parte de otros participantes), creo que puedo solucionarlo con Python 3.2 (que debería estar disponible en 12 a 18 meses, eso es una estimación [suposición informada], no una promesa ;-).
Otros consejos
¿Quieres decir eval o exec? Por favor, publique exactamente lo que ejecutó, más el rastreo completo y el mensaje de error.
El problema probablemente se deba a que la gramática de Python dice que las líneas se terminan con líneas nuevas ('\ n'), no la secuencia de dos caracteres '\ r \ n'.
En general, sería más seguro para usted usar replace ('\ r \ n', '\ n') en caso de que haya un '\ r' significativo en algún lugar. Sería mejor si no tuvieras el '\ r' allí en primer lugar ... ¿cómo obtienes el texto - lectura binaria en una caja de Windows?
Hablando de seguridad, debes tener cuidado al usar eval o exec en cualquier código antiguo obtenido de un posible enemigo.