VSCode autopep8 扩展的使用和设置说明

我被代码海扁署名-非商业-禁演绎
阅读 15:36·字数 4681·发布 
Bilibili 空间
关注 950

VSCode autopep8 扩展

VSCode 的扩展autopep8为 Python 代码提供了格式化功能,该功能的实现主要通过 Python 包autopep8完成,在默认情况下,包autopep8已经包含在扩展autopep8中,因此不必通过 pip 另行安装。

VSCode autopep8 扩展何时被激活?

如果autopep8扩展没有被禁用,那么当你在 VSCode 中打开任何被解析为 Python 语言的代码文件(比如,常见的py文件)时,或者 VSCode 在启动过程中检测到工作区根目录存在名称为pyproject.tomlsetup.cfgtox.ini.pep8.flake8的文件时,autopep8扩展将被激活。

配置 VSCode

关于如何为 VSCode 指定默认的 Python 格式化程序,你可以查看安装 VSCode 扩展 autopep8,Black Formatter一段。

设置 VSCode autopep8 扩展

和大部分的 VSCode 扩展一样,扩展autopep8为开发人员提供了设置项,你可以通过编辑工作区.vscode文件夹中的setting.json文件,或在 VSCode 的设置面板中编辑相关项,来调整和改变扩展autopep8所实现的某些功能。

设置 VSCode autopep8 扩展执行 Python autopep8 包时的选项和参数

autopep8扩展的设置项autopep8.args是一个包含选项和参数信息的数组(其默认值为[]),每一个选项,参数或参数值都应作为字符串存储在数组中,他们将被传递给autopep8包,以改变 Python 代码文件的格式化效果,或实现额外功能。下面给出了部分参数的简单说明,另外一些相对重要的参数将在稍后详细介绍。

--verbose 参数

如果给出了--verbose参数,那么autopep8包将在格式化代码的过程中,反馈更多的消息(比如,报告已发现的代码中的问题),这些消息可在 VSCode 的输出面板autopep8一项查看。

--experimental 参数

如果给出了--experimental参数,那么autopep8包将启用一些实验性的修复(格式化)功能,由于尚在实验阶段,这些功能可能并不稳定。

settings.json
{
	"autopep8.args": [
		// 反馈更多的信息
		"--verbose",
		// 启用实验性修复功能
		"--experimental",
	],
}

自定义 VSCode autopep8 扩展需要修复的问题(格式化规则)

autopep8扩展的autopep8.args设置项添加--select参数,并指定需要修复的问题的编码,autopep8包将仅修复指定的问题。为autopep8扩展的autopep8.args设置项添加--ignore参数,并指定需要忽略的问题的编码,autopep8包将不会修复忽略的问题。

需要指出,如果已经给出了--select参数,那么--ignore参数不会生效。

如何书写 VSCode autopep8 扩展的代码问题编码?

VSCodeautopep8扩展中的代码问题编码,一般由字母WE跟随三个数字构成,其中W表示警告,E表示错误,WE可以小写。如果书写多个问题编码则需要使用,分隔,比如"autopep8.args":["--select","W292,E501,E502"]

此外,你可以仅书写编码开头的一个或两个数字,以表示多个问题编码的组合,比如,E2表示所有以E2开头的问题编码,E30表示所有以E30开头的问题编码。

如何查看 VSCode autopep8 扩展的代码问题编码的具体含义?

autopep8扩展使用pycodestyle包,来检查 Python 代码中存在的问题,而上述“代码问题编码”的具体含义可通过autopep8pycodestyle的相关链接查看。

autopep8 · PyPI

settings.json
{
	"autopep8.args": [
		// 仅针对与空白有关的问题进行修复
		"--select", "W2",
		// 由于给出了 --select,因此 --ignore 不会有任何效果
		"--ignore", "E2",
	],
}

设置 VSCode autopep8 扩展所允许的每行代码的最大长度

autopep8扩展的autopep8.args设置项添加--max-line-length参数,可以设置 Python 代码文件每行代码的最大长度(默认为79),如果一行代码超出了的最大长度,那么扩展autopep8将尝试在合适的位置插入\并换行。

如果通过自定义autopep8扩展需要修复的问题,将问题E501排除,那么--max-line-length参数将被忽略,因为autopep8不再检查行是否超出最大长度。

settings.json
{
	"autopep8.args": [
		// 单行代码的最大长度
		"--max-line-length", "40",
		// --max-line-length 参数将被忽略,因为不检查行是否超出最大长度
		"--ignore", "E501",
	],
}

设置 VSCode autopep8 扩展使用更激进的修复(格式化)策略

autopep8扩展的autopep8.args设置项添加一个或多个--aggressive参数,可以让autopep8包使用更为激进的修复策略,autopep8.args设置项中包含的--aggressive参数的个数,决定了激进的级别,级别越高则被修复的问题越多。比如,"autopep8.args":["--aggressive","--aggressive"]可以让autopep8包修复编码为E712的问题,类似于ok==True这样的表达式可能被修改为ok

如果你设置了--select--ignore参数,那么--aggressive参数涉及的问题需要位于被修复的范围之内,否则他将被忽略。如果直接在--select参数中指定需要特定激进级别的问题的编码,而没有给出--aggressive参数,那么问题同样将被忽略。

settings.json
{
	"autopep8.args": [
		// 问题 E712 需要的激进级别为 2
		"--aggressive", "--aggressive",
		// 问题 E712 不会被修复,因为他被 --ignore 排除
		"--ignore", "E712",
	],
}
settings.json
{
	"autopep8.args": [
		// 激进的级别为 1
		"--aggressive",
		// 问题 E712 不会被修复,因为需要的激进级别为 2
		"--select", "E712",
	],
}

设置 VSCode autopep8 扩展的修复(格式化)范围

autopep8扩展的autopep8.args设置项添加--line-range参数,并给出开始行号(文件第一行的行号为1)和结束行号(不能小于开始行号),可以指定 Python 代码文件中的哪些行的代码被修复(格式化),这包括开始行号和结束行号指示的行。

除了使用--line-range参数设置修复范围,你还可以通过在 Python 代码文件中添加注释# autopep8: off# autopep8: on,来关闭或开启autopep8对之后代码的修复功能。

settings.json
{
	"autopep8.args": [
		// 仅文件的第一行和第二行被修复
		"--line-range", "1", "2",
	],
}
hello.py
# autopep8: off
# autopep8 修复功能已经关闭,本行和之后的行不会被修复
num=12
# autopep8: on
# autopep8 修复功能已经开启,本行和之后的行将被修复
num=12

设置 VSCode autopep8 扩展的当前工作目录

autopep8扩展的设置项autopep8.cwd包含了路径信息,用于设置运行autopep8时,命令行的当前工作目录。默认情况下,设置项autopep8.cwd的值为${workspaceFolder},即 VSCode 工作区的根目录,如果设置为${fileDirname},则将被格式化 Python 代码文件所在的目录作为命令行的当前工作目录。

当然,autopep8.cwd可以包含绝对路径或相对路径,其中相对路径是相对于 VSCode 可执行文件所在的目录。

VSCode autopep8 扩展的 autopep8.cwd 设置项的作用

在大多数情况下,修改设置项autopep8.cwd不会改变autopep8扩展的运行效果,但他可能会影响 Python 的模块搜索路径,由于为命令行指定了不同的工作目录。

VSCode autopep8 扩展的 autopep8.cwd 设置项所指向的目录必须是存在的

如果扩展autopep8的设置项autopep8.cwd指向了一个不存在的目录,那么将引发异常,其相关信息可在 VSCode 的输出面板autopep8一项查看。

下面的设置项autopep8.cwd,包含了一个 Windows 路径。

settings.json
{
	// 将工作区根目录的 my_src 文件夹,设置为运行扩展 autopep8 时,命令行的当前工作目录
	"autopep8.cwd": "${workspaceFolder}\\my_src",
}

设置 VSCode autopep8 扩展启动 Python 解释器的命令

autopep8扩展的设置项autopep8.interpreter是一个数组,用于设置autopep8扩展启动 Python 解释器的命令,默认值为[],表示启动当前默认的 Python 解释器,如果多个 Python 解释器各自拥有不同版本的autopep8包,那么使用他们可能得到不同的格式化结果。当autopep8.interpreter表示的命令包含其他项(比如,参数,选项)时,则每个项应作为字符串存储在数组中。

VSCode autopep8 扩展的 autopep8.interpreter 设置项仅影响自身

这是理所当然的,autopep8.interpreter设置项仅对autopep8扩展有效,其他与 Python 相关的扩展可能依然依赖于默认的 Python 解释器,除非他们愿意主动根据一个名称为autopep8.interpreter的设置项,来选择自己的 Python 解释器。

配置 VSCode

关于如何为 VSCode 设置默认的 Python 解释器,你可以查看安装 VSCode 扩展 Python一段。

下面的设置项autopep8.interpreter,包含了一个 Windows 路径。

settings.json
{
	// 将文件夹 python-3.11.0 中的 python.exe 设置为运行 autopep8 包的解释器
	"autopep8.interpreter": [
		"…\\python-3.11.0\\python.exe"
	],
}

设置 VSCode autopep8 扩展运行 Python autopep8 包的命令

autopep8扩展的设置项autopep8.path是一个数组,用于设置运行autopep8包的命令,该命令会在命令行运行,命令中的每一项应作为字符串存储在数组中,比如,["python","-m","autopep8"]表示在命令行运行python -m autopep8autopep8.path的默认值为[],他表示autopep8扩展将自行确定如何运行 Python 包autopep8

扩展 autopep8 的 autopep8.path 设置项会覆盖 autopep8.interpreter 设置项

如果你同时给出了有效的设置项autopep8.interpreterautopep8.path,那么运行autopep8包所用到的 Python 解释器,将由autopep8.path提供的命令来决定。

下面的设置项autopep8.path,包含了一个 Windows 路径。

settings.json
{
	// 使用文件夹 python-3.10.10 中的 python.exe 运行 autopep8 包
	"autopep8.path": [
		"…\\python-3.10.10\\python.exe",
		"-m",
		"autopep8"
	],
}

设置 VSCode autopep8 扩展导入 Python autopep8 包的策略

autopep8扩展的设置项autopep8.importStrategy,用于设置autopep8包的导入策略,其有效值包含以下两种。

useBundled 策略

useBundled策略是autopep8.importStrategy设置项的默认值,他表示始终尝试使用autopep8扩展捆绑(自带)的autopep8包。

fromEnvironment 策略

fromEnvironment策略表示使用所选择的 Python 解释器原本拥有的autopep8包,如果不存在,则使用autopep8扩展捆绑(自带)的autopep8包。

fromEnvironmentuseBundled之前的区别,主要是对应 Python 模块搜索路径的不同。事实上,useBundled策略也会尝试使用 Python 解释器原本拥有的autopep8包,当autopep8扩展捆绑(自带)的autopep8包不存在时,只不过这种可能性非常小。

扩展 autopep8 的 autopep8.path 设置项优先于 autopep8.importStrategy 设置项

如果你通过设置项autopep8.path给出了运行autopep8包的命令,并且该命令明确指出了autopep8包的位置,则优先使用该位置的autopep8包。比如,将autopep8.path设置为["python","…\\autopep8.py"],即通过 Python 直接执行某个文件夹下autopep8.py,当然,这个例子有些牵强,因为autopep8.py似乎与 Python 包的关系不大,并且直接执行py脚本文件,会导致autopep8.importStrategy设置项不再有效。

settings.json
{
	// 设置优先使用 Python 解释器原本拥有的 autopep8 包
	"autopep8.importStrategy": "fromEnvironment",
}

源码

settings.json·codebeatme/python·GitHub
hello.py·codebeatme/python·GitHub