Pergunta

Por que a função eval não funciona com \ r \ n mas com \ n. por exemplo eval ( "for i in range (5): \ r \ n print 'Olá'") não funciona eval ( "for i in range (5): \ n print 'Olá'") funciona

Eu sei que não é um problema causa usando substituir ( "\ r", "") for corrigido, mas alguém sabe por que acontece?

- Edit-- Oh! desculpe, exatamente, eu quis dizer exec. retornos de carro apareceu porque eu estou lendo a partir de um textarea HTML via POST (eu estou em uma caixa de Linux). agora é mais claro, graças a todos.

Foi útil?

Solução

Você tem uma definição estranha de "trabalho":

>>> 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
>>> 

Eu não sei por que você está usando eval - Eu suspeito que você exec média. Expressões e afirmações são drasticamente diferentes entidades em Python -. eval só lida com expressões (a expressão nua é também uma declaração, de modo exec pode lidar com isso, bem como outras declarações)

Virando-se para exec, e ponderando a situação como um núcleo committer Python, eu acho que é um menor mis-design: just like (redundante e inútil) espaços, tabulações e forma alimenta pouco antes de uma nova linha são aceitos e ignorados, assim se (apenas como redundante e inútil) símbolos de retorno ser. Peço desculpas: Eu acho que nós nunca considerou que alguém possa deseja para colocar retornos de carro lá - mas, em seguida, não faz mais sentido ter, por exemplo, forma alimenta lá, e nós não aceitamos que ... então eu não vejo nenhuma razão para rejeitar retornos de carro (ou outros espaços em branco não-Unicode ANSI, quer, agora que em Python 3 aceitamos arbitrária Unicode não- ANSI alfanuméricos em identificadores).

Se você se importa, por favor, abra um problema no issue tracker do Python, e (com exceção de oposição imprevisto por outros commiters) Eu acho que posso obtê-lo fixo por Python 3.2 (que deve sair em 12 a 18 meses - isso é uma estimativa [palpite informado], não uma promessa; -).

Outras dicas

Você eval média ou exec? Por favor, poste exatamente o que você correu, mais o rastreamento e mensagem de erro completo.

O problema é provavelmente porque a gramática do Python diz que as linhas são terminados por novas linhas ( '\ n'), não a sequência de dois caracteres '\ r \ n'.

Em geral, seria mais seguro para você usar replace ( '\ r \ n', '\ n') no caso de haver uma significativa '\ r' em algum lugar. Seria melhor se você não tem o '\ r' lá em primeiro lugar ... como é que você obter o texto - leitura binário em uma caixa de Windows ??

Falando sobre segurança, você deve ser cuidadoso sobre o uso de eval ou exec em qualquer código antigo obtida a partir de um possível inimigo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top