Есть ли утилита с интерфейсом IDE/оптимизации кода на Python * импорт использовать стандартный модуль.синтаксис членов?


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

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

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

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

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

2 24

2 ответа:

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

  1. Открой Пыдев
  2. удалить все * импорта
  3. используйте команду 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() и перейти к получению разницы. Замените строку, содержащую подстановочные знаки импорта, конкретным импортом.