VSCode autopep8 扩展的使用和设置说明
VSCode autopep8 扩展
VSCode 的扩展autopep8
为 Python 代码提供了格式化功能,该功能的实现主要通过 Python 包autopep8
完成,在默认情况下,包autopep8
已经包含在扩展autopep8
中,因此不必通过 pip 另行安装。
VSCode autopep8 扩展何时被激活?
如果autopep8
扩展没有被禁用,那么当你在 VSCode 中打开任何被解析为 Python 语言的代码文件(比如,常见的py
文件)时,或者 VSCode 在启动过程中检测到工作区根目录存在名称为pyproject.toml
,setup.cfg
,tox.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
包将启用一些实验性的修复(格式化)功能,由于尚在实验阶段,这些功能可能并不稳定。
{
"autopep8.args": [
// 反馈更多的信息
"--verbose",
// 启用实验性修复功能
"--experimental",
],
}
自定义 VSCode autopep8 扩展需要修复的问题(格式化规则)
为autopep8
扩展的autopep8.args
设置项添加--select
参数,并指定需要修复的问题的编码,autopep8
包将仅修复指定的问题。为autopep8
扩展的autopep8.args
设置项添加--ignore
参数,并指定需要忽略的问题的编码,autopep8
包将不会修复忽略的问题。
需要指出,如果已经给出了--select
参数,那么--ignore
参数不会生效。
如何书写 VSCode autopep8 扩展的代码问题编码?
VSCodeautopep8
扩展中的代码问题编码,一般由字母W
或E
跟随三个数字构成,其中W
表示警告,E
表示错误,W
和E
可以小写。如果书写多个问题编码则需要使用,
分隔,比如"autopep8.args":["--select","W292,E501,E502"]
。
此外,你可以仅书写编码开头的一个或两个数字,以表示多个问题编码的组合,比如,E2
表示所有以E2
开头的问题编码,E30
表示所有以E30
开头的问题编码。
如何查看 VSCode autopep8 扩展的代码问题编码的具体含义?
autopep8
扩展使用pycodestyle
包,来检查 Python 代码中存在的问题,而上述“代码问题编码”的具体含义可通过autopep8
或pycodestyle
的相关链接查看。
{
"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
不再检查行是否超出最大长度。
{
"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
参数,那么问题同样将被忽略。
{
"autopep8.args": [
// 问题 E712 需要的激进级别为 2
"--aggressive", "--aggressive",
// 问题 E712 不会被修复,因为他被 --ignore 排除
"--ignore", "E712",
],
}
{
"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
对之后代码的修复功能。
{
"autopep8.args": [
// 仅文件的第一行和第二行被修复
"--line-range", "1", "2",
],
}
# 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 路径。
{
// 将工作区根目录的 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 路径。
{
// 将文件夹 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 autopep8
。autopep8.path
的默认值为[]
,他表示autopep8
扩展将自行确定如何运行 Python 包autopep8
。
扩展 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"
],
}
设置 VSCode autopep8 扩展导入 Python 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 的 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