Есть ли утилита с интерфейсом IDE/оптимизации кода на Python * импорт использовать стандартный модуль.синтаксис членов?
Недавно мне было поручено поддерживать кучу кода, который использует from module import *
довольно сильно.
Эта кодовая база стала достаточно большой, чтобы импортировать конфликты / неоднозначность имен/"откуда, черт возьми, взялась эта функция, есть восемь импортированных модулей, у которых есть один с тем же именем?!- измы становятся все более и более распространенными.
Продвигаясь вперед, я использую явные члены (т. е. import module ... module.object.function()
), чтобы сделать работу по обслуживанию более читаемой.
Но мне было интересно: существует ли IDE или утилита, которая надежно анализирует Python-код и рефакторы * операторы импорта в операторы импорта модуля, а затем добавляет полный путь модуля ко всем ссылкам на Члены этого модуля?
Мы не используем метапрограммирование/отражение/inspect
/monkeypatching сильно, так что если вышеупомянутая IDE/util ведет себя плохо с такими вещами, это нормально.
2 ответа:
Не идеальное решение, но обычно я делаю вот что:
- Открой Пыдев
- удалить все
*
импорта- используйте команду
optimize imports
(ctrl+shift+o
) для повторного добавления всех импортаГрубо решает задачу :)
Если вы хотите построить решение самостоятельно, попробуйте http://docs.python.org/library/modulefinder.html
Вот другие упомянутые связанные инструменты:
- работа сAST напрямую, что является очень низким уровнем для вашего использования.
- работа с modulefinder , который может иметь много шаблонного кода, который вы ищете,
- rope , библиотека рефакторинга (@Lucas Graf),
- the bicycle repair man , рефакторинг libary
- библиотекаlogilab-astng , используемая в
pylint
Подробнее о pylint
pylint
это очень хороший инструмент, построенный поверхast
, который уже может сказать вам, где в вашем коде есть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
? может быть...). С помощью списка глобальных имен из__all__
и имен, на которые жалуетсяpylint
, Вы можете иметь дваset()
и перейти к получению разницы. Замените строку, содержащую подстановочные знаки импорта, конкретным импортом.