Клиент (я) обнаружил критическую ошибку в библиотеке PrayTimes, используемой для расчёта исламских молитвенных времён. Ошибка сохранялась в коде более 10 лет и приводила к неточным расчётам времени молитв. Основная цель — исправить эту фундаментальную проблему, обеспечить точность расчётов и добавить корректную атрибуцию исправлений в соответствии с лицензией GNU LGPL v3.0.
1. Анализ ошибки:
- Выявлено, что в методе инициализации __init__ происходила перезапись параметра method во время итерации по словарю methods.
- Ошибка в setMethod: обращение self.methods[method].params вместо корректного self.methods[method]['params'].
2. Ключевые исправления:
- Сохранение исходного значения method в переменную initial_method до начала итерации.
- Замена имени переменной итерации с method на key во избежание конфликта имён.
- Исправление обращения к параметрам метода через ['params'] вместо .params.
- Добавление явной атрибуции исправлений в комментариях кода и блоке лицензии.
3. Оптимизация:
- Улучшена читаемость кода за счёт добавления комментариев-индикаторов.
- Упрощена логика обработки параметров методов.
Повышение точности расчётов:
- Исправление гарантирует корректную инициализацию методов расчёта (MWL, ISNA и др.).
- Устранена ошибка, влиявшая на расчёты времени молитв для миллионов пользователей.
Практическое применение:
- Библиотека теперь возвращает точные времена молитв (Фаджр, Зухр, Аср и т.д.).
- Разработчики могут обновлять код с учётом требований лицензии (атрибуция исправлений).
- Пример использования в коде остаётся совместимым:
times = prayTimes.getTimes(date.today(), (43, -80), -5)
print(times['fajr']) # Корректное время утренней молитвы
Распространение:
- Исправленная версия доступна для интеграции в мусульманские приложения, веб-сервисы и IoT-устройства (например, умные часы с напоминаниями о молитвах).