Рефакторинг кода Python в Visual Studio

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

Visual Studio предоставляет несколько команд для автоматического преобразования и очистки исходного кода Python:

Необходимые компоненты

  • Visual Studio. Чтобы установить продукт, выполните действия, описанные в разделе "Установка Visual Studio".
  • Доступ к проекту кода Python с существующим кодом.

Переименование класса, метода или переменной

Команду "Переименовать" можно использовать для изменения имени определенного идентификатора, включая класс, метод или переменную. Visual Studio поддерживает обновление всех экземпляров идентификатора или только указанных экземпляров.

Ниже показано, как использовать команду "Переименовать " в коде.

  1. В коде щелкните правой кнопкой мыши идентификатор, который нужно переименовать, и выберите "Переименовать". Вы также можете поместить курсор на идентификатор и выбрать изменить>рефакторинг>переименования в меню или использовать сочетание клавиш F2.

  2. В диалоговом окне переименования введите новое имя идентификатора и нажмите кнопку ОК:

    Screenshot that shows how to specify a different name for an identifier in Visual Studio 2019.

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

    Screenshot that shows how to apply the new name to specific instances of an identifier and preview the changes in Visual Studio 2019.

  4. Нажмите Применить, чтобы внести изменения в файлы исходного кода.

  1. В коде щелкните правой кнопкой мыши идентификатор, который нужно переименовать, и выберите "Переименовать". Вы также можете поместить курсор на идентификатор и выбрать пункт "Изменить>рефакторинг>переименования" в меню или использовать сочетание клавиш CTRL+R.

  2. В диалоговом окне "Переименовать" введите новое имя идентификатора, за которым следует ввод:

    Screenshot that shows how to specify a different name for an identifier in Visual Studio 2022.

Добавление инструкции импорта

Если в коде есть идентификаторы, отсутствующие определения или вспомогательные сведения о типе, Visual Studio поможет устранить проблему. Когда вы помещаете курсор на идентификатор, который не содержит сведений, Visual Studio отображает смарт-тег (лампочку) слева от кода. Тег перечисляет команды для добавления необходимых import или from ... import инструкций для соответствующего идентификатора.

Ниже показано, как работать с смарт-тегом для добавления импорта в код.

  1. В коде поместите курсор на идентификатор, для которого Visual Studio отображает смарт-тег (лампочка). В этом примере смарт-тег отображается для вызова математического модуля:

    Screenshot that shows the smart tag for an identifier that needs an import statement added in Visual Studio 2019.

    Screenshot that shows the smart tag for an identifier that needs an import statement added in Visual Studio 2022.

  2. В меню смарт-тегов выберите команду, чтобы добавить необходимые сведения о модуле или типе в файл кода. В этом примере выбрана команда для добавления инструкции import math .

    Visual Studio предоставляет завершения import для модулей и пакетов верхнего уровня в текущем проекте и стандартной библиотеке. Visual Studio также предлагает from ... import завершения для вложенных модулей и подпакетов и элементов модуля. В эти завершения входят функции, классы и экспортированные данные.

  3. После выбора параметра убедитесь, что в файл внесены ожидаемые изменения.

    Visual Studio добавляет инструкцию import в верхней части файла кода после других импортов или в существующую from ... import инструкцию, если тот же модуль уже импортирован. В этом примере import math инструкция добавляется в верхней части файла после другого импорта:

    Screenshot that shows the import statement added after running the command from the smart tag in Visual Studio 2019.

    Screenshot that shows the import statement added after running the command from the smart tag in Visual Studio 2022.

Visual Studio пытается отфильтровать элементы, которые не определены в модуле. Примером является модуль, импортированный в другой модуль, который не является дочерним элементом импортируемого модуля. Многие модули используют инструкцию import sys , а не from xyz import sys. Вы не видите завершения импорта sys модуля из других модулей, даже если модули отсутствуют __all__ , который исключает sys модуль.

Аналогичным образом Visual Studio фильтрует функции, импортированные из других модулей или встроенного пространства имен. Если модуль импортирует settrace функцию из sys модуля, то в теории можно импортировать функцию из этого модуля. Однако оптимальным подходом является использование инструкции import settrace from sys напрямую, поэтому Visual Studio специально предлагает этот оператор.

Наконец, предположим, что модуль обычно исключается, но он имеет другие значения, включенные как имя, назначенное значением в модуле. Visual Studio по-прежнему исключает импорт. Это поведение предполагает, что значение не должно быть экспортировано, так как другой модуль определяет его. Другое назначение, скорее всего, будет фиктивным значением, которое также не экспортируется.

Удаление неиспользуемых инструкций import

При написании кода легко import получить инструкции для модулей, которые не используются вообще. Так как Visual Studio анализирует код, он может автоматически определитьimport, требуется ли оператор, посмотрев, используется ли импортированное имя в область после выполнения инструкции.

Ниже показано, как удалить неиспользуемые импорты в коде.

  1. Щелкните правой кнопкой мыши в любом месте редактора и выберите пункт "Удалить импорт". Вы можете удалить импорт из всех областей или только текущую область.

    Screenshot that shows how to access the Remove Imports menu in Visual Studio 2019.

    Visual Studio определяет, есть ли в коде неиспользуемые модули и удаляет соответствующие import инструкции.

  2. После выбора параметра убедитесь, что ожидаемые изменения внесены в файл. В этом примере Visual Studio удаляет три неиспользуемых модуля: binascii, array и glob.

    Screenshot that shows the results of using the Remove Imports command to remove unused modules from the code in Visual Studio 2019.

  1. В коде поместите курсор на инструкцию import , для которой Visual Studio отображает смарт-тег (лампочка). В этом примере смарт-тег отображается для неиспользуемых модулей binascii, массива и глоба:

    Screenshot that shows how to access options to remove unused imports in Visual Studio 2022.

  2. Выберите параметр "Удалить все неиспользуемые импорты" или "Удалить неиспользуемый импорт", чтобы удалить только выбранный модуль.

  3. После выбора параметра убедитесь, что изменения внесены в файл. В этом примере Visual Studio удаляет три неиспользуемых модуля: binascii, array и glob.

    Screenshot that shows the results of using the Remove all unused imports command in Visual Studio 2022.

Рекомендации при использовании команд рефакторинга

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

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

  • Visual Studio не учитывает поток управления в коде. Если вы используете идентификатор, прежде чем вспомогательное определение присутствует в коде, например import оператор, Visual Studio по-прежнему обрабатывает идентификатор в качестве используемого. Visual Studio ожидает найти вспомогательные определения идентификаторов перед вызовами и назначениями.

  • Visual Studio игнорирует все from __future__ инструкции импорта. Эти инструкции являются импортами, выполняемыми внутри определения класса или с помощью from ... import * инструкций.