Refatorar código Python no Visual Studio

A reutilização de código existente e a atualização de código são tarefas comuns para desenvolvedores. Talvez você queira refatorar um código existente para dar outra finalidade a ele e economizar tempo por não precisar escrever um código novo do zero. Talvez você queira limpar um código com o intuito de retirar itens não usados ou atualizar importações e métodos para que sejam atualizados com as versões recentes.

O Visual Studio fornece vários comandos para ajudar a transformar e limpar código-fonte Python automaticamente:

Pré-requisitos

  • Visual Studio. Para instalar o produto, siga as etapas em Instalar o Visual Studio.
  • Acesso a um projeto com código Python existente.

Renomear uma classe, um método ou uma variável

Use o comando Renomear para modificar o nome de um identificador, incluindo uma classe, um método ou uma variável. O Visual Studio é compatível tanto com a atualização de todas as instâncias do identificador quanto com a atualização de instâncias específicas que você indicar.

As etapas a seguir mostram como utilizar o comando Renomear em um código.

  1. No código, clique com o botão direito do mouse no identificador que deseja renomear e escolha Renomear. Também é possível posicionar o cursor em um identificador e escolher Editar>Refatorar>Renomear no menu ou utilizar o atalho do teclado F2.

  2. Na caixa de diálogo Renomear, insira o novo nome do identificador e selecione OK:

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

  3. Na caixa de diálogo seguinte, escolha os arquivos e as instâncias do código que devem usar o novo nome. É possível selecionar uma instância para pré-visualizar uma alteração específica:

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

  4. Selecione Aplicar para fazer as alterações nos arquivos de código-fonte.

  1. No código, clique com o botão direito do mouse no identificador que deseja renomear e escolha Renomear. Também é possível posicionar o cursor em um identificador e escolher Editar>Refatorar>Renomear no menu ou utilizar o atalho do teclado Ctrl+R..

  2. Na caixa de diálogo Renomear, digite o novo nome do identificador e pressione Enter:

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

Adicionar uma instrução de importação

Caso existam identificadores sem definições ou informações complementares sobre tipo no código, o Visual Studio poderá ajudar você a corrigir o problema. Posicione o cursor em um identificador sem informações para que o Visual Studio mostre uma marcação inteligente (lâmpada) à esquerda do código. A marcação lista comandos para adicionar as instruções import ou from ... import necessárias para o identificador correspondente.

As etapas a seguir mostram como usar a marcação inteligente a fim de adicionar importações ao código.

  1. No código, posicione o cursor em um identificador para o qual o Visual Studio exibe a marcação inteligente (lâmpada). Nesse exemplo, a marcação inteligente é exibida para a chamada do módulo math:

    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. No menu da marcação inteligente, escolha o comando para adicionar o módulo necessário ou digite informações no arquivo do código. Nesse exemplo, o comando para adicionar a instrução import math é selecionado.

    O Visual Studio oferece conclusões import para módulos e pacotes de nível superior no projeto atual e na biblioteca padrão. O Visual Studio também oferece conclusões from ... import para submódulos e subpacotes, bem como para membros do módulo. As conclusões incluem funções, classes e dados exportados.

  3. Após selecionar uma opção, confirme se a alteração esperada acontece no arquivo.

    O Visual Studio adiciona a instrução import no topo do arquivo de código após outras importações ou em uma instrução from ... import existente se o mesmo módulo já foi importado. Nesse exemplo, a instrução import math é adicionada no topo do arquivo, depois das outras importações:

    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.

O Visual Studio tenta filtrar os membros que não estão definidos em nenhum módulo. Um exemplo é um módulo importado em outro módulo que não é filho do módulo importador. Vários módulos utilizam a instrução import sys em vez de from xyz import sys. Você não vê a conclusão da importação do módulo sys de outros módulos, mesmo que os módulos não tenham um membro __all__ que exclua o módulo sys.

Da mesma forma, o Visual Studio filtra funções importadas de outros módulos ou do namespace interno. Se um módulo importa a função settrace do módulo sys, em teoria, é possível importá-la desse módulo. Entretanto, a melhor abordagem é utilizar a instrução import settrace from sys diretamente, por isso o Visual Studio oferece especificamente essa instrução.

Por fim, suponha que um módulo normalmente é excluído, mas ele tem outros valores que são incluídos, como um nome atribuído com um valor no módulo. O Visual Studio exclui a importação mesmo assim. Esse comportamento pressupõe que o valor não deve ser exportado porque outro módulo o define. É provável que outra atribuição seja um valor fictício que também não é exportado.

Remover importações não utilizadas

Ao escrever código, é fácil acabar tendo instruções import para módulos que não estão sendo usadas. Como o Visual Studio analisa o código, ele pode determinar automaticamente se uma instrução import é necessária, observando se o nome importado é usado dentro do escopo abaixo, no qual a instrução ocorre.

As etapas a seguir mostram como eliminar importações não usadas no código.

  1. Clique com o botão direito do mouse em qualquer lugar do editor e escolha Remover Importações. É possível remover a importação de Todos os Escopos ou somente do Escopo Atual.

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

    O Visual Studio determina se há módulos não usados no código e remove as instruções import correspondentes.

  2. Após selecionar uma opção, confirme se as alterações esperadas acontecem no arquivo. Nesse exemplo, o Visual Studio elimina os três módulos não usados: binascii, array e glob.

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

  1. No código, posicione o cursor em uma instrução import para a qual o Visual Studio exibe a marcação inteligente (lâmpada). Nesse exemplo, a marcação inteligente é exibida para os módulos não usados binascii, array e glob:

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

  2. Escolha as opções Excluir todas as importações não usadas ou Remover importação não usada para eliminar apenas o módulo selecionado.

  3. Após selecionar uma opção, confirme se as alterações acontecem no arquivo. Nesse exemplo, o Visual Studio elimina os três módulos não usados: binascii, array e glob.

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

Considerações a respeito do uso dos comandos de refatoração

Antes de usar os comandos de refatoração, examine as seguintes considerações.

  • Após a execução de um comando de refatoração, é possível reverter as alterações usando o comando Editar>Desfazer. O comando Renomear oferece um recurso Pré-visualizar, para que você possa ver as alterações antes que elas sejam aplicadas.

  • O Visual Studio não considera o fluxo de controle no código. Se você utilizar um identificador antes que a definição complementar exista no código, como uma instrução import, o Visual Studio processará o identificador como utilizado mesmo assim. O Visual Studio espera encontrar definições complementares para os identificadores antes que você faça chamadas e atribuições.

  • O Visual Studio ignora todas as instruções de importação from __future__. Essas instruções são importações executadas dentro de uma definição de classe ou por meio de instruções from ... import *.