在Visual Studio Code中编辑Python

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

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

自动补全和智能感知

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

IntelliSense的Hello World示例

自动完成和智能感知功能适用于当前工作文件夹内的所有文件。它们也适用于安装在标准位置的Python包。

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

Pylance 基于微软的 Pyright 静态类型检查工具,利用 类型存根.pyi 文件)和惰性类型推断,提供高效的开发体验。

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

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

自定义 IntelliSense 行为

默认启用全套IntelliSense功能可能会使您的开发体验变慢,因此Python扩展启用了一组最小功能,使您能够高效工作,同时仍保持良好的性能体验。但是,您可以通过多个设置自定义分析引擎的行为,以满足您的喜好。

启用自动导入

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

你可以通过在设置中将python.analysis.autoImportCompletions设置为true来启用自动导入。默认情况下,自动导入是禁用的。

建议列表中显示的自动导入完成

为自定义包位置启用IntelliSense

要为安装在非标准位置的包启用IntelliSense,请将这些位置添加到settings.json文件中的python.analysis.extraPaths集合中(默认集合为空)。例如,如果您使用Flask,您可能已将Google App Engine安装在自定义位置,并在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扩展来生成代码,或者从它生成的代码中学习。

VS Code 市场中的 GitHub Copilot 扩展

GitHub Copilot 为多种语言和广泛的框架提供建议,尤其适用于 Python、JavaScript、TypeScript、Ruby、Go、C# 和 C++。

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

导航

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

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

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

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

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

快速修复

添加导入

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

添加导入代码操作

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

常见包缩写

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

搜索额外的导入匹配

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

搜索额外的导入匹配代码操作

更改拼写

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

由于拼写错误导致的导入缺失时的更改拼写代码操作

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

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

重构

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

提取变量

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

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

重构变量

提取方法

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

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

将代码重构为方法

重命名模块

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

要自定义需要更新的引用,您可以在重构预览中切换行或文件级别的复选框。一旦您做出了选择,您可以选择应用重构放弃重构

重命名模块

移动符号

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

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

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

移动符号重构选项

实现所有继承的抽象类

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

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

实现继承的抽象类

排序导入

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

你可以通过安装一个支持排序导入的扩展来调用此功能,然后打开命令面板(⇧⌘P (Windows, Linux Ctrl+Shift+P))并运行Organize Imports

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

排序导入语句

故障排除

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

Problem Cause Solution
Pylance is only offering top-level symbol options when adding imports. By default, only top-level modules are indexed (depth=1).
For example, you may see import matplotlib as a suggestion, but not import matplotlib.pyplot by default.
Try increasing the depth to which Pylance can index your installed libraries through the python.analysis.packageIndexDepths. Check code analysis settings.
Pylance is not automatically adding missing imports The auto import completion setting may be disabled. Check the Enable Auto Imports section.
Auto imports are enabled but Pylance is not automatically importing symbols defined in other files in the workspace. User defined symbols (those not coming from installed packages or libraries) are only automatically imported if they have already been used in files opened in the editor.
Otherwise, they will only be available through the add imports Quick Fix.
Use the add imports Quick Fix, or make sure to open the relevant files in your workspace first.
Pylance seems slow or is consuming too much memory when working on a large workspace. Pylance analysis is done on all files present in a given workspace. If there are subfolders you know can be excluded from Pylance's analysis, you can add their paths to the python.analysis.exclude setting. Alternatively, you can try setting python.analysis.indexing to false to disable Pylance's indexer (Note: this will also impact the experience of completions and auto imports. Learn more about indexing in code analysis settings).
You are unable to install a custom module into your Python project. The custom module is located in a non-standard location (not installed using pip). Add the location to the python.autoComplete.extraPaths setting and restart 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文档

检测到导入循环

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

如何修复它

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


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

下一步