← На главную

Python: в f-строках полный парсер, а raw-строки не кончаются слэшем

06.08.2026 04:44 · hackernews

Вот задачка из поста: какая из этих строк валидна в Python и что окажется в итоговой строке? Первая — r'asdf\' — даёт SyntaxError. Вторая — r'asdf\'' — валидна, значение строки — asdf\' (обратный слэш и кавычка). Префикс r включает raw string literal, поэтому обратные слэши не интерпретируются. Но лексер по-прежнему разбирает raw-строку теми же правилами, что и обычную. Отсюда ограничение: raw-строка не может заканчиваться обратным слэшем. После такого слэша следующая кавычка не считается концом строки, хотя формально она и не «экранирована». Автор замечает, что такое поведение явно появилось ради простоты реализации, — и из-за этого смешнее выглядит то, что будет дальше.

Теперь про f-строки. Чтобы разобрать выражение в фигурных скобках, Python вызывает полноценный парсер языка. Внутри {...} могут быть кавычки, переносы строк и даже комментарии. Выражение заканчивается только на закрывающую }, ! или :, которые при этом не находятся внутри скобок и не спрятаны в комментарий. Поэтому рабочая конструкция f'{'}'}' возвращает строку из одной }. А f'{67#}' с продолжением на следующей строке — тоже валидная f-строка: # комментирует закрывающую скобку на первой строке, и выражение доходит до } на второй. Результат — '67'.

Из-за того, что выражение может оборваться на :, lambda-выражения и walrus-операторы внутри f-строк обязаны быть в скобках. f'{lambda: 67}' — ошибка, а f'{x := 67}' работает примерно как f'{x}'.

Читать оригинал →