在 Visual Studio 中重构 Python 代码

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

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. 在“重命名”对话框中,键入标识符的新名称,后跟 Enter

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

添加导入语句

如果代码中有缺少定义或支持类型信息的标识符,Visual Studio 可以帮助你更正问题。 将插入符号放在缺少信息的标识符上时,Visual Studio 会在代码左侧显示一个智能标记(灯泡)。 标记列出了用于添加相应标识符的必要 importfrom ... 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 模块的完成,即使这些模块缺少可排除 sys 模块的 __all__ 成员也是如此。

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

最后,假设某个模块通常被排除,但它具有其他值,这些值类似于在模块中分配了值的名称。 Visual Studio 仍会排除导入。 此行为假定不应导出该值,因为另一个模块定义了它。 另一个赋值可能是同样未导出的虚拟值。

删除未使用的导入

在你编写代码时,可对根本未使用的模块使用 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. 在代码中,将插入符号放在 Visual Studio 显示智能标记(灯泡)的 import 语句上。 在此示例中,未使用的模块 binascii、array 和 glob 会显示智能标记:

    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 * 语句执行的导入。