Вопрос
Почему функция 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 для любого старого кода, полученного от возможного врага.