Python程序员Visual Studio Code指南3 编辑代码

3 编辑代码

Visual Studio Code提供了许多适用于所有编程语言的标准编辑功能。

  • 快速修复
  • 代码补全
  • 定义
  • 声明
  • 格式化
  • 语法
  • 重构
  • 代码片段

这些内置的编辑功能减少了编辑代码所需的手动任务和键入次数,从而节省了时间。

Python扩展扩展了代码编辑功能。有了Python扩展,导入库只需极少的工作量,因为该扩展可以建议将已安装的软件包导入程序。更常见的是,只需输入几个字符,编辑器就能自动完成代码行,提供定义,甚至定位声明。

无论你喜欢autopep8、Black还是YAPF,你都可以设置所需的格式器并自定义设置,以确保源代码的格式符合你的喜好。运行Python代码时,linting会分析代码的运行情况,并在"问题"面板中输出错误。如果你发现需要重构 Python程序,可以使用提取变量、方法和分类导入的命令。此外,你还可以使用代码片段来节省时间,避免手动输入重复的代码模式。

本章将在一个名为circle_area.py的脚本中探讨每种编辑功能,该脚本使用数学模块计算圆的面积。在尝试本章的示例之前,请在合适的项目文件夹中新建一个名为circle_area.py的Python文件。

3.1 快速修复

快速修复有助于解决由警告或错误发现的问题。如果有潜在的解决方案,Visual Studio Code会在源代码下显示一条蓝色斜线,并在编辑器左侧空白处显示一个灯泡图标。点击灯泡会显示快速修复选项或执行操作。

除了Visual Studio Code默认提供的快速修复功能外,从市场安装的扩展也可能包含自己的快速修复功能。例如,Python扩展有添加导入的快速修复功能,可以快速完成导入语句。当你开始在编辑器中键入软件包名称时,你会发现出现了快速修复工具来自动完成导入语句。选择灯泡图标会显示导入建议列表。首先列出的是包的导入语句,其次是指定包中其他模块和/或成员(类、对象等)的语句。

此功能需要使用Microsoft Python语言服务器。要启用语言服务器,请在settings.json文件中设置"python.jediEnabled":false。

添加导入快速修复要求环境中已安装要导入的模块。

试用:在编辑器中输入 math,调用添加导入快速修复。选择代码动作(如灯泡)。Visual Studio Code 建议将 import math。选择将导入语句添加到代码中。

add imports Code Action 还能识别下列Python包的其他常用缩写: NumPy缩写为np,TensorFlow缩写为 tf,pandas缩写为 pd,matplotlib.pyplot缩写为 plt,matplotlib 缩写为mpl,SciPi缩写为 spio,SciPy 缩写为sp。

3.2 代码自动完成、定义和声明

智能提示(IntelliSense)是微软用来识别各种有用的编程辅助工具的名称,如代码自动完成、对象定义以及对象或变量声明的位置。按下 Ctrl+spacebar 或键入触发字符(如 Python 中的点字符)即可触发此类功能。

当你键入时,Python扩展会根据Python语义和对源代码的分析提供智能代码补全。如果已知可能的补全,Visual Studio Code 会提供建议。

试试看:在circle_area.py,使用代码补全查看建议的Python方法。

在新的一行中,创建变量radius。该变量用于输入计算中使用的半径。
请注意,Visual Studio Code会在您键入的同时推荐一些方法。使用箭头键和Tab键选择float方法。

新建一行,创建area = variable。该变量包含计算圆面积的方程请求(A = π r2)。
方程中需要的π值可以在数学库中找到,即math.π。在区域=之后,开始键入m,注意VS代码提供了数学模块中的常量和函数列表。

使用箭头键滚动列表以找到pi。找到后,单击向右箭头查看对象类型。查看对象类型后,选择pi。
继续计算r2的面积方程。在编辑器中输入m.p,然后使用箭头键查找pow函数。找到后,选择函数。

添加一对括号后,编辑器将为函数的使用提供进一步指导。键入(为 pow函数添加一对小括号,以查看 Visual Studio 代码提供的进一步指导。

完成变量赋值,在打印区域添加打印语句并运行代码。

import math as m

radius = float(input('Radius: '))
area = ma.pi * (m.pow(radius, 2))
print(area

随着Python程序变得越来越复杂,跟踪源代码中声明对象或变量的位置就成了一项挑战。声明可以帮助您找到对象或变量的声明位置:只需将编辑光标放在对象或变量上,Visual Studio Code就会高亮显示对该对象或变量的所有引用,直至其声明。

3.3 格式化

格式化器可自动为代码格式化提供一致的风格,从而使开发人员将更多时间用于编写代码,而不必担心遵循风格指南的细枝末节。对于合作项目而言,格式化器还能减少因贡献者使用相同格式化器而产生的合并冲突,从而提供相似的风格。请看下面 for 循环的代码块,它从列表 numbers 中获取一个数字,然后乘以 2 :

numbers = [2, 4, 6, 8]

for num in numbers :
num = num * 2
print (num)

注意间距使用不当。在这种情况下,可以使用格式化器按照定义的样式指南自动格式化代码。例如autopep8 格式化器会将代码格式化如下:

numbers = [2, 4, 6, 8]

for num in numbers:
num = num * 2
print(num)

随着程序越来越长,格式化器提供的格式自动化对开发人员的工作流程变得非常宝贵。

Visual Studio Code 的 Python 扩展支持以下格式器:

  • autopep8(默认)

按照PEP8样式指南格式化Python代码。autopep8利用了linting工具pycodestyle来确定代码的哪些部分需要格式化,并尝试修复。

  • Black

侧重于一致性,不可配置。与其他Python格式化工具相比,Black 提供的命令行选项很少。

  • YAPF

可配置,只专注于格式化代码。YAPF获取代码并将其重新格式化为符合样式指南的最佳格式,即使原始代码并未违反样式指南。YAPF不会修复语法错误。

选择一种格式化器还是另一种格式化器取决于个人喜好。如果你更愿意遵循PEP8样式指南,同时又能修复线程发现的问题,那么autopep8将是最适合你的格式化器。如果你更愿意配置一个格式化器来遵循你偏好的样式指南,按照样式指南来格式化你的代码,同时避免修复线程问题,那么YAPF将是你推荐的格式化器。但是,如果一致性是你的首要考虑因素,或者你使用的是相对较旧的代码库,缺乏格式化但需要一致的格式,那么最好使用Black。

要在Visual Studio Code中指定格式化器,首先必须安装格式化器,然后在Python扩展的设置中将其选为格式化提供程序。有关安装命令,请参阅以下列表:

autopep8- pip install pep8
Black- pip install black
YAPF- pip install yapf

选择格式化器时,Python扩展会在当前pythonPath中查找格式化器。如果格式化器安装在其他位置,可以在格式化器的自定义路径设置中指定位置。格式器的其他设置可在设置编辑器和 settings.json 文件中进行管理。要使用格式器,请使用以下键盘快捷键:

Mac: Shift+Option+F
Windows: Shift+Alt+F
Linux: Shift+Ctrl+I

3.3.1 在设置编辑器中编辑格式化设置

在设置编辑器中,从 Python➪格式化的下拉列表中选择格式化: 提供程序设置的下拉列表中选择格式化器。

自定义参数可通过单击相应格式器的"添加项"按钮添加。必须为参数输入字符串值。

如果格式化器没有安装在当前的pythonPath中,请在各格式化器的自定义路径设置中指定格式化器位置的完整路径。提供了YAPF格式化器的自定义路径。

3.3.2 编辑settings.json中的格式化设置

在settings.json文件中,可通过添加python.formatting.provider条目来指定格式器。支持的值有autopep8、black 和 yapf。下面是将 YAPF 设置为格式化器的示例条目:

"python.formatting.provider": "yapf"

自定义参数也可以添加到条目中。有关每个格式器的自定义参数设置,请参阅以下列表:

  • autopep8- python.formatting.autopep8Args
  • Black- python.formatting.blackArgs
  • YAPF- python.formatting.yapfArgs

对于自定义参数,命令行中用空格分隔的参数字符串的每个顶层元素必须是args列表中的一个单独项目。此处提供了YAPF的示例条目:

"python.formatting.yapfArgs": ["--style", "{based_on_style: google, spaces_before_comment: 4}"]

如果当前pythonPath中未安装格式化器,请添加条目,使用完整路径指定相应格式化器的位置。有关各格式器的自定义路径设置,请参阅以下列表:

autopep8- python.formatting.autopep8Path
Black- python.formatting.blackPath
YAPF- python.formatting.yapfPath

以下是 YAPF 的示例条目:

"python.formatting.yapfPath": "c:/yapfPath/yapf.exe"

参考资料

3.4 Linting

正如我们所预料的那样,要想在运行代码前始终输入无误的代码或捕捉到所有可能的错误几乎是不可能的。Linting可以分析代码的运行方式,并在输入时检测潜在的错误。下面是函数fullname的代码块,它返回函数调用中传递的参数的连接值:

def fullname(fname, lname):
return fname + " " + lname

print(name("April", "Speight"))

打印语句中的函数调用使用了错误的函数调用名称。

有多种可启用的linter可供使用。不过,如果你选择在不使用linter的情况下编写代码,并不要求启用linter。如果启用了衬着器,每当保存文件时,衬着器就会自动运行。您也可以在任何时候使用Python.Run Linting 命令手动调用linter。

3.4.1 启用和禁用着色

Visual Studio Code 的 Python 扩展支持以下linter:

  • Pylint(默认)- 检查错误并尝试执行编码标准
  • Flake8-根据PEP8中的风格约定、编程错误和循环复杂性检查代码
  • mypy-检查可选择执行的静态类型
  • pydocstyle-检查是否符合Python文档字符串约定
  • pycodestyle (pep8)-根据PEP 8中的一些样式约定检查Python代码
  • prospector-分析Python代码并输出有关错误、潜在问题、违反约定和复杂性的信息
  • pylama-多个 Python 工具(pycodestyle、ydocstyle、PyFlakes、Mccabe、Pylint、Radon、gjslint、elate、mypy)的封装器
  • Bandit-查找 Python 代码中常见的安全问题

Pylint是默认的内联程序,因此在创建新Python程序时会启用。不过,如果Visual Studio Code没有检测到已启用的内核,就会显示安装Pylint的提示。

您可以使用命令面板上的 Python 命令选择启用不同的linter: Select Linter(选择内核)。从列表中选择一个接口,安装其软件包并在环境中启用该接口。

如果不需要Linter,可设置"python.linting.enabled": false。

3.4.2 Run Linting

运行linter(默认运行)时,结果会显示在 "问题"面板中,具体问题会在代码编辑器中以下划线标出。要查看编辑器中的详细信息,请将鼠标悬停在有下划线的问题上。

试试看 在 circle_area.py 文件中创建一个语法错误,这样该错误就会被校验程序检测到,并显示在 "问题 "面板中。

3.4.2 Linting

既可以在全局范围内,也可以针对每个字段修改着色设置。你可以在 settings.json 文件中应用所有设置更改。接下来提供的是全局设置,通过修改这些设置,可以在所有启用的词检器中改变词检行为。

如果启用了lintOnSave,可能还需要启用通用的files.autoSave选项。自动保存会在配置的延迟后或焦点离开编辑器时保存更改。如果启用了自动保存,就无需手动保存文件。结合使用lintOnSave和files.autoSave,就能在输入代码的同时频繁地获得语法检查反馈。

设置的更多信息,请访问 code.visualstudio.com/docs/python/linting#_specific-linters。

3.5 重构

重构的目的是在保持功能的同时改进程序的内部结构或架构。重构应该是程序更新或添加新功能之前的一项常规任务。重构的好处包括提高稳定性和性能、降低复杂性、减少测试和查找错误的时间。

虽然您可以手动重构代码,但对于冗长的程序来说,这样的任务会变得非常繁重。幸运的是,Visual Studio Code提供了三种命令来帮助快速进行修改。

  • 提取变量
  • 提取方法
  • 分类导入

每条命令都可以从 "命令调板 "或右键单击选区时出现的上下文菜单中调用。

重构需要Rope库,可以使用 pip install rope 或 conda install -c anaconda rope 安装。

3.5.1 提取变量

如果您发现代码中多处使用了相同的常量值或表达式,例如相同的字符串或数字,请考虑提取所有类似的情况并用变量替换。Extract Variable(Python 重构:提取变量命令提供了这样的功能。调用时,新变量将被命名为 newvariableNNN,其中NNN 是随机数。

3.5.2 提取方法

Extract Method 命令 (Python Refactor: Extract Method) 提取所选表达式或代码块的所有类似出现,创建一个方法,并用方法调用替换表达式。新方法的名称是 newmethodNNN,其中NNN是随机数。

试试看 circle_area.py 中 import 语句之后的所有代码都可以重构为一个方法。将代码重构为方法。

3.5.3 使用 Sort Imports 按字母顺序对所有导入语句进行合并和排序。

3.6 代码片段

如果发现自己在一个文件或多个文件中重复使用一种代码模式,可以考虑将该模式放入代码片段中。片段是代码模板,可以在输入时添加到编辑器中,从而减少创建程序所需的击键次数。Visual Studio Code 有许多内置代码片段。然而,语言扩展(如 Visual Studio Code 的 Python 扩展)通过提供一套标准的特定语言代码片段,进一步扩展了可用代码片段列表。

使用键盘快捷键 Ctrl+spacebar或插入片段命令可以调用片段。调用时,Visual Studio Code 会显示可用片段列表。从列表中选择一个片段,就可以将代码模板添加到编辑器中光标所在的行中。

试试看运行Insert Snippet命令,查看Python扩展提供的可用代码片段列表。

尽管 Python 扩展提供了各种通用的代码段,但您可能还是想为自己最常用的代码模式创建自己的代码段。

片段是在片段文件中以JSON 格式创建的。片段文件支持C风格注释,并可定义数量不限的片段。要创建片段,请导航至代码或选择文件 ➪ 首选项 ➪ 用户片段。出现提示时,选择Python作为语言。打开的python.json片段文件包含如何创建片段的说明。请务必在大括号内创建片段,完成后保存文件。

{
// Place your snippets for python here. Each snippet is defined
under a snippet name and has a prefix, body and
// description. The prefix is what is used to trigger the snippet
and the body will be expanded and inserted. Possible variables are:
// $1, $2 for tab stops, $0 for the final cursor position, and
${1:label}, ${2:another} for placeholders. Placeholders with the
// same ids are connected.
// Example:
// "Print to console": {
// "prefix": "log",
// "body": [
//
"console.log('$1');",
//
"$2"
// ],
// "description": "Log output to console"
// }
}

有关如何创建代码段的更多信息,请查看 code.visualstudio.com/docs/editor/userdefinedsnippets#_create-your-your-snippets。

posted @ 2023-08-21 08:58  磁石空杯  阅读(257)  评论(0编辑  收藏  举报