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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top