Рефакторинг проекта 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, barfrom b import exp, solv

В b.py таким же образомfrom a import foo, barfrom c import sa, as

После этого пока библиотеки имеют необходимые методы от реального владельца, а не от третьей библиотеки.

В конце концов, я удаляю неиспользуемые методы в библиотеках.

1 ответ

Не уверен, есть ли простое решение, но это может немного помочь. Установите pylint и установите тесты для всех модулей на предмет "переменная не определена"

  1. Создайте модуль, скажем, "временный.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 *
  1. Удалите все "из xyx import *" из всех других модулей и замените одной строкой "из временного импорта *

Это поможет избежать зависимости всех модулей друг от друга (так как все модули теперь будут зависеть от "временного.py

  1. Теперь начнем с первого импорта "from name3 import *" во временном.py. Удалите этот импорт и запустите тесты pylint. Исправьте все модули с ошибками, добавив неявный импорт после "из временного импорта *"

  2. Выполните этот шаг для всех остальных операций импорта

  3. Как только все будет сделано, удалите "из временного импорта *" из всех файлов.

Примечание: есть нюанс. Если в 2 модулях определена одна и та же переменная / функция, скажем "my_function", и модуль C импортирует оба модуля, тогда он использует "my_function" из последнего импорта. Вы не сможете определить такие проблемы, если они есть, и можете в конечном итоге использовать неправильную функцию.

Другие вопросы по тегам