Python 3.14.7: ForwardRef в STRING-формате не показывает внутренние имена. Практическая инструкция отделяет симптом от соседних причин: синтетический fixture, отрицательный control, таблица наблюдений, критерий остановки и минимальный пакет для поддержки без production-данных.
Узкая граница исправления
Прямой ответ относится к одной границе: Исправлена утечка внутренних имён annotation machinery при typing.evaluate_forward_ref() с форматом STRING. Практический симптом, который надо отличить от соседних причин: Инструмент документации или схем вызывает evaluate_forward_ref() в STRING-формате и вместо исходной аннотации получает служебное имя механизма typing. Поэтому статья не предлагает угадывать по названию модуля. Она отвечает на намерение «как проверить отсутствие внутренних имён typing при evaluate_forward_ref format STRING в Python 3.14.7» через короткий A/B-протокол, где отрицательный control важнее совпавшего текста ошибки. Массовость проблемы и пригодность обновления для конкретного проекта источниками не установлены.
Паспорт наблюдения
Паспорт наблюдения T22-07 начинается не с обновления, а с воспроизводимого шага: создать локальный ForwardRef с одним известным пользовательским идентификатором, вызвать STRING-ветку без импорта сторонних модулей и сохранить только repr и тип результата. Запускайте его в temp root, child process, pty, локальном stub или VM — в зависимости от требуемой поверхности. Назначьте лимит времени и ресурсов до старта. Сохраните только измеримые поля, а не полный environment dump; если нужная сборка, display, libc или optional module отсутствует, пометьте environment blocker и не имитируйте результат.
Сравнение без догадки
Не принимайте один удачный case. Выполните независимую ветку: сравнить простую строковую аннотацию, вложенную generic-аннотацию и заведомо неизвестное имя в трёх новых namespaces. Таблица наблюдений: «форма аннотации | format | result type | нормализованный result | внутренний prefix найден | класс исключения». Сравнивайте не впечатление, а тип результата, состав данных и границы времени. Повторите отрицательный control после target-ветки; расхождение говорит о скрытом состоянии, а не об исправлении Python.
Правило зелёной ветки
Решение принимается по правилу: результат сохраняет пользовательскую форму или честную ошибку, но не раскрывает приватные имена implementation machinery. Не путайте его с «процесс не упал» или «текст ошибки другой». Если target чист, но control не различает две гипотезы, добавьте наблюдение, а не новую статью. Если обновление меняет ещё зависимости, такой прогон не изолирует gh-150641; сначала восстановите одинаковую среду.
Красные флаги
Остановите опыт при первом условии: не передавать рабочие globals/locals и не исполнять недоверенные аннотации; остановиться, если опыт требует import hook или eval чужого текста. Не продолжайте после crash ради «ещё одного подтверждения». Верните среду к baseline: закройте socket/pty, уничтожьте root, завершите только созданный child, удалите temp fixture и проверьте resource inventory. Если rollback нельзя доказать, материал остаётся кандидатом и не должен публиковаться как прошедший проверку.
Минимальный тикет
Минимальный тикет состоит из: версия Python, три обезличенные аннотации, выбранный format, тип результата, список обнаруженных служебных prefix без значений namespace. Отдельно приложите строки control/target/repeat и отметьте, на какой фазе возникло отклонение. Не присылайте реальные payload, credential или полный crash dump. Такой пакет позволяет воспроизвести границу gh-150641 без доступа к вашей инфраструктуре.
Материал подготовлен редакцией VOne с помощью ИИ по открытым официальным и первичным источникам; факты, даты и ссылки перепроверены. Реальные пользовательские данные не использовались.
Источники и проверка
- Python 3.14.7 release проверено 2026-08-29
- Python 3.14.7 changelog проверено 2026-08-29
- CPython issue #150641 проверено 2026-08-29
Информация актуальна на дату публикации. Правила сервисов, приложений и сетей могут меняться.