autopep8 自動格式化 Python 程式碼以符合 PEP 8 風格指南。它使用 pycodestyle 實用程式來決定程式碼的哪些部分需要格式化。 autopep8 能夠修復 pycodestyle 報告的大多數格式問題。
內容
安裝
要求
用法
特徵
更進階的用法
逐行禁用
作為模組使用
配置
pyproject.toml
與預提交一起使用
測試
故障排除
pkg_resources.DistributionNotFound
連結
來自點:
$ pip install --升級 autopep8
考慮使用--user
選項。
autopep8 需要 pycodestyle。
就地修改文件(使用激進等級 2):
$ autopep8 --in-place --aggressive --aggressive <檔名>
在運行 autopep8 之前。
import math, sys;def example1():####這是一個很長的註解。應將其換行以適合72 個字元。 math .pi, 100,200,300,9876543210,'這是一個很長的字串'],'more':{'inner':'這整個邏輯行應該被換行。 , 60000000000000000]}}return (some_tuple, some_variable)def example2(): return {'has_key() 已棄用':True}.has_key({'f':2}.has_key(''));class Example3(''));class Example3(''));class Example3(''));class Example3('')); object ) :def __init__ ( self, bar ): #註解在雜湊後面應該有一個空格。如果條:條+=1; 條=條*條; return bar else:some_string = """ 不應修改多行字串中的縮排。只應重新縮排實際程式碼。"""return (sys.path, some_string)
運行 autopep8 後。
import mathimport sysdef example1():# 這是一個很長的註解。應將其包裝在72# 字元內。 math .pi,100,200,300,9876543210,'這是一個很長的字串'],'more': {'inner': '這整個邏輯行應該被包裝。 , 60000000000000000]}}return (some_tuple, some_variable)def example2(): return ('' in {'f': 2}) in {'has_key() is deprecated':}class Example3(object):def __ self , bar):# 註解在hash 後應有一個空格。實際程式碼。
選項:
用法:autopep8 [-h] [--版本] [-v] [-d] [-i] [--全域設定檔名] [--ignore-local-config] [-r] [-j n] [-p n] [-a] [--實驗] [--排除 glob] [--list-fixes] [--忽略錯誤] [--選擇錯誤] [--最大行長度n] [--line-range 行線] [--hang-close] [--exit-code] [文件[文件...]] 自動格式化 Python 程式碼以符合 PEP 8 風格指南。 位置參數: 文件 要格式化的文件或“-”表示標準 可選參數: -h, --help 顯示此說明訊息並退出 --version 顯示程式的版本號並退出 -v, --verbose 列印詳細訊息;多個 -v 會產生更多 詳細訊息 -d, --diff 列印固定來源的差異 -i, --in-place 對文件進行適當的更改 --全域設定檔名 全域 pep8 設定檔的路徑;如果這個文件有 不存在則忽略(預設值: 〜/.config/pep8) --忽略本機配置 不要查找並應用本機設定檔;如果不 通過,預設值將使用中的任何設定檔進行更新 專案的根目錄 -r, --recursive 在目錄上遞迴運作;必須與 --in-place 或 --diff -j n, --jobs n 平行作業數;如果值為,則符合 CPU 計數 小於 1 -p n, --pep8-passes n 額外 pep8 傳遞的最大數量(預設值: 無限) -a, --aggressive 啟用非空白變更;多個 -a 結果為 更激進的改變 --experimental 啟用實驗性修復 --exclude globs 排除與這些逗號相符的檔案/目錄名稱- 分離的球體 --list-fixes 列出修復程式碼;由 --ignore 和 --select 使用 --ignore errors 不會修復這些錯誤/警告(預設值: E226、E24、W50、W690) --select錯誤僅修復這些錯誤/警告(例如E4,W) --max-line-length n 設定允許的最大行長度(預設值:79) --line-range 線 線, --range 線 線 僅修復在此包含範圍內發現的錯誤 行號(例如 1 99);行號索引於 1 --hang-close 掛起關閉選項傳遞給 pycodestyle --exit-code 更改退出程式碼的行為。預設行為 傳回值,0為無差異,1為錯誤退出。 新增此選項時返回2。 2 存在 差異。
autopep8 修正了 pycodestyle 回報的以下問題:
E101 - 重新縮排所有行。 E11 - 修復縮排。 E121 - 將縮排修復為四的倍數。 E122 - 為懸掛縮排添加缺少的縮排。 E123 - 將右括號與左括號對齊。 E124 - 對齊右括號以符合視覺縮排。 E125 - 縮排以區分行與下一個邏輯行。 E126 - 修復過度縮排的懸掛縮排。 E127 - 修復視覺凹痕。 E128 - 修復視覺凹痕。 E129 - 修復視覺凹痕。 E131 - 修復未對齊連續線的懸掛縮排。 E133 - 修復閉合支架缺少的縮排。 E20 - 刪除無關的空格。 E211 - 刪除無關的空格。 E22 - 修復關鍵字周圍的無關空白。 E224 - 刪除運算子周圍的無關空白。 E225 - 修復運算子周圍缺少的空格。 E226 - 修復算術運算子周圍缺少的空格。 E227 - 修復位元/移位運算子周圍缺少的空格。 E228 - 修復模運算子周圍缺少的空格。 E231 - 增加缺少的空格。 E241 - 修復關鍵字周圍的無關空白。 E242 - 刪除運算子周圍的無關空白。 E251 - 刪除參數“=”符號周圍的空格。 E252 - 參數 equals 周圍缺少空格。 E26 - 修復內嵌註釋的註釋雜湊後的間距。 E265 - 修復區塊註釋的註釋雜湊後的間距。 E266 - 修正區塊註解中過多的前導「#」。 E27 - 修復關鍵字周圍的無關空白。 E301 - 新增缺少的空白行。 E302 - 新增缺少的 2 個空白行。 E303 - 刪除多餘的空白行。 E304 - 刪除函數裝飾器後面的空白行。 E305 - 函數或類別結束後預計有 2 個空白行。 E306 - 巢狀定義前應有 1 個空白行。 E401 - 將導入放在單獨的行上。 E402 - 修復模組級導入不在檔案頂部的問題 E501 - 嘗試使行適合 --max-line-length 字元。 E502 - 刪除換行符號的無關轉義。 E701 - 將冒號分隔的複合語句放在單獨的行上。 E70 - 將分號分隔的複合語句放在單獨的行上。 E711 - 修復與 None 的比較。 E712 - 修復與布林值的比較。 E713 - 使用「不在」進行成員資格測試。 E714 - 使用「不是」測試來確定物件身分。 E721 - 使用“isinstance()”而不是直接比較類型。 E722 - 修復裸露的情況除外。 E731 - 使用 def 時不指派 lambda 表達式。 W291 - 刪除尾隨空格。 W292 - 在文件末尾新增一個換行符。 W293 - 刪除空白行上的尾隨空格。 W391 - 刪除尾隨空白行。 W503 - 修正二元運算子之前的換行符。 W504 - 修正二元運算子後的換行符。 W605 - 修正無效的轉義序列「x」。
autopep8 也修復了 pycodestyle 未發現的一些問題。
規範化具有混合行結尾的檔案。
在類別文檔字串與其第一個方法宣告之間放置一個空白行。 (透過E301
啟用。)
刪除函數宣告及其文件字串之間的空白行。 (透過E303
啟用。)
autopep8 避免修復 pycodestyle 發現的一些問題。
非註釋的E112
/ E113
是違反語法規則的錯誤縮排的報告。這些根本不該修改。
E265
指的是註解雜湊後的空格,如果註解看起來像程式碼,則會被忽略。 autopep8 避免修改這些,因為它們不是真正的註釋。如果您確實想擺脫 pycodestyle 警告,請考慮刪除註解掉的程式碼。 (這可以透過根除來自動化。)
預設情況下,autopep8 僅進行空白變更。因此,預設情況下,它不會修復E711
和E712
。 (如果x
重寫了__eq__
方法,則將x == None
更改為x is None
可能會更改程式的含義。)它也不會更正已棄用的代碼W6
。要啟用這些更積極的修復,請使用--aggressive
選項:
$ autopep8 --aggressive <檔名>
使用多個--aggressive
來提高攻擊性等級。例如, E712
需要攻擊性等級 2(因為x == True
可以改為x
或x is True
,但 autopep8 選擇前者)。
--aggressive
也會更積極地縮短線路。它還會更積極地刪除尾隨空白。 (通常,我們不會觸及文件字串和其他多行字串中的尾隨空格。要對文件字串進行更積極的更改,請使用 docformatter。)
若要僅啟用修復的子集,請使用--select
選項。例如,要修復各種類型的縮排問題:
$ autopep8 --select=E1,W1 <檔名>
如果要修復的檔案很大,您可能需要啟用詳細的進度訊息:
$ autopep8 -v <檔名>
傳入--experimental
可以啟用以下功能:
透過考慮程式碼行的長度來縮短程式碼行
$ autopep8 --experimental <檔名>
可以停用 autopep8,直到檔案中再次開啟它,使用autopep8: off
然後使用autopep8: on
重新啟用。
# autopep8: 關閉[ [23,23,13,43], [32,34,34,34], [56,34,34,11], [10, 10, 10, 10], ]# autopep8: 開啟
fmt: off
和fmt: on
也有效。
使用 autopep8 作為模組的最簡單方法是透過fix_code()
函數:
>>> 導入 autopep8 >>> autopep8.fix_code('x= 123n') 'x = 123n'
或使用選項:
>>> 導入 autopep8 >>> autopep8.fix_code('print( 123 )n', ...選項={'忽略': ['E']}) '印(123)n'
預設情況下,如果$HOME/.config/pycodestyle
(Windows環境下為~.pycodestyle
)存在,則將其用作全域設定檔。或者,您可以使用--global-config
選項指定全域設定檔。
另外,如果目標檔案所在的目錄中存在setup.cfg
、 tox.ini
、 .pep8
和.flake8
文件,則它將用作設定檔。
pep8
、 pycodestyle
和flake8
可以用作一個部分。
設定檔範例:
[pycode風格] 最大行長度 = 120 忽略=E501
autopep8 也可以使用pyproject.toml
。該部分必須是[tool.autopep8]
,並且pyproject.toml
優先於任何其他設定檔。
設定檔範例:
[工具.autopep8] 最大行長度 = 120 忽略 = "E501,W6" # 或 ["E501", "W6"] 就地=真 遞歸=真 攻擊性 = 3
autopep8 可用作預先提交的鉤子。
若要將 autopep8 新增為插件,請將此儲存庫定義新增至您的配置:
回購協議: - repo: https://github.com/hhatto/autopep8rev: ... # 選擇你想要的標籤或版本,或執行`pre-commit autoupdate`hooks: - ID:autopep8
測試用例位於test/test_autopep8.py
。它們可以直接透過python test/test_autopep8.py
或透過 tox 運作。後者對於針對多個 Python 解釋器進行測試非常有用。 (我們目前針對 CPython 版本 3.8、3.9、3.10、3.11 和 3.12 進行測試。我們也針對 PyPy 進行測試。)
透過test/acid.py
可以進行廣譜測試。此腳本針對 Python 程式碼執行 autopep8 並檢查程式碼修復的正確性和完整性。它可以檢查字節碼是否保持相同。 test/acid_pypi.py
使用acid.py
來測試 PyPI 上最新發布的軟體包。
pkg_resources.DistributionNotFound
如果您使用的是舊版的setuptools
,則在嘗試執行autopep8
時可能會遇到pkg_resources.DistributionNotFound
。嘗試升級setuptools
以解決此setuptools
問題:
$ pip install --升級安裝工具
如果要安裝到系統,請使用sudo
。
皮伊
GitHub
代碼科夫