Есть ли IDE/утилита для реорганизации импорта Python * для использования стандартного синтаксиса module.member?
Недавно мне было поручено поддерживать кучу кода, который довольно сильно использует from module import *
.
Эта кодовая база стала настолько большой, что конфликты импорта/именования двусмысленности/ "где черт выполнил эту функцию, есть, как и восемь импортированных модулей с одним именем?!", которые стали все более распространены.
Двигаясь вперед, я использую явные члены (т.е. import module ... module.object.function()
, чтобы сделать работу по обслуживанию более удобочитаемой.
Но мне было интересно: есть ли IDE или утилита, которая надежно анализирует код Python и рефактории * импортирует инструкции в операторы импорта модулей, а затем добавляет полный путь модуля ко всем ссылкам на членов этого модуля?
Мы не используем метапрограммирование/отражение/ inspect
/monkeypatching сильно, поэтому, если вышеупомянутый IDE/util ведет себя плохо с такими вещами, это нормально.
Ответы
Ответ 1
Не идеальное решение, но то, что я обычно делаю, это:
- Открыть Pydev
- Удалить все
*
импорт
- Используйте команду
optimize imports
(ctrl+shift+o
) для повторного добавления всех импортных
Грубо решает проблему:)
Если вы хотите самостоятельно создать решение, попробуйте http://docs.python.org/library/modulefinder.html
Ответ 2
Вот упоминаемые другие связанные инструменты:
Подробнее о pylint
pylint
- очень хороший инструмент, построенный поверх ast
, который уже может сказать вам, где в вашем коде есть инструкции from somemodule import *
, а также сообщать вам, какие импорты не нужны.
Пример:
# next is what on line 32
from re import *
это будет жаловаться:
W: 32,0: Wildcard import re
W: 32,0: Unused import finditer from wildcard import
W: 32,0: Unused import LOCALE from wildcard import
... # this is a long list ...
На пути к решению?
Обратите внимание, что в приведенном выше выводе pylint
отображаются номера строк. это может быть какое-то усилие, но инструмент рефакторинга может смотреть на эти конкретные предупреждения, получать номер строки, импортировать модуль и просматривать список __all__
или использовать изолированный дескриптор execfile()
для просмотра глобальных имен модуля (modulefinder
помогите с этим? возможно...). Список глобальных имен из __all__
и имена, которые pylint
жалуются, могут иметь два set()
и перейти к разнице. Замените строку с импортированием подстановочных знаков с конкретными импортами.