在 Visual Studio 中重构 Python 代码

重用现有代码和刷新代码是开发人员的常见任务。 你可能希望为另一个目的重构现有代码,并通过不编写所有新代码来节省时间。 你可能想要清理代码以删除未使用的项目或刷新导入和方法,以便它们与最新版本保持最新状态。

Visual Studio 提供了多个命令,可帮助你自动转换和清理 Python 源代码:

先决条件

  • Visual Studio。 若要安装产品,请按照 安装 Visual Studio 中的步骤作。
  • 访问包含现有代码的 Python 代码项目。

重命名类、方法或变量

可以使用 Rename 命令更改特定标识符的名称,包括类、方法或变量。 Visual Studio 支持更新标识符的所有实例或仅更新指示的特定实例。

以下步骤演示如何在代码中使用 Rename 命令。

  1. 在代码中,右键单击要重命名的标识符,然后选择“ 重命名”。 还可以将光标放在标识符上,然后从菜单中选择“编辑>重构>重命名”,或使用快捷键Ctrl+R

  2. 在“ 重命名 ”对话框中,键入标识符的新名称,后跟 Enter

    显示如何在 Visual Studio 2022 中为标识符指定其他名称的屏幕截图。

添加 import 语句

如果代码中有缺少定义或支持类型信息的标识符,Visual Studio 可以帮助你更正问题。 将插入符号放在缺少信息的标识符上时,Visual Studio 会在代码左侧显示智能标记(灯泡)。 标记列出了用于添加相应标识符的必要 importfrom ... import 语句的命令。

以下步骤演示如何使用智能标记在代码中添加导入。

  1. 在代码中,将光标放在显示智能标记(灯泡)的标识符上。 在此示例中,智能标记显示对数学模块的调用:

    显示需要 Visual Studio 2022 中添加的导入语句的标识符的智能标记的屏幕截图。

  2. 在智能标记菜单上,选择命令,将必要的模块或类型信息添加到代码文件中。 在此示例中,将选中用于添加语句的 import math 命令。

    Visual Studio 为当前项目和标准库中的顶级包和模块提供 import 自动完成。 Visual Studio 还提供from ... import 子模块、子包和模块成员的自动完成功能。 完成包括函数、类或导出的数据。

  3. 选择选项后,确认对文件进行了预期的更改。

    Visual Studio 会在其他导入后将语句添加到 import 代码文件的顶部;如果已导入同一模块,则将其添加到现有 from ... import 语句中。 在此示例中,该 import math 语句在其他导入之后添加到文件的顶部:

    显示从 Visual Studio 2022 中的智能标记运行命令后添加的导入语句的屏幕截图。

Visual Studio 尝试筛选出模块中未定义的成员。 例如,作为一个模块导入到另一个模块中,而这个模块并不是导入模块的从属。 许多模块都使用 import sys 语句,而不是 from xyz import sys。 即使模块的某个缺失成员排除了sys模块,也不会看到从其他模块导入sys模块的完成。

同样,Visual Studio 会筛选从其他模块或内置命名空间导入的函数。 如果模块从settrace模块导入sys函数,从理论上讲,可以从该模块导入该函数。 但是,最好的方法是直接使用 import settrace from sys 语句,因此 Visual Studio 专门提供该语句。

最后,假设某个模块通常被排除,但其中有一些特定的值被包含进来,例如在模块中分配了一个值的名称。 Visual Studio 仍排除导入。 此行为假定不应导出值,因为另一个模块定义了该值。 另一个赋值可能是未导出的虚拟值。

删除未使用的导入

编写代码时,您可能很容易写出一些 import 语句,而这些语句对应的模块根本没有被使用。 由于 Visual Studio 分析您的代码,它可以通过检查导入的名称是否在语句出现后在作用域内使用来自动确定是否需要 import 语句。

以下步骤演示如何删除代码中未使用的导入。

  1. 在代码中,将插入符 import 放置在 Visual Studio 显示智能标记(灯泡)的语句上。 在此示例中,智能标签显示未使用的模块 binascii、array 和 glob:

    显示如何访问选项以删除 Visual Studio 2022 中未使用的导入的屏幕截图。

  2. 选择 “删除所有未使用的导入 ”或 “删除未使用的导入 ”选项,以仅删除所选模块。

  3. 选择一个选项后,确认对文件所做的更改。 在此示例中,Visual Studio 删除了三个未使用的模块:binascii、array 和 glob。

    显示使用 Visual Studio 2022 中“删除所有未使用的导入”命令的结果的屏幕截图。

使用重构命令时的注意事项

在使用重构命令之前,请查看以下注意事项。

  • 运行重构命令后,可以使用“编辑>”命令还原更改。 Rename 命令提供预览功能,因此你可以在应用更改之前看到更改。

  • Visual Studio 不考虑代码中的控制流。 如果在代码中存在支持定义之前使用标识符,例如 import 语句,Visual Studio 仍会处理所使用的标识符。 Visual Studio 需要在进行调用和分配之前查找标识符的支持定义。

  • Visual Studio 忽略所有 from __future__ 导入语句。 这些语句是在类定义内或通过 using from ... import * 语句执行的导入。