Рефакторинг проекта Python, в котором есть много библиотек, которые имеют "from smthng import *"
Я запускаю проект на Python, который продолжает развиваться. Имеет 10 местных библиотек. Каждый из них называет друг друга "от имени импорта *". Для примера из main:
from name3 import *
from name2 import *
from general_functions import *
from messages import *
from network import *
from keyboard_functions import *
from process_functions import *
from name4 import *
from settings import * # settings
Согласно дзену Python, явное лучше, чем неявное. Также из-за понимания и отладки проекта мне нужны явные методы и переменные импорта.
Также другие библиотеки используют те же методы импорта. Я чувствую, что все библиотеки импортируют все библиотеки через "*".
Пытаюсь провести рефакторинг своими руками
from debug_functions import (print_log, print_log2, debug_functions_initilizer, debug_prints_abbrev, print_setting_info,
print_error, print_warn, print_error_warning_count_of_this_process, print_debug,
print_performance_report)
как это.
Но я остановился, когда заглянул глубоко.
Например, библиотека a.py import exp1. В b.py он вызываетfrom a.py import *
. Таким образом, в b.py библиотеку exp1 можно использовать без импорта exp1. Итак, в b.py, если я конвертируюfrom a.py import *
в явном виде, from a.py import something
, возникают ошибки, зависящие от библиотеки exp1. Таких примеров много.
Как решить проблему?
ОБНОВИТЬ
Что я сделал? Я импортирую библиотеки со своими методами, переменными в каждую библиотеку. Например, у меня есть библиотеки a.py, b.py и c.py. Я импортирую a.py и b.py с их собственными всеми методами в c.py. Как это,
from a import foo, bar
from b import exp, solv
В b.py таким же образомfrom a import foo, bar
from c import sa, as
После этого пока библиотеки имеют необходимые методы от реального владельца, а не от третьей библиотеки.
В конце концов, я удаляю неиспользуемые методы в библиотеках.
1 ответ
Не уверен, есть ли простое решение, но это может немного помочь. Установите pylint и установите тесты для всех модулей на предмет "переменная не определена"
- Создайте модуль, скажем, "временный.py", и получите весь свой "from xyz import *" из всех файлов в этом месте.
from name3 import *
from name2 import *
from general_functions import *
from messages import *
from network import *
from keyboard_functions import *
from process_functions import *
from name4 import *
from settings import *
- Удалите все "из xyx import *" из всех других модулей и замените одной строкой "из временного импорта *
Это поможет избежать зависимости всех модулей друг от друга (так как все модули теперь будут зависеть от "временного.py
Теперь начнем с первого импорта "from name3 import *" во временном.py. Удалите этот импорт и запустите тесты pylint. Исправьте все модули с ошибками, добавив неявный импорт после "из временного импорта *"
Выполните этот шаг для всех остальных операций импорта
Как только все будет сделано, удалите "из временного импорта *" из всех файлов.
Примечание: есть нюанс. Если в 2 модулях определена одна и та же переменная / функция, скажем "my_function", и модуль C импортирует оба модуля, тогда он использует "my_function" из последнего импорта. Вы не сможете определить такие проблемы, если они есть, и можете в конечном итоге использовать неправильную функцию.