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