Ну, opts очевидно служит оберткой для глобальных переменных, и код, кажется, написан в процедурном стиле, все входные и выходные данные каждой функции проходят через глобальные переменные.
Рефакторинг здесь должен проходить как и в любом другом языке программирования при встрече с таким стилем:
Первое (самое важное): не рефакторить ничего, в чем нет реальной необходимости что-то менять. Когда код работает хорошо и вам не нужно что-то добавлять, оставьте все как есть. Сосредоточьтесь только на тех частях базы кода, где вам нужно исправить ошибки, добавить новые функции или оптимизировать.
Второе: убедитесь, что у вас достаточно автоматизированных тестов для программы. Вы обязательно что-нибудь сломаете, поэтому лучше потратьте немного времени на написание регрессионных тестов. Это не обязательно должны быть модульные тесты, но ваши тесты должны иметь некоторые воспроизводимые входные данные и некоторые записанные, проверенные выходные данные, которые, как известно, являются «правильными» для репрезентативных наборов вариантов использования. Для языка, не поддерживающего типобезопасность, такого как Python, это еще более важно, поскольку нет компилятора, защищающего вас от опечаток, вызванных рефакторингом.
И для самого рефакторинга: для начала избавьтесь от как можно большего количества глобальных переменных. Вместо этого введите явные входные параметры и возвращаемые значения для каждой функции и ограничьте их использование минимально возможной областью действия. Функции без побочных эффектов (или, по крайней мере, с меньшим количеством побочных эффектов) и функции, которые не полагаются на побочные эффекты, намного легче рассуждать и поддерживать как функции, которые действительно вызывают побочные эффекты или полагаются на них.
Обратите внимание, что это может быть только началом. Вероятно, вам придется применить гораздо больше стандартных приемов рефакторинга, которые вы найдете в таких книгах, как книга Фаулера «Рефакторинг» и книга Фезерса «Эффективная работа с устаревшим кодом». Также взгляните на один из наших старых, но вечных вопросов на этом сайте: Я унаследовал 200 тысяч строк спагетти-кода — что теперь?.
Удачи!
TLDR; Нет, простого пути нет. Но есть стандартные подходы, которые, как всегда, требуют кропотливой работы.
Рекомендую посмотреть эти видео для лучшего погружения в вопрос: