Перейти к содержанию

Примечания к миграции с 1.0.3 на 2.0.0

Здесь описан подготовленный кандидат 2.0.0; стабильный релиз по-прежнему требует проверки готовности человеком. Материал дополняет журнал изменений, руководство по совместимости и исполняемые примеры перехода с исторического API на современный.

Перед обновлением

Используйте CPython 3.13 или 3.14 и проверяйте приложение на его фактическом интерпретаторе. Python 3.12 и более ранние версии не входят в обещание поддержки v2. Исторический классификатор Python 3.6 не переносится. Метаданные пакета теперь задаёт pyproject.toml; используются стандартные сборки wheel и исходного дистрибутива. Исторический setup.py больше не отвечает за генерацию версии.

Текущий код, принадлежащий проекту, использует Apache-2.0 вместо исторической лицензии MIT. При распространении сохраняйте LICENSE, NOTICE, применимые сведения об авторских правах и указания авторства. Неизменяемая база 1.0.3 сохраняет исходную лицензию. См. лицензирование и происхождение.

Импорты и исторические вызовы

Продолжайте импортировать исторические классы и операторы из fuzzyroutines.FuzzyRoutines. Корневой пакет fuzzyroutines предоставляет отобранный современный API. Экспорт фасада через звёздочку содержит пятнадцать поддерживаемых функций и классов, а не все импортированные вспомогательные объекты. Приложения, ранее получавшие math, copy или другие вспомогательные модули через такой импорт, должны импортировать эти модули стандартной библиотеки напрямую; атрибуты фасада math и copy также удалены.

Защищённые имена и формы вызова поддерживаются, включая Defuz(), Fuzzy(), GetLevelByName() и исторические идентификаторы функций принадлежности. Сохраняйте историческое соответствие треугольника a=left, b=right, c=peak. При переходе к современным фабрикам Triangle(left, peak, right) или Trapezoid преобразуйте параметры явно: перенос позиционных значений между соглашениями может изменить форму.

Выделение фасада сохраняет исторические модульные идентичности классов и функций; оно проверено сериализацией и десериализацией новых pickle и настоящим образцом, созданным до выделения. Это свидетельство совместимости выделения, а не произвольной переносимости pickle между версиями Python. Исторические имена и изменяемые словари уровней остаются наблюдаемыми; инвентаризация наблюдаемого интерфейса указывает имена с тестами сверх более узкого защищённого контракта ADR-0001.

Входные данные, теперь вызывающие явную ошибку

Проверьте ввод приложения до обновления: некорректные значения больше не дают внешне правдоподобный результат при ошибке. Следующие численные ограничения относятся к историческому фасаду; более широкий современный контракт MembershipScalar описан в политике конечных скаляров.

  • Скалярные степени принадлежности должны быть конечными int или float из [0, 1]. Логические значения, NaN, бесконечность, строки и массивоподобный ввод отклоняются.
  • Координаты принадлежности должны быть конечными небулевыми скалярами int или float; значения вне [0, 1] допустимы как координаты. Создание и замена параметров требуют ровно объявленных конечных параметров семейства и допустимой геометрии. Сохранённые изменяемые таблицы параметров не позволяют неявно вычислять повреждённое состояние как ноль.
  • Композиция с переменным числом аргументов требует хотя бы один операнд, проверяет каждый и отклоняет неизвестные семейства. FuzzyNOT требует alpha из (0, 1), а FuzzyNOTParabolic — из [1/4, 3/4].
  • Уровни шкалы должны иметь обязательные поля; имена, совпадающие при регистронезависимом поиске, отклоняются. Используйте уникальные полные имена, не полагаясь на неоднозначный поиск.

Исторические ошибки остаются конкретными встроенными исключениями. Современные категории доступны из fuzzyroutines.exceptions и сохраняют применимые перехваты TypeError, ValueError и ArithmeticError. Произвольные исключения пользовательских функций принадлежности распространяются без преобразования в ноль или переклассификации. См. PR #274 и реестр исправленных ошибок.

Численные результаты и сохранённые настройки

FuzzySet.Defuz() и defuzValue теперь пересчитываются по текущим параметрам принадлежности и границам supportSet. Границы — конечный интервал интегрирования, а не математическое множество поддержки. Аналитические моменты заменяют фиксированную выборку для поддерживаемых семейств; остальные вычислители используют адаптивное интегрирование. Обновите проверки, зависевшие от устаревшего центроида или удалённого результата метода правых прямоугольников на 1000 точках. Для записанных исторических контрольных случаев граница абсолютного сравнения равна 5e-4; это не универсальное обещание погрешности.

Нулевая площадь не имеет центроида и вызывает ValueError через исторический фасад вместо косвенного ZeroDivisionError старой выборочной суммы; обновите соответствующие обработчики исключений. Современные неопределённые результаты имеют явную категорию ошибок; неразрешившееся адаптивное интегрирование вызывает CentroidConvergenceError. Обрабатывайте ошибки, не подставляя середину интервала или старое кэшированное значение. Современная CentroidPolicy управляет точностью и объёмом работы. MFunction.accuracy остаётся доступным для записи, но игнорируется центроидом; сохранённый epsilon у FuzzyNOTParabolic больше не управляет аналитическим вычислением.

Вычисление Bell сохраняет таблицу параметров. Исторический Fuzzy() по-прежнему выбирает более поздний максимум, включая равенство всех нулевых степеней, и возвращает исходный словарь уровня. Исторический регистронезависимый поиск использует полные имена в верхнем регистре, современный — свёртку регистра Unicode. Современная фаззификация явно задаёт отсутствие совпадения и политики равенства first, last или all. Не заменяйте исторические правила выбора современными значениями по умолчанию неявно.

Постепенный переход к современным API

Используйте явные универсальные множества, неизменяемые скалярные множества и фабрики принадлежности, политики операторов и отдельные области интегрирования там, где реализованный современный API покрывает операцию приложения. Точные свойства, альфа-срезы, нормализация и отношения сохраняют границы доказательств; выборочные отчёты не доказывают непрерывное поведение. Лингвистические оценки и диагностика также доступны. Существующие исторические вызовы не требуют массового переименования.

Полное руководство по миграции содержит ссылки на исполняемые примеры и объясняет каждый доступный путь. Публичная современная типизация и покрытие сигнатур задач #92 и #95 реализованы и проверяются на установленных wheel в CPython 3.13 и 3.14; см. контракт типизации. Финальный кандидат всё равно требует собственных свидетельств CI. Опциональная векторизация — принятое решение и эксперимент вне пакета, а не импортируемое вычислительное ядро. Публичные запросы выпуклости, прозрачные кэши, поддержка free-threaded и общие заявления о производительности не являются целями миграции.