Инструмент, помогающий устранить подстановочные знаки

Я занимаюсь рефакторингом и устраняю импорт подстановочных знаков для некоторого довольно монолитного кода.

Pylint, кажется, отлично справляется со списком всех неиспользованных импортов, которые идут вместе с импортом с подстановочными знаками, но я хотел бы предоставить список использованных импортов, чтобы я мог быстро заменить импорт с подстановочными знаками. Какие-нибудь быстрые способы сделать это? Я собираюсь разобрать вывод pyLint и сделать set.difference() на этом и dir() импортируемого модуля. Но держу пари, что есть какой-то инструмент / процедура, о которой я не знаю.

2 ответа

Решение

Примечание: Pylint не рекомендует набор использованных импортных товаров. Изменяя это, вы должны знать о других модулях, импортирующих код, который вы модифицируете, которые могут использовать символы, которые принадлежат пространству имен модуля, который вы реорганизуете, только потому, что у вас неиспользуемый импорт.

Я рекомендую следующую процедуру для рефакторинга from foo import *:

  • в интерактивной оболочке введите:

    import re
    import foo as module # XXX use the correct module name here!
    
    module_name = module.__name__
    import_line = 'from %s import (%%s)' % module_name
    length = len(import_line) - 3
    print import_line % (',\n' + length * ' ').join([a for a in dir(module) 
                                                                   if not re.match('__.*[^_]{2}', a)])
    
  • заменить from foo import * строка с напечатанной выше

  • запустите pylint и удалите неиспользуемый импорт, помеченный pylint
  • снова запустить pylint для всего кода на основе поиска импортных несимволов
  • запустить свои юнит-тесты

повторить с from bar import *

Вот карта dewild, очень простой инструмент, основанный на первоначальных идеях Алекса:

https://github.com/quentinsf/dewildcard

Это старый вопрос, но я написал кое-что, что делает это на основе автозапуска.

Смотрите здесь: https://github.com/fake-name/autoflake/blob/master/autostar.py

Он работает в противоположном направлении от dewildcard, поскольку пытается полностью квалифицировать все варианты использования элементов с подстановочными знаками.

Например

from os.path import *

Преобразован в

import os.path

и все виды использования os.path.<func> добавляются с соответствующей функцией.

Другие вопросы по тегам