\ r \ n vs \ n в функции python eval - PullRequest
4 голосов
/ 30 июля 2009

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

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

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

Ответы [ 2 ]

6 голосов
/ 30 июля 2009

У вас есть странное определение «работа»:

>>> 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, я думаю, что это незначительное заблуждение: точно так же, как (избыточные и бесполезные) пробелы, табуляции и фиды форм непосредственно перед тем, как NEWLINE принимаются и игнорируются, так должно быть (так же, как избыточно и бесполезно) возврат каретки. Я прошу прощения: я думаю, что мы никогда не думали, что кто-то может хочет поставить туда возврат каретки - но тогда нет смысла, например, иметь. там есть каналы, и мы принимаем , что ... поэтому я не вижу смысла отклонять возврат каретки (или другие пробелы, не являющиеся ANSI Unicode, теперь, когда в Python 3 мы принимаем произвольный Unicode не ANSI буквенно-цифровые символы в идентификаторах).

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

1 голос
/ 30 июля 2009

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

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

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

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

...