VSCode autopep8 扩展的使用和设置说明
关注 1800
VSCode autopep8 扩展
VSCode 的扩展autopep8为 Python 代码提供了格式化功能,该功能的实现主要通过包autopep8完成,在默认情况下,包autopep8已经包含在扩展autopep8中,因此不必通过 pip 另行安装。
autopep8 扩展何时被激活?
如果autopep8扩展没有被禁用,那么当你在 VSCode 中打开任何被解析为 Python 语言的代码文件(比如,常见的py文件)时,或者 VSCode 在启动过程中检测到工作区根目录存在名称为pyproject.toml,setup.cfg,tox.ini,.pep8,.flake8的文件时,autopep8扩展将被激活。
配置 VSCode
关于如何为 VSCode 指定默认的 Python 格式化程序,你可以查看安装 VSCode 扩展 autopep8,Black Formatter一段。
设置 autopep8 扩展
和大部分的 VSCode 扩展一样,扩展autopep8为开发人员提供了设置项,你可以通过编辑工作区.vscode文件夹中的setting.json文件,或在设置面板中编辑相关项,来调整和改变扩展autopep8所实现的某些功能。
设置执行 autopep8 包时的选项和参数
autopep8扩展的设置项autopep8.args是一个包含选项和参数信息的数组(其默认值为[]),每一个选项,参数或参数值都应作为字符串存储在数组中,他们将被传递给autopep8包,以改变 Python 代码文件的格式化效果,或实现额外功能。下面给出了部分参数的简单说明,另外一些相对重要的参数将在稍后详细介绍。
- --verbose 参数
如果给出了
--verbose参数,那么autopep8包将在格式化代码的过程中,反馈更多的消息(比如,报告已发现的代码中的问题),这些消息可在输出面板的autopep8一项查看。- --experimental 参数
如果给出了
--experimental参数,那么autopep8包将启用一些实验性的修复(格式化)功能,由于尚在实验阶段,这些功能可能并不稳定。
{
"autopep8.args": [
// 反馈更多的信息
"--verbose",
// 启用实验性修复功能
"--experimental",
],
}自定义需要修复的问题(格式化规则)
为autopep8扩展的autopep8.args设置项添加--select参数,并指定需要修复的问题的编码,autopep8包将仅修复指定的问题。为autopep8扩展的autopep8.args设置项添加--ignore参数,并指定需要忽略的问题的编码,autopep8包将不会修复忽略的问题。
需要指出,如果已经给出了--select参数,那么--ignore参数不会生效。
如何书写代码问题编码?
autopep8扩展中的代码问题编码,一般由字母W或E跟随三个数字构成,其中W表示警告,E表示错误,W和E可以小写。如果书写多个问题编码则需要使用,分隔,比如"autopep8.args":["--select","W292,E501,E502"]。
此外,你可以仅书写编码开头的一个或两个数字,以表示多个问题编码的组合,比如,E2表示所有以E2开头的问题编码,E30表示所有以E30开头的问题编码。
如何查看代码问题编码的具体含义?
autopep8扩展使用pycodestyle包,来检查 Python 代码中存在的问题,而上述“代码问题编码”的具体含义可通过autopep8或pycodestyle的相关链接查看。
{
"autopep8.args": [
// 仅针对与空白有关的问题进行修复
"--select", "W2",
// 由于给出了 --select,因此 --ignore 不会有任何效果
"--ignore", "E2",
],
}设置每行代码的最大长度
为autopep8扩展的autopep8.args设置项添加--max-line-length参数,可以设置 Python 代码文件每行代码的最大长度(默认为79),如果一行代码超出了的最大长度,那么扩展autopep8将尝试在合适的位置插入\并换行。
如果通过自定义autopep8扩展需要修复的问题,将问题E501排除,那么--max-line-length参数将被忽略,因为autopep8不再检查行是否超出最大长度。
{
"autopep8.args": [
// 单行代码的最大长度
"--max-line-length", "40",
// --max-line-length 参数将被忽略,因为不检查行是否超出最大长度
"--ignore", "E501",
],
}使用更激进的修复(格式化)策略
为autopep8扩展的autopep8.args设置项添加一个或多个--aggressive参数,可以让autopep8包使用更为激进的修复策略,autopep8.args设置项中包含的--aggressive参数的个数,决定了激进的级别,级别越高则被修复的问题越多。比如,"autopep8.args":["--aggressive","--aggressive"]可以让autopep8包修复编码为E712的问题,类似于ok==True这样的表达式可能被修改为ok。
如果你设置了--select或--ignore参数,那么--aggressive参数涉及的问题需要位于被修复的范围之内,否则他将被忽略。如果直接在--select参数中指定需要特定激进级别的问题的编码,而没有给出--aggressive参数,那么问题同样将被忽略。
{
"autopep8.args": [
// 问题 E712 需要的激进级别为 2
"--aggressive", "--aggressive",
// 问题 E712 不会被修复,因为他被 --ignore 排除
"--ignore", "E712",
],
}{
"autopep8.args": [
// 激进的级别为 1
"--aggressive",
// 问题 E712 不会被修复,因为需要的激进级别为 2
"--select", "E712",
],
}设置修复(格式化)范围
为autopep8扩展的autopep8.args设置项添加--line-range参数,并给出开始行号(文件第一行的行号为1)和结束行号(不能小于开始行号),可以指定 Python 代码文件中的哪些行的代码被修复(格式化),这包括开始行号和结束行号指示的行。
除了使用--line-range参数设置修复范围,你还可以通过在 Python 代码文件中添加注释# autopep8: off,# autopep8: on,来关闭或开启autopep8对之后代码的修复功能。
{
"autopep8.args": [
// 仅文件的第一行和第二行被修复
"--line-range", "1", "2",
],
}# autopep8: off
# autopep8 修复功能已经关闭,本行和之后的行不会被修复
num=12
# autopep8: on
# autopep8 修复功能已经开启,本行和之后的行将被修复
num=12设置 autopep8 扩展的当前工作目录
autopep8扩展的设置项autopep8.cwd包含了路径信息,用于设置运行autopep8时,命令行的当前工作目录。默认情况下,设置项autopep8.cwd的值为${workspaceFolder},即 VSCode 工作区的根目录,如果设置为${fileDirname},则将被格式化 Python 代码文件所在的目录作为命令行的当前工作目录。
当然,autopep8.cwd可以包含绝对路径或相对路径,其中相对路径是相对于 VSCode 可执行文件所在的目录。
autopep8.cwd 设置项的作用
在大多数情况下,修改设置项autopep8.cwd不会改变autopep8扩展的运行效果,但他可能会影响 Python 的模块搜索路径,由于为命令行指定了不同的工作目录。
autopep8.cwd 设置项所指向的目录必须是存在的
如果扩展autopep8的设置项autopep8.cwd指向了一个不存在的目录,那么将引发异常,其相关信息可在输出面板的autopep8一项查看。
下面的设置项autopep8.cwd,包含了一个 Windows 路径。
{
// 将工作区根目录的 my_src 文件夹,设置为运行扩展 autopep8 时,命令行的当前工作目录
"autopep8.cwd": "${workspaceFolder}\\my_src",
}设置启动 Python 解释器的命令
autopep8扩展的设置项autopep8.interpreter是一个数组,用于设置autopep8扩展启动 Python 解释器的命令,默认值为[],表示启动当前默认的 Python 解释器,如果多个解释器各自拥有不同版本的autopep8包,那么使用他们可能得到不同的格式化结果。当autopep8.interpreter表示的命令包含其他项(比如,参数,选项)时,则每个项应作为字符串存储在数组中。
autopep8.interpreter 设置项仅影响自身
这是理所当然的,autopep8.interpreter设置项仅对autopep8扩展有效,其他与 Python 相关的扩展可能依然依赖于默认的 Python 解释器,除非他们愿意主动根据一个名称为autopep8.interpreter的设置项,来选择自己的解释器。
配置 VSCode
关于如何为 VSCode 设置默认的 Python 解释器,你可以查看安装 VSCode 扩展 Python一段。
下面的设置项autopep8.interpreter,包含了一个 Windows 路径。
{
// 将文件夹 python-3.11.0 中的 python.exe 设置为运行 autopep8 包的解释器
"autopep8.interpreter": [
"…\\python-3.11.0\\python.exe"
],
}设置运行 autopep8 包的命令
autopep8扩展的设置项autopep8.path是一个数组,用于设置运行autopep8包的命令,该命令会在命令行运行,命令中的每一项应作为字符串存储在数组中,比如,["python","-m","autopep8"]表示在命令行运行python -m autopep8。autopep8.path的默认值为[],他表示autopep8扩展将自行确定如何运行 Python 包autopep8。
autopep8.path 设置项会覆盖 autopep8.interpreter 设置项
如果你同时给出了有效的设置项autopep8.interpreter和autopep8.path,那么运行autopep8包所用到的 Python 解释器,将由autopep8.path提供的命令来决定。
下面的设置项autopep8.path,包含了一个 Windows 路径。
{
// 使用文件夹 python-3.10.10 中的 python.exe 运行 autopep8 包
"autopep8.path": [
"…\\python-3.10.10\\python.exe",
"-m",
"autopep8"
],
}设置导入 autopep8 包的策略
autopep8扩展的设置项autopep8.importStrategy,用于设置autopep8包的导入策略,其有效值包含以下两种。
- useBundled 策略
useBundled策略是autopep8.importStrategy设置项的默认值,他表示始终尝试使用autopep8扩展捆绑(自带)的autopep8包。- fromEnvironment 策略
fromEnvironment策略表示使用所选择的 Python 解释器原本拥有的autopep8包,如果不存在,则使用autopep8扩展捆绑(自带)的autopep8包。
fromEnvironment与useBundled之前的区别,主要是对应 Python 模块搜索路径的不同。事实上,useBundled策略也会尝试使用 Python 解释器原本拥有的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设置项不再有效。
{
// 设置优先使用 Python 解释器原本拥有的 autopep8 包
"autopep8.importStrategy": "fromEnvironment",
}源码
settings.json·codebeatme/python·GitHub
hello.py·codebeatme/python·GitHub