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

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

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

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

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

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

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

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

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


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

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

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

    Подробнее о pylint

    pylint – очень хороший инструмент, созданный на вершине ast который уже может рассказать вам, где в вашем коде есть данные from somemodule import * , а также сообщать вам, какие from somemodule import * не нужны.

    пример:

     # next is what's 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 поддержка modulefinder с этим? может быть …). Со списком глобальных имен от __all__ и имен, которые pylint жалуется, вы можете иметь два set() и перейти к разнице. Замените строку с импортированием подстановочных знаков с конкретным импортом.