URLhttps://learnscript.net/zh/python/development-tools/vscode/autopep8/
    复制链接转到说明  示例

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

    我被代码海扁署名-非商业-禁演绎
    阅读 15:17·字数 4588·发布 

    VSCode autopep8 扩展

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

    autopep8 扩展何时被激活?

    如果autopep8扩展没有被禁用,那么当你在 VSCode 中打开任何被解析为 Python 语言的代码文件(比如,常见的py文件)时,或者 VSCode 在启动过程中检测到工作区根目录存在名称为pyproject.tomlsetup.cfgtox.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包将启用一些实验性的修复(格式化)功能,由于尚在实验阶段,这些功能可能并不稳定。

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

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

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

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

    如何书写代码问题编码?

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

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

    如何查看代码问题编码的具体含义?

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

    autopep8 · PyPI

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

    设置每行代码的最大长度

    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",
    	],
    }

    使用更激进的修复(格式化)策略

    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",
    	],
    }

    设置修复(格式化)范围

    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

    设置 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 路径。

    settings.json
    {
    	// 将工作区根目录的 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 路径。

    settings.json
    {
    	// 将文件夹 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 autopep8autopep8.path的默认值为[],他表示autopep8扩展将自行确定如何运行 Python 包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"
    	],
    }

    设置导入 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.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