Python 3.14.7: imaplib пропускает лишнюю пустую строку после literal. Практическая инструкция отделяет симптом от соседних причин: синтетический fixture, отрицательный control, таблица наблюдений, критерий остановки и минимальный пакет для поддержки без production-данных.
Узкая граница исправления
Прямой ответ относится к одной границе: imaplib пропускает spurious blank line после literal, включая literal, завершающий response, не проглатывая следующую строку. Практический симптом, который надо отличить от соседних причин: Некоторые IMAP-серверы вставляют лишнюю blank line после counted literal, и клиент раньше завершал разбор ошибкой либо мог потерять следующую строку ответа. Поэтому статья не предлагает угадывать по названию модуля. Она отвечает на намерение «как проверить imaplib при пустой строке после literal response в Python 3.14.7» через короткий A/B-протокол, где отрицательный control важнее совпавшего текста ошибки. Массовость проблемы и пригодность обновления для конкретного проекта источниками не установлены.
Паспорт наблюдения
Паспорт наблюдения T22-22 начинается не с обновления, а с воспроизводимого шага: поднять локальный socket stub, вернуть LIST response с counted literal, одной лишней CRLF и следующей tagged line, затем вызвать только read-only list(). Запускайте его в temp root, child process, pty, локальном stub или VM — в зависимости от требуемой поверхности. Назначьте лимит времени и ресурсов до старта. Сохраните только измеримые поля, а не полный environment dump; если нужная сборка, display, libc или optional module отсутствует, пометьте environment blocker и не имитируйте результат.
Сравнение без догадки
Не принимайте один удачный case. Выполните независимую ветку: сравнить протокольный ответ без лишней строки, ответ с blank line внутри literal и ответ с двумя лишними строками как отрицательный case. Таблица наблюдений: «wire variant | literal length | parsed mailboxes | tagged result | unread bytes | exception | next line preserved». Сравнивайте не впечатление, а тип результата, состав данных и границы времени. Повторите отрицательный control после target-ветки; расхождение говорит о скрытом состоянии, а не об исправлении Python.
Правило зелёной ветки
Решение принимается по правилу: одна spurious blank line игнорируется, mailbox parsed, tagged line остаётся целой; искажённый control не маскируется как успех. Не путайте его с «процесс не упал» или «текст ошибки другой». Если target чист, но control не различает две гипотезы, добавьте наблюдение, а не новую статью. Если обновление меняет ещё зависимости, такой прогон не изолирует gh-88574; сначала восстановите одинаковую среду.
Красные флаги
Остановите опыт при первом условии: не подключаться к реальному mailbox и не использовать credential; закрыть stub при команде вне LIST или несовпадении declared length. Не продолжайте после crash ради «ещё одного подтверждения». Верните среду к baseline: закройте socket/pty, уничтожьте root, завершите только созданный child, удалите temp fixture и проверьте resource inventory. Если rollback нельзя доказать, материал остаётся кандидатом и не должен публиковаться как прошедший проверку.
Минимальный тикет
Минимальный тикет состоит из: версия Python, обезличенный wire transcript, declared/actual literal length, parsed tuple и признак сохранённой tagged line. Отдельно приложите строки control/target/repeat и отметьте, на какой фазе возникло отклонение. Не присылайте реальные payload, credential или полный crash dump. Такой пакет позволяет воспроизвести границу gh-88574 без доступа к вашей инфраструктуре.
Материал подготовлен редакцией VOne с помощью ИИ по открытым официальным и первичным источникам; факты, даты и ссылки перепроверены. Реальные пользовательские данные не использовались.
Источники и проверка
- Python 3.14.7 release проверено 2026-08-29
- Python 3.14.7 changelog проверено 2026-08-29
- CPython issue #88574 проверено 2026-08-29
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.