在 Visual Studio Code 中编辑 Python
Visual Studio Code 是一个功能强大的 Python 源代码编辑工具。该编辑器包含各种功能,可帮助您在编写代码时提高效率。有关 Visual Studio Code 中编辑的更多信息,请参阅基本编辑和代码导航。
在本概述中,我们将介绍Python 扩展提供的特定编辑功能,包括如何通过用户和工作区设置自定义这些功能的步骤。
自动完成和智能感知
智能感知是与代码完成相关的代码编辑功能的通用术语。花点时间看看下面的示例。当输入 print 时,请注意智能感知如何填充自动完成选项。当用户开始键入名为 greeting 的变量时,也会为其提供一个选项列表。
当前工作文件夹中的所有文件都提供自动完成和智能感知。它们也适用于安装在标准位置的 Python 包。
Pylance 是 VS Code 中 Python 的默认语言服务器,与 Python 扩展一起安装以提供智能感知功能。
Pylance 基于 Microsoft 的Pyright 静态类型检查工具,利用类型存根(.pyi
文件)和惰性类型推断来提供高性能的开发体验。
有关智能感知的更多信息,请参阅智能感知。
提示:查看VS Code 的 IntelliCode 扩展。IntelliCode 为 Python 中的智能感知提供了一组 AI 辅助功能,例如根据当前代码上下文推断最相关的自动完成。有关更多信息,请参阅VS Code 的 IntelliCode 常见问题解答。
自定义智能感知行为
默认启用全部智能感知功能可能会导致您的开发体验变慢,因此 Python 扩展启用了一组最少的功能,让您在保持高性能体验的同时提高工作效率。但是,您可以通过多个设置根据自己的喜好自定义分析引擎的行为。
启用自动导入
Pylance 为您的工作区中的模块和您环境中安装的包提供自动导入建议。当您在编辑器中键入时,可能会收到完成建议。当您接受建议时,自动导入会自动将相应的导入语句添加到您的文件中。
您可以通过将 python.analysis.autoImportCompletions
设置为 true
来启用自动导入。默认情况下,自动导入处于禁用状态。
为自定义包位置启用智能感知
要为安装在非标准位置的包启用智能感知,请将这些位置添加到 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" ]
有关可用智能感知控件的完整列表,您可以参考 Python 扩展代码分析设置和自动完成设置。
您还可以自定义自动完成和智能感知的通用行为,甚至完全禁用这些功能。您可以在自定义智能感知中了解更多信息。
使用 AI 增强补全
GitHub Copilot 是一个由人工智能驱动的代码完成工具,可帮助您更快、更智能地编写代码。您可以使用 VS Code 中的GitHub Copilot 扩展来生成代码,或从其生成的代码中学习。
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 时,添加导入快速修复功能使您能够快速完成环境中已安装模块的导入语句。当您开始在编辑器中键入包名称时,代码操作可用于自动完成源代码行。将鼠标悬停在文本(用波浪线标记)上并选择代码操作灯泡。然后,您可以从潜在导入列表中进行选择。
此代码操作还识别以下常见 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 扩展支持实现排序导入功能的扩展,例如isort和Ruff。此命令将同一模块中的特定导入合并为一个 import
语句,并按字母顺序组织 import
语句。
您可以通过安装支持排序导入的扩展,然后打开命令面板(⇧⌘P (Windows, Linux Ctrl+Shift+P))并运行组织导入来调用此命令。
提示:您可以为
editor.action.organizeImports
命令分配键盘快捷方式。
故障排除
有关常见智能感知和 Python 编辑问题的帮助,请查看下表
问题 | 原因 | 解决方案 |
---|---|---|
Pylance 在添加导入时只提供顶级符号选项。 | 默认情况下,只索引顶级模块(深度=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 检测到两个或多个模块之间存在循环依赖时,就会发生此错误。
如何修复
尝试重新排列导入语句以打破循环依赖。
Pylance 诊断的严重性可以通过 python.analysis.diagnosticSeverityOverrides
设置进行自定义。有关更多信息,请查看设置参考。
后续步骤
- 代码检查 - 启用、配置和应用各种 Python 代码检查器。
- 调试 - 了解如何在本地和远程调试 Python。
- 测试 - 配置测试环境以及发现、运行和调试测试。
- 基本编辑 - 了解功能强大的 VS Code 编辑器。
- 代码导航 - 快速浏览您的源代码。
- 智能感知 - 了解智能感知功能。
- Jupyter 支持 - 了解如何开始使用 Jupyter Notebooks。
- Python 扩展模板 - 创建一个扩展来集成您最喜欢的 Python 工具。