Необработанная буквенная строка Python

str = r'c:\path\to\folder\'   # my comment
  • IDE: Затмение
  • python2.6

Когда последний символ в строке является обратной косой чертой, создается впечатление, что он уходит от последней одинарной кавычки и рассматривает мой комментарий как часть строки. Но необработанная строка должна игнорировать все escape-символы, верно? Что может быть не так? Благодарю.

2 ответа

Решение

Необработанные строковые литералы не обрабатывают обратную косую черту как инициирующую escape-последовательность, за исключением случаев, когда непосредственно следующий символ является символом кавычки, который разделяет литерал, и в этом случае обратный слеш экранирует его.

Мотивация проектирования заключается в том, что необработанные строковые литералы действительно существуют только для удобства ввода шаблонов регулярных выражений - и все, никакой другой цели проектирования для таких литералов не существует. И шаблоны RE никогда не должны заканчиваться обратной косой чертой, но они могут включать в себя все виды символов кавычек, откуда правило.

Многие люди пытаются использовать необработанные строковые литералы, чтобы позволить им вводить пути Windows так, как они привыкли (с обратной косой чертой) - но, как вы заметили, это использование ломается, когда вам нужен путь, заканчивающийся обратной косой чертой. Как правило, самое простое решение - использовать прямые косые черты, которые среда выполнения C Microsoft и все версии Python поддерживают как полностью эквивалентные по путям:

s = 'c:/path/to/folder/'

(примечание: не скрывайте встроенные имена, такие как str с вашими собственными идентификаторами - это ужасная практика, без каких-либо улучшений, и если вы не привыкнете избегать этой ужасной практики, однажды вы обнаружите, что столкнулись с проблемой неприятного отладки, когда какая-то часть вашего кода попирает над встроенным именем, и другая часть должна использовать встроенное имя в его реальном значении).

Это IMHO несоответствие в Python, но это описано в документации. Перейти ко второму последнему абзацу:

http://docs.python.org/reference/lexical_analysis.html

r"\" не является допустимым строковым литералом (даже необработанная строка не может заканчиваться нечетным числом обратных косых черт)

Другие вопросы по тегам