Вопрос

Почему функция eval работает не с \ n, а с .например eval("для i в диапазоне (5): выведите 'hello'") не работает eval("для i в диапазоне (5): напечатать 'hello'") работает

Я знаю, что проблемы нет, потому что использование replace("\ r","") исправлено, но кто-то знает, почему это происходит?

--Редактировать-- О!извините, именно так, я имел в виду exec.Возврат каретки появился, потому что я читаю из текстовой области HTML через POST (я нахожусь в Linux box).теперь это стало понятнее, спасибо всем.

Это было полезно?

Решение

У вас странное определение понятия "работа".:

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

Я не уверен, почему вы используете eval -- Я подозреваю , что ты имеешь в виду exec.Выражения и инструкции - это совершенно разные сущности в Python -- eval имеет дело только с выражениями (голое выражение является также утверждение, так что exec может иметь дело с этим так же, как и с другими утверждениями).

Обращаясь к exec, и, обдумывая ситуацию как коммиттер ядра Python, я думаю, что это незначительная ошибка в дизайне:точно так же, как (избыточные и бесполезные) пробелы, табуляции и каналы формы непосредственно перед НОВОЙ строкой принимаются и игнорируются, так и должны быть (столь же избыточные и бесполезные) возвраты каретки.Я приношу свои извинения:Я думаю, мы никогда не задумывались о том, что кто-то может хотеть поместить туда возвраты каретки - но тогда больше не имеет смысла иметь, напримерформа подается туда, и мы принимаем это...поэтому я не вижу смысла отклонять возврат каретки (или другие пробелы в Юникоде, отличные от ANSI, теперь, когда в Python 3 мы принимаем произвольные буквенно-цифровые символы Юникода, отличные от ANSI, в идентификаторах).

Если вам не все равно, пожалуйста, откройте проблему в системе отслеживания проблем Python и (за исключением непредвиденного противодействия со стороны других коммиттеров) Я думаю, что смогу исправить это с помощью Python 3.2 (который должен выйти через 12-18 месяцев - это оценка [обоснованное предположение], а не обещание;-).

Другие советы

Вы имеете в виду eval или exec?Пожалуйста, опубликуйте именно то, что вы запустили, плюс полную обратную трассировку и сообщение об ошибке.

Вероятно, проблема заключается в том, что грамматика Python гласит, что строки заканчиваются символами новой строки (' '), а не двухсимвольной последовательностью ' \ n'.

В общем, для вас было бы безопаснее использовать replace(' ', ' ') на случай, если где-то там есть значимое ' '.Было бы лучше , если бы у вас там вообще не было буквы "\ r" ...как вы получаете текст - двоичное чтение в окне Windows??

Говоря о безопасности, вы должны быть осторожны при использовании eval или exec для любого старого кода, полученного от возможного врага.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top