现已发布!阅读 10 月份发布的新功能和修复。

在 Visual Studio Code 中编辑 Python

Visual Studio Code 是一个功能强大的编辑工具,用于编辑 Python 源代码。编辑器包含各种功能,可帮助您在编写代码时提高效率。有关在 Visual Studio Code 中编辑的更多信息,请参阅 基本编辑代码导航

在本概述中,我们将介绍 Python 扩展 提供的特定编辑功能,包括有关如何通过用户和工作区 设置 自定义这些功能的步骤。

自动完成和 IntelliSense

IntelliSense 是一个通用术语,用于描述与代码补全相关的代码编辑功能。请花点时间查看下面的示例。当键入 print 时,请注意 IntelliSense 如何填充自动补全选项。当用户开始键入名为 greeting 的变量时,也会提供一个选项列表。

Hello World Example for IntelliSense

自动完成和 IntelliSense 可用于当前工作文件夹中的所有文件。它们也适用于安装在标准位置的 Python 包。

Pylance 是 VS Code 中 Python 的默认语言服务器,它与 Python 扩展一起安装以提供 IntelliSense 功能。

Pylance 基于 Microsoft 的 Pyright 静态类型检查工具,利用 类型存根 (.pyi 文件) 和延迟类型推断,以提供高效的开发体验。

有关 IntelliSense 的更多信息,请参阅 IntelliSense

提示:查看 VS Code 的 IntelliCode 扩展。IntelliCode 为 Python 中的 IntelliSense 提供了一组 AI 辅助功能,例如根据当前代码上下文推断最相关的自动补全。有关更多信息,请参阅 VS Code 的 IntelliCode 常见问题解答

自定义 IntelliSense 行为

默认情况下启用所有 IntelliSense 功能可能会导致您的开发体验变慢,因此 Python 扩展启用了最少的功能集,让您在保持高效的同时仍能获得良好的性能。但是,您可以通过多个设置自定义分析引擎的行为,使其符合您的喜好。

启用自动导入

Pylance 为工作区中的模块以及在环境中安装的包提供自动导入建议。在编辑器中键入时,您可能会获得补全建议。当您接受建议时,自动导入会将相应的导入语句自动添加到您的文件中。

您可以通过将设置中的 python.analysis.autoImportCompletions 设置为 true 来启用自动导入。默认情况下,自动导入处于禁用状态。

Completion with auto import displayed on the suggestion list

为自定义包位置启用 IntelliSense

要为安装在非标准位置的包启用 IntelliSense,请将这些位置添加到 settings.json 文件中的 python.analysis.extraPaths 集合(默认集合为空)。例如,您可能在自定义位置安装了 Google App Engine,如果您使用 Flask,则在 app.yaml 中指定了这些位置。在这种情况下,您将按如下方式指定这些位置

Windows

"python.analysis.extraPaths": [
    "C:/Program Files (x86)/Google/google_appengine",
    "C:/Program Files (x86)/Google/google_appengine/lib/flask-0.12"]

macOS/Linux

"python.analysis.extraPaths": [
    "~/.local/lib/Google/google_appengine",
    "~/.local/lib/Google/google_appengine/lib/flask-0.12" ]

有关所有可用 IntelliSense 控制的完整列表,您可以参考 Python 扩展的 代码分析设置自动补全设置

您还可以自定义自动完成和 IntelliSense 的常规行为,甚至完全禁用这些功能。您可以在 自定义 IntelliSense 中了解更多信息。

使用 AI 增强补全

GitHub Copilot 是一款 AI 驱动的代码补全工具,可帮助您更快、更智能地编写代码。您可以使用 VS Code 中的 GitHub Copilot 扩展 来生成代码,或从生成的代码中学习。

GitHub Copilot extension in the VS Code Marketplace

GitHub Copilot 为多种语言和各种框架提供建议,它在 Python、JavaScript、TypeScript、Ruby、Go、C# 和 C++ 中尤其有效。

您可以在 Copilot 文档 中了解有关如何开始使用 Copilot 的更多信息。

导航

在编辑时,您可以右键单击不同的标识符,以利用几个方便的命令

  • 转到定义 (F12) 会将您从代码跳转到定义对象的代码。当您使用库时,此命令非常有用。

  • 窥视定义 (⌥F12 (Windows Alt+F12,Linux Ctrl+Shift+F10)) 类似,但会直接在编辑器中显示定义(在编辑器窗口中留出空间,以避免遮挡任何代码)。按 Escape 关闭窥视窗口,或使用右上角的 x

  • 转到声明 会跳转到在代码中声明变量或其他对象的点。

  • 窥视声明 类似,但会直接在编辑器中显示声明。同样,使用 Escape 或右上角的 x 关闭窥视窗口。

快速修复

添加导入

使用 Pylance 时,添加导入快速修复使您能够快速完成对在环境中安装的模块的导入语句。当您开始在编辑器中键入包名称时,会提供一个代码操作来自动完成源代码行。将鼠标悬停在文本上(用波浪线标记),然后选择代码操作灯泡。然后,您可以从潜在导入的列表中进行选择。

Add import code action

此代码操作还识别以下常用 Python 包的一些常用缩写:numpy 作为 np,tensorflow 作为 tf,pandas 作为 pd,matplotlib.pyplot 作为 plt,matplotlib 作为 mpl,math 作为 m,scipi.io 作为 spio,scipy 作为 sp,panel 作为 pn,holoviews 作为 hv。

Common package abbreviations

导入建议列表将显示 3 个置信度最高的导入选项,优先级基于:最近使用的导入、来自同一模块的符号、来自标准库的符号、来自用户模块的符号、来自第三方包的符号,最后按模块和符号名称排序。

搜索其他导入匹配项

默认情况下,添加导入快速修复只显示 3 个置信度最高的导入选项。如果它们没有列出您要查找的内容,您可以使用 Pylance 的 搜索其他导入匹配项 快速修复来解决缺少导入错误。此快速修复将显示一个快速选择菜单,使您能够搜索与缺少的导入符号前缀匹配的导入选项。

Search for additional import matches Code Action

更改拼写

当未解析的变量或缺少导入诊断可能是由于拼写错误导致时,Pylance 会显示 更改拼写 快速修复。此代码操作建议根据在工作区中找到的最接近匹配项更正符号的拼写。

Change spelling code action on missing import due to a typo

注意:对于用户符号,这些快速修复将仅建议来自定义它们的文件的导入。不支持来自用户符号为外部/导入文件的导入建议。

此外,请注意,对于来自已安装软件包(通常位于 Python 环境的 site-packages 文件夹下)的符号,只有在软件包的根文件夹中定义的符号(例如其 __init__.py 文件)才会被这些快速修复建议。您可以通过 python.analysis.packageIndexDepths 设置为特定软件包自定义此行为,但请注意,这可能会影响 Pylance 的性能。

重构

Python 扩展通过 Pylance 扩展添加了以下重构功能:提取变量提取方法重命名模块移动符号实现所有继承的抽象类。它还支持实现附加重构功能的扩展,例如排序导入

提取变量

提取当前范围内的所选文本的所有相似出现,并将其替换为新变量。

您可以通过选择要提取为变量的代码行来调用此命令。然后选择它旁边显示的灯泡。

Refactoring a variable

提取方法

提取当前范围内的所选表达式或块的所有相似出现,并将其替换为方法调用。

您可以通过选择要提取为方法的代码行来调用此命令。然后选择它旁边显示的灯泡。

Refactoring code into a method

重命名模块

重命名 Python 文件/模块后,Pylance 可以找到所有可能需要更新的实例,并为您提供所有更改的预览。

要自定义哪些引用需要更新,您可以在重构预览中切换行或文件级别的复选框。完成选择后,您可以选择应用重构放弃重构

Renaming a module

移动符号

Pylance 扩展提供了两个代码操作来简化将符号移动到不同文件的过程。

  • 将符号移动到...:显示一个文件选择器,用于选择要移动符号的目标文件。
  • 将符号移动到新文件:创建一个与符号名称相同的新文件,该文件位于调用代码操作的源文件所在的同一目录中。

您可以通过将鼠标悬停在要移动的符号上,然后选择出现在所需操作旁边的灯泡来访问这些代码操作。或者,您可以右键单击该符号,然后从上下文菜单中选择重构...

Move Symbol refactoring options

实现所有继承的抽象类

在 Python 中,抽象类充当其他类的“蓝图”,通过促进子类必须遵守的清晰结构和要求来帮助构建模块化、可重用的代码。要定义 Python 中的抽象类,您可以创建一个从 abc 模块的 ABC 类继承的类,并使用 @abstractmethod 装饰器对其方法进行注释。然后,您可以创建从这个抽象类继承的新类,并为基类方法定义实现。

Pylance 提供了一个代码操作来简化创建这些类的过程。当您定义从抽象类继承的新类时,您现在可以使用实现所有继承的抽象类代码操作来自动实现父类中的所有抽象方法和属性。

Implement inherited abstract classes

排序导入

Python 扩展支持诸如 isortRuff 之类的扩展,它们实现了排序导入功能。此命令将来自同一模块的特定导入合并到单个 import 语句中,并按字母顺序组织 import 语句。

您可以通过安装支持排序导入的扩展,然后打开命令面板(⇧⌘P (Windows、Linux Ctrl+Shift+P))并运行组织导入来调用它。

提示:您可以为 editor.action.organizeImports 命令分配键盘快捷键。

Sorting import statements

故障排除

有关常见 IntelliSense 和 Python 编辑问题的帮助,请查看下面的表格。

问题 原因 解决方案
Pylance 仅在添加导入时提供顶级符号选项。 默认情况下,仅索引顶级模块 (depth=1)。
例如,您可能会看到 import matplotlib 作为建议,但默认情况下不会看到 import matplotlib.pyplot
尝试通过 python.analysis.packageIndexDepths 增加 Pylance 可以索引已安装库的深度。查看 代码分析设置
Pylance 不会自动添加缺少的导入 自动导入完成设置可能已禁用。 查看 启用自动导入部分
自动导入已启用,但 Pylance 不会自动导入在工作区中其他文件中定义的符号。 用户定义的符号(不是来自已安装的软件包或库的符号)仅在已在编辑器中打开的文件中使用时才会自动导入。
否则,它们将仅通过 添加导入快速修复 提供。
使用添加导入快速修复,或确保首先打开工作区中的相关文件。
Pylance 在大型工作区上工作时似乎很慢或消耗了太多内存。 Pylance 分析是在给定工作区中存在的所有文件上进行的。 如果存在您知道可以从 Pylance 分析中排除的子文件夹,您可以将它们的路径添加到 python.analysis.exclude 设置中。或者,您可以尝试将 python.analysis.indexing 设置为 false 来禁用 Pylance 的索引器(注意:这也会影响完成和自动导入的体验。了解有关 代码分析设置 中索引的更多信息)。
您无法将自定义模块安装到 Python 项目中。 自定义模块位于非标准位置(未使用 pip 安装)。 将位置添加到 python.autoComplete.extraPaths 设置中并重新启动 VS Code。

Pylance 诊断

Pylance 默认情况下会在“问题”面板中提供 Python 文件的诊断。

以下是 Pylance 提供的一些最常见的诊断及其解决方法。

importResolveSourceFailure

当 Pylance 能够找到导入软件包的类型存根,但无法找到软件包本身时,会发生此错误。当您尝试导入的软件包未安装在所选的 Python 环境中时,可能会发生这种情况。

如何修复它

  • 如果该软件包已安装在其他解释器或内核中,请 选择正确的解释器
  • 如果软件包未安装,您可以通过在激活的终端中运行以下命令来安装它:python -m pip install {package_name}

importResolveFailure

当 Pylance 无法找到您要导入的软件包或模块,也无法找到其类型存根时,会发生此错误。

如何修复它

  • 如果您要导入模块,请确保它存在于您的工作区中或包含在 python.autoComplete.extraPaths 设置中的位置中。
  • 如果您要导入未安装的软件包,您可以通过在激活的终端中运行以下命令来安装它:python -m pip install {package_name}
  • 如果您要导入已安装在其他解释器或内核中的软件包,请 选择正确的解释器
  • 如果您使用的是可编辑安装,并且它当前设置为使用导入钩子,请考虑切换到仅包含文件路径的 .pth 文件,以提高兼容性并确保更流畅的导入行为。在 Pyright 文档 中了解更多信息。

importCycleDetected

当 Pylance 检测到两个或多个模块之间存在循环依赖关系时,会发生此错误。

如何修复它

尝试重新排序您的导入语句以打破循环依赖关系。


可以通过 python.analysis.diagnosticSeverityOverrides 设置自定义 Pylance 诊断的严重程度。查看 设置参考 以了解更多信息。

后续步骤

  • 代码整理 - 启用、配置和应用各种 Python 代码整理程序。
  • 调试 - 学习在本地和远程调试 Python。
  • 测试 - 配置测试环境,发现、运行和调试测试。
  • 基本编辑 - 了解功能强大的 VS Code 编辑器。
  • 代码导航 - 快速浏览您的源代码。
  • IntelliSense - 了解 IntelliSense 功能。
  • Jupyter 支持 - 学习如何开始使用 Jupyter Notebooks。
  • Python 扩展模板 - 创建扩展以集成您最喜欢的 Python 工具。