Как проверить, работает ли устаревший API из технической статьи
Когда в технической статье упоминается устаревший API, проследите конкретный символ по версионной документации проекта, примечаниям к выпуску и инструкциям по миграции. Статус «устаревший» (deprecated) означает, что мейнтейнеры наметили API к замене или будущему удалению; сам по себе он не означает, что API уже удален. Подтвердите версию, в которой появилось предупреждение, а затем проверьте более поздние примечания к выпуску на предмет удаления и документированной замены. Наглядным примером служит `django.conf.urls.url()` в Django: в Django 3.1 он был объявлен устаревшим в пользу `django.urls.re_path()`, а в Django 4.0 — полностью удален.
Начните с точного API и версии
Зафиксируйте библиотеку, полный путь импорта или имя метода, а также версию, на которую ориентирована статья. Одно лишь имя может быть неоднозначным: пакеты могут содержать API с похожими именами, а статья может ссылаться на старую версию, даже если в текущей документации описана более новая. Проверьте импорты в примере кода и окружающий контекст, чтобы определить фактический символ.
Затем найдите официальную документацию для версии, указанной в статье. Ищите статусные метки, такие как «deprecated» (устарело), «removed» (удалено) или «backwards incompatible» (несовместимо с предыдущими версиями). После этого сравните ее с документацией для версии, которую будет использовать читатель. Страница текущей документации может полностью опускать старый API, поэтому его отсутствие там — это повод для расследования, а не доказательство того, когда или почему он исчез.
Используйте примечания к выпуску для построения хронологии
Примечания к выпуску связывают изменение с конкретным релизом. В [примечаниях к выпуску Django 3.1](https://docs.djangoproject.com/en/3.1/releases/3.1/) мейнтейнеры указывают `django.conf.urls.url()` как устаревший и называют `django.urls.re_path()` в качестве альтернативы. В [примечаниях к выпуску Django 4.0](https://docs.djangoproject.com/en/4.0/releases/4.0/) этот же API появляется среди функций, удаленных после завершения цикла устаревания. Эти две записи задают последовательность: объявлен устаревшим в 3.1, удален в 4.0.
Не делайте выводов о дате релиза или сроках удаления на основе уведомления об устаревании, если проект прямо их не указывает. Проекты по-разному подходят к тому, как долго они сохраняют устаревшие интерфейсы, и некоторые поддерживают совместимость в течение длительного времени. Когда в примечаниях к выпуску говорится, что API удален, проверьте, относится ли запись ко всему API или содержит исключения. Например, в Django 4.0 указано, что `NullBooleanField` был удален, за исключением поддержки в исторических миграциях. Это исключение важно для мейнтейнеров, работающих со старыми файлами миграций.
Проверьте руководство по миграции перед изменением кода
Замена может выглядеть похожей, но иметь другое поведение или требования. Перейдите на страницу миграции по ссылке из примечаний к выпуску, а затем изучите версионный справочник для предлагаемой замены. В [руководстве по обновлению версий](https://docs.djangoproject.com/en/4.0/howto/upgrade-version/) Django рекомендуется устранить предупреждения об устаревании на текущей версии, прежде чем продолжать обновление. Этот совет превращает поверхностную проверку документации в практическую последовательность действий: обновляйтесь в рамках поддерживаемых шагов, выявляйте предупреждения, исправляйте их использование в собственном проекте и только после этого переходите на версию, где применяется удаление.
В примере с URL-адресами Django документированной заменой является `re_path()`. Проверьте путь импорта и поведение по документации для целевой версии. Эти исторические релизы иллюстрируют процесс изменений; это не рекомендация устанавливать их сегодня.
Разграничивайте понятия «устаревший», «удаленный» и «доступный»
Используйте точные формулировки статуса:
Не делайте вывод о текущей поддержке только потому, что пример запускается в одной конкретной среде. Убедитесь, что именно целевая версия документирует его как доступный, и проверьте наличие уведомлений об устаревании в более поздних версиях. Доступность в старом релизе не доказывает, что этот релиз все еще поддерживается.
Стандартная библиотека Python наглядно показывает, почему номера версий имеют значение. В [заметках «Что нового» в Python 3.9](https://docs.python.org/3/whatsnew/3.9.html) указано, что такие псевдонимы, как `collections.Mapping`, выдавали `DeprecationWarning`, начиная с Python 3.3, и что Python 3.9 стал последней версией, предоставляющей эти псевдонимы для обратной совместимости. В тех же заметках рекомендуется проводить тестирование с параметрами предупреждений для выявления устаревших компонентов. Статья, в которой `collections.Mapping` назван просто «устаревшим» без указания версии Python, не позволяет читателям понять, столкнутся ли они с предупреждением или с отсутствующим атрибутом. Отдавайте предпочтение документированному расположению `collections.abc` и проверяйте его статус в примечаниях к целевому выпуску Python.
Превратите результаты проверки в редакторское решение
Проследив всю цепочку, выберите одно действие для статьи. Если в документации указано, что пример доступен в описанной среде, точно укажите версию и статус. Если он устарел, но доступен, четко укажите это, приведите замену и объясните, к какой версии читателям нужно готовиться. Если он удален, обновите код и укажите первый релиз, где он стал недоступен; сохраняйте историческую справку только тогда, когда она необходима читателям для понимания более старых проектов.
Краткая подтверждающая запись помогает избежать двусмысленности в будущем: зафиксируйте точное имя API, самый ранний релиз с объявлением об устаревании, релиз с удалением (если применимо), замену и URL-адреса официальных документов. Если официальные источники не указывают версию удаления или замену, укажите, что статус не определен, вместо того чтобы заполнять пробел скопированным фрагментом или непроверенной статьей. В результате получается исправление с привязкой к конкретной версии, которое читатели могут применить на практике, а не абстрактное утверждение о том, что API просто «старый».
