Подтвердить что ты не робот

Есть ли IDE/утилита для реорганизации импорта Python * для использования стандартного синтаксиса module.member?

Недавно мне было поручено поддерживать кучу кода, который довольно сильно использует from module import *.

Эта кодовая база стала настолько большой, что конфликты импорта/именования двусмысленности/ "где черт выполнил эту функцию, есть, как и восемь импортированных модулей с одним именем?!", которые стали все более распространены.

Двигаясь вперед, я использую явные члены (т.е. import module ... module.object.function(), чтобы сделать работу по обслуживанию более удобочитаемой.

Но мне было интересно: есть ли IDE или утилита, которая надежно анализирует код Python и рефактории * импортирует инструкции в операторы импорта модулей, а затем добавляет полный путь модуля ко всем ссылкам на членов этого модуля?

Мы не используем метапрограммирование/отражение/ inspect/monkeypatching сильно, поэтому, если вышеупомянутый IDE/util ведет себя плохо с такими вещами, это нормально.

4b9b3361

Ответ 1

Не идеальное решение, но то, что я обычно делаю, это:

  • Открыть Pydev
  • Удалить все * импорт
  • Используйте команду optimize imports (ctrl+shift+o) для повторного добавления всех импортных

Грубо решает проблему:)


Если вы хотите самостоятельно создать решение, попробуйте http://docs.python.org/library/modulefinder.html

Ответ 2

Вот упоминаемые другие связанные инструменты:

  • работает с AST напрямую, что очень низкоуровневое для вашего использования.
  • работает с modulefinder, который может содержать много кода шаблона, который вы ищете,
  • rope, библиотека рефакторинга (@Lucas Graf),
  • сотрудник по ремонту велосипедов, рефакторинговая библиотека
  • библиотека logilab-astng, используемая в pylint

Подробнее о 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() и перейти к разнице. Замените строку с импортированием подстановочных знаков с конкретными импортами.