VSCode autopep8 延伸模組的使用和設定說明

閱讀 16:07·字數 4835·發佈 
Youtube 頻道
訂閱 133

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