<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Python 是一種不斷髮展的語言。隨著它的演化和擴充套件,可用工具和開發策略的數量也在增加。近來流行的一個過程是linting —— 檢查程式碼的潛在問題。通過linting,我們程式碼中的錯誤會被標記出來,這樣我們就可以糾正可能導致出現問題的程式設計方法。
Linting(提示)是在編寫原始碼時和編譯前進行的。換句話說,Linting是一種構建前的檢查,也叫 “靜態程式碼分析”。定期檢查我們的程式碼,以確保整個程式碼和程式碼庫的一致性。這最大限度地減少了小錯誤在程式碼執行後變成複雜問題的機會。
許多開發人員不使用Linting,因為他們沒有看到它的附加價值,因為Linting不會防止錯誤。但這種觀點低估了Linting在提高程式碼質量方面的價值。
在這篇實踐文章中,我們將探討在Python中使用Pylint——最流行的提示工具之一——進行快速的提示檢查是多麼快速和簡單。我們還將看到,對程式碼進行提示是如何幫助我們遵守PEP8程式碼風格指南的。
在開始之前,確保滿足以下條件:
在你的機器上安裝了Python和pip
對命令列介面(CLI)有基本的瞭解
對Python概念的理解,如函數和類。
另外,應該注意,雖然這裡顯示的命令與Linux和基於macOS的系統相容,但在Windows下工作時,你應該小心。
在我們深入研究如何在Python中使用linter之前,讓我們通過建立一個目錄和虛擬環境來進行設定。
首先,為這個專案建立一個目錄。在本教學中,我們把它叫做 pylint-demo
。
$ mkdir pylint-demo $ cd pylint-demo
接下來,建立一個虛擬環境。這將隔離我們的專案依賴性,並防止與其他專案發生衝突。
$ pip install pipenv $ pipenv shell
命令列應該是這樣的。(pylint-demo)$
。這表明虛擬環境已經啟用。
在虛擬環境啟用的情況下,使用下面的命令安裝linter。
$ pipenv install pylint
現在我們可以用pylint命令執行linter。為了確保Pylint已經成功安裝,執行以下命令。
$ pylint –help
讓我們寫一個基本的Python程式,並在其上使用Pylint,看看它是如何工作的。建立一個 main.py
檔案並複製以下程式碼。
def is_number_even(num): return "Even" if num % 2 == 0 else "Odd" num = 5 print(f"The number {num} is {is_number_even(num)}")
在上面的程式碼中,我們已經新增了一個函數來檢查數位是偶數還是奇數。為了使用Pylint來檢查這段程式碼中的錯誤,我們使用以下命令:
$ pylint <<file_name>> $ pylint main.py
Pylint的輸出情況如下:
************* Module main
main.py:12:0: C0304: Final newline missing (missing-final-newline)
main.py:1:0: C0114: Missing module docstring (missing-module-docstring)
main.py:8:0: C0116: Missing function or method docstring (missing-function-docstring)
main.py:8:19: W0621: Redefining name 'num' from outer scope (line 11) (redefined-outer-name)
main.py:11:0: C0103: Constant name "num" doesn't conform to UPPER_CASE naming style (invalid-name)------------------------------------------------------------------
Your code has been rated at 0.00/10 (previous run: 0.00/10, +0.00)
我們可以在程式碼中看到幾個不言而喻的問題,每個問題都用一個字元標識,如 C0304
。Pylint將字母程式碼應用於所有錯誤,以區分問題的嚴重程度和性質。有五個不同類別的錯誤。
Pylint還根據存在的錯誤數量給我們的程式碼打分,滿分為10分。
在我們的例子中,除了一個錯誤程式碼外,所有的錯誤程式碼都是約定俗成的錯誤——單個錯誤是一個警告。為了解決這些問題,讓我們在我們的程式碼中做一些修改,然後再次執行Pylint,看看我們的程式碼得到什麼分數。
""" File contains various function to under Pylint """ def is_number_even(num): """Function to check if number is even or odd""" return "Even" if num % 2 == 0 else "Odd" NUM = 5 print(f"The number {NUM} is {is_number_even(NUM)}")
通過這段程式碼,我們新增了一個模組和函數docstring,在結尾處新增了一個新行,並重新命名了上述程式碼中的變數。當我們重新執行Pylint時,我們得到了10/10的分數,沒有任何問題。
現在我們對Pylint的工作方式更加熟悉了,讓我們看看另一個例子,輸入以下程式碼:
""" File contains various function to under Pylint """ class animal: def __init__(self, name): self.name = name obj1 = animal("Horse", 21) print(obj1.name)
在這個片段中,我們有一個簡單的類,名為 animal
,該類的一個物件名為 obj1
。現在讓我們在這段程式碼上使用Pylint:
************* Module main
main.py:4:0: W0311: Bad indentation. Found 2 spaces, expected 4 (bad-indentation)
main.py:5:0: W0311: Bad indentation. Found 4 spaces, expected 8 (bad-indentation)
main.py:3:0: C0115: Missing class docstring (missing-class-docstring)
main.py:3:0: C0103: Class name "animal" doesn't conform to PascalCase naming style (invalid-name)
main.py:3:0: R0903: Too few public methods (0/2) (too-few-public-methods)
main.py:7:7: E1121: Too many positional arguments for constructor call (too-many-function-args)
請注意,雖然這次我們沒有程式碼質量問題,但它們已經被更多實質性的錯誤所取代。有了這些問題的標記,讓我們試著用下面的程式碼來修復它們:
""" File contains various function to under Pylint """ class Animal: "Animal Class" def __init__(self, name): self.name = name obj1 = Animal("John") print(obj1.name)
然後,重新執行Pylint。在將類的名稱從 animal
改為 Animal
,為類新增一個檔案字串,刪除函數呼叫中不需要的引數,並新增適當的縮排,我們幾乎消除了程式碼中的錯誤。不過還剩下一個:
************* Module main
main.py:3:0: R0903: Too few public methods (0/2) (too-few-public-methods)
讓我們看看如何解決這個剩餘的錯誤。Pylint說我們沒有兩個或多個公共方法,但我們的程式碼很有可能沒有兩個或多個公共方法。那麼,我們該如何解決這個問題呢?
在這樣的情況下,我們可以使用Python註釋來抑制這些問題。抑制它們的語法如下。
# pylint: disable=<<issue_name>>
下面是完整程式碼:
""" File contains various function to under Pylint """ # pylint: disable=too-few-public-methods class Animal: "Animal Class" def __init__(self, name): self.name = name obj1 = Animal("John") print(obj1.name)
當我們現在檢查Pylint的輸出時,我們會看到這個問題已經消失了。
我們已經看到了如何在單個檔案上執行Pylint,但是當我們在一個專案上工作時,我們不會有單個檔案可以檢查。
要在整個目錄上使用Pylint,請執行以下命令。
$ pylint << name_of_directory >>
為了瞭解對一個目錄的提示是如何工作的,讓我們再建立兩個檔案並新增一些程式碼。
$ mkdir src; cd src $ touch helpers.py config.py __init__.py
將 main.py
檔案移到 src
目錄,並將以下程式碼貼上到相應的檔案中。
<<main.py>> """ File contains various function to under Pylint """ from helpers import connect_db from config import DB_USER, DB_PASS is_connected = connect_db(DB_USER, DB_PASS) if is_connected: print("Connected to DB") else: print("Failed to connect to DB") <<helpers.py>> def connect_db(user, password): """Dummy function to connect to DB""" if user is None or password is None: return False return True <<config.py>> DB_USER = "root" DB_PASS = "toor"
我們在 src
目錄下有三個檔案:main.py
、 helpers.py
和 config.py
。在 main.py
中,我們有一個假函數來列印我們是否連線到了DB。helpers.py
包含一個假的幫助函數來連線到DB, config.py
檔案包含DB的使用者名稱和密碼。
現在,讓我們在根目錄下使用以下命令在整個目錄上執行Pylint。
$ pylint src
命令的輸出將如下:
************* Module src.config
src/config.py:2:0: C0304: Final newline missing (missing-final-newline)
src/config.py:1:0: C0114: Missing module docstring (missing-module-docstring)
************* Module src.main
src/main.py:11:0: C0304: Final newline missing (missing-final-newline)
src/main.py:3:0: E0401: Unable to import 'helpers' (import-error)
src/main.py:4:0: E0401: Unable to import 'config' (import-error)
************* Module src.helpers
src/helpers.py:6:0: C0304: Final newline missing (missing-final-newline)
src/helpers.py:1:0: C0114: Missing module docstring (missing-module-docstring)
我們可以看到,Pylint向我們顯示了不同檔案的輸出,用 ***
和模組名稱分開。為了解決這些問題,我們需要做以下修改。
import
語句從 helpersimportconnect_db
修改為 .helpersimportconnect_db
。一旦我們解決了這些問題,我們會看到另一個問題——我們需要將 is_connected
變數大寫。我們可以改變變數名稱,或者抑制警告來處理這個錯誤。
在對Python程式碼進行檢查時,你很有可能需要客製化或抑制多個警告。每次都新增註釋是沒有意義的。你可以建立一個 .rc
檔案來客製化Pylint的行為,並直接從 .rc
檔案中抑制整個專案的警告,而不是一個一個地處理警告抑制範例。
你可以用下面的命令建立一個:
$ pylint -- generate - rcfile > pylint . rc
在Python中,在程式碼編寫過程中對原始碼進行檢查,並在我們執行程式碼之前,沿途標記出錯誤。你也可以將Pylint嵌入到編輯器中,實時檢視提示資訊。
雖然提示並不能自動修復錯誤,但持續使用它有助於確保我們的程式碼質量保持高水準。因此,雖然有些開發者認為linting是浪費時間,但它在小問題滾雪球般發展成大問題之前就能極其有效地捕捉到。
在這篇文章中,我們已經探討了如何通過linting和實施Pylint的建議來改善我們的範例程式碼。此外,這個過程本質上有助於我們遵守PEP8的風格指南。現在,你可以在你的專案中實施linting,你可以探索許多可用的linting工具,並確定哪種工具最能補充,並增強你的Python開發方法。
到此這篇關於手把手教你用Python中Linting提高程式碼質量的文章就介紹到這了,更多相關Python Linting提高程式碼質量內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45