在 Visual Studio Code 中编辑 Python
Visual Studio Code 是一个功能强大的 Python 源代码编辑工具。编辑器包含各种功能,可帮助您在编写代码时提高效率。有关 Visual Studio Code 中编辑的更多信息,请参阅基本编辑功能和代码导航。
在本概述中,我们将介绍由Python 扩展提供的特定编辑功能,包括如何通过用户和工作区设置自定义这些功能的步骤。
自动补全和 IntelliSense
IntelliSense 是与代码补全相关的代码编辑功能的通用术语。请花一些时间查看下面的示例。当键入 print 时,请注意 IntelliSense 如何填充自动补全选项。当用户开始键入名为 greeting 的变量时,也会看到一个选项列表。
当前工作文件夹中的所有文件都提供自动补全和 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
来启用自动导入。默认情况下,自动导入是禁用的。
为自定义包位置启用 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 扩展生成代码,或从它生成的代码中学习。
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
命令分配键盘快捷方式。
故障排除
如需有关常见 IntelliSense 和 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 编辑器。
- 代码导航 - 快速浏览源代码。
- IntelliSense - 了解 IntelliSense 功能。
- Jupyter 支持 - 了解如何开始使用 Jupyter Notebooks。
- Python 扩展模板 - 创建一个扩展来集成您喜欢的 Python 工具。