欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

手把手教你用Python中的Linting提高代碼質(zhì)量

 更新時間:2023年01月17日 15:47:25   作者:Python數(shù)據(jù)開發(fā)  
Python是一種不斷發(fā)展的語言,隨著它的演化和擴(kuò)展,可用工具和開發(fā)策略的數(shù)量也在增加,近來流行的一個過程是linting—檢查代碼的潛在問題,下面這篇文章主要給大家介紹了關(guān)于用Python中Linting提高代碼質(zhì)量的相關(guān)資料,需要的朋友可以參考下

前言

Python 是一種不斷發(fā)展的語言。隨著它的演化和擴(kuò)展,可用工具和開發(fā)策略的數(shù)量也在增加。近來流行的一個過程是linting —— 檢查代碼的潛在問題。通過linting,我們代碼中的錯誤會被標(biāo)記出來,這樣我們就可以糾正可能導(dǎo)致出現(xiàn)問題的編程方法。

Linting(提示)是在編寫源代碼時和編譯前進(jìn)行的。換句話說,Linting是一種構(gòu)建前的檢查,也叫 “靜態(tài)代碼分析”。定期檢查我們的代碼,以確保整個代碼和代碼庫的一致性。這最大限度地減少了小錯誤在代碼運(yùn)行后變成復(fù)雜問題的機(jī)會。

許多開發(fā)人員不使用Linting,因為他們沒有看到它的附加價值,因為Linting不會防止錯誤。但這種觀點(diǎn)低估了Linting在提高代碼質(zhì)量方面的價值。

在這篇實踐文章中,我們將探討在Python中使用Pylint——最流行的提示工具之一——進(jìn)行快速的提示檢查是多么快速和簡單。我們還將看到,對代碼進(jìn)行提示是如何幫助我們遵守PEP8代碼風(fēng)格指南的。

前提條件

在開始之前,確保滿足以下條件:

在你的機(jī)器上安裝了Python和pip

對命令行界面(CLI)有基本的了解

對Python概念的理解,如函數(shù)和類。

另外,應(yīng)該注意,雖然這里顯示的命令與Linux和基于macOS的系統(tǒng)兼容,但在Windows下工作時,你應(yīng)該小心。

Linting Python 代碼

在我們深入研究如何在Python中使用linter之前,讓我們通過創(chuàng)建一個目錄和虛擬環(huán)境來進(jìn)行設(shè)置。

建立環(huán)境

首先,為這個項目創(chuàng)建一個目錄。在本教程中,我們把它叫做 pylint-demo。

$ mkdir pylint-demo

$ cd pylint-demo

接下來,創(chuàng)建一個虛擬環(huán)境。這將隔離我們的項目依賴性,并防止與其他項目發(fā)生沖突。

$ pip install pipenv

$ pipenv shell

命令行應(yīng)該是這樣的。(pylint-demo)$。這表明虛擬環(huán)境已經(jīng)激活。

在虛擬環(huán)境激活的情況下,使用下面的命令安裝linter。

$ pipenv install pylint

現(xiàn)在我們可以用pylint命令運(yùn)行l(wèi)inter。為了確保Pylint已經(jīng)成功安裝,運(yùn)行以下命令。

$ pylint –help

開始使用 Linting

讓我們寫一個基本的Python程序,并在其上使用Pylint,看看它是如何工作的。創(chuàng)建一個 main.py文件并復(fù)制以下代碼。

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)}")

在上面的代碼中,我們已經(jīng)添加了一個函數(shù)來檢查數(shù)字是偶數(shù)還是奇數(shù)。為了使用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)

我們可以在代碼中看到幾個不言而喻的問題,每個問題都用一個字符標(biāo)識,如 C0304。Pylint將字母代碼應(yīng)用于所有錯誤,以區(qū)分問題的嚴(yán)重程度和性質(zhì)。有五個不同類別的錯誤。

  • C: 慣例(針對任何違反代碼慣例的行為)
  • R:重構(gòu)(針對任何與代碼氣味和重構(gòu)有關(guān)的問題)
  • W:警告(針對任何不屬于錯誤的編程級問題)
  • E: 錯誤 (對于任何編程級別的問題,是一個錯誤)
  • F: Fatal (對于任何停止Pylint執(zhí)行的嚴(yán)重問題)

Pylint還根據(jù)存在的錯誤數(shù)量給我們的代碼打分,滿分為10分。

在我們的例子中,除了一個錯誤代碼外,所有的錯誤代碼都是約定俗成的錯誤——單個錯誤是一個警告。為了解決這些問題,讓我們在我們的代碼中做一些修改,然后再次運(yùn)行Pylint,看看我們的代碼得到什么分?jǐn)?shù)。

""" 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)}")

通過這段代碼,我們添加了一個模塊和函數(shù)docstring,在結(jié)尾處添加了一個新行,并重新命名了上述代碼中的變量。當(dāng)我們重新運(yùn)行Pylint時,我們得到了10/10的分?jǐn)?shù),沒有任何問題。

在單個文件上運(yùn)行Pylint

現(xiàn)在我們對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?,F(xiàn)在讓我們在這段代碼上使用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)

請注意,雖然這次我們沒有代碼質(zhì)量問題,但它們已經(jīng)被更多實質(zhì)性的錯誤所取代。有了這些問題的標(biāo)記,讓我們試著用下面的代碼來修復(fù)它們:

""" File contains various function to under Pylint """

class Animal:
    "Animal Class"
    def __init__(self, name):
        self.name = name

obj1 = Animal("John")
print(obj1.name)

然后,重新運(yùn)行Pylint。在將類的名稱從 animal改為 Animal,為類添加一個文檔字符串,刪除函數(shù)調(diào)用中不需要的參數(shù),并添加適當(dāng)?shù)目s進(jìn),我們幾乎消除了代碼中的錯誤。不過還剩下一個:

************* 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)

當(dāng)我們現(xiàn)在檢查Pylint的輸出時,我們會看到這個問題已經(jīng)消失了。

在一個目錄上運(yùn)行Pylint

我們已經(jīng)看到了如何在單個文件上運(yùn)行Pylint,但是當(dāng)我們在一個項目上工作時,我們不會有單個文件可以檢查。

要在整個目錄上使用Pylint,請運(yùn)行以下命令。

$ pylint 
<<
name_of_directory
>>

為了了解對一個目錄的提示是如何工作的,讓我們再創(chuàng)建兩個文件并添加一些代碼。

$ mkdir src; cd src
$ touch helpers.py config.py __init__.py

main.py文件移到 src目錄,并將以下代碼粘貼到相應(yīng)的文件中。

<<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.pyhelpers.pyconfig.py。在 main.py中,我們有一個假函數(shù)來打印我們是否連接到了DB。helpers.py包含一個假的幫助函數(shù)來連接到DB, config.py文件包含DB的用戶名和密碼。

現(xiàn)在,讓我們在根目錄下使用以下命令在整個目錄上運(yùn)行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向我們顯示了不同文件的輸出,用 ***和模塊名稱分開。為了解決這些問題,我們需要做以下修改。

  • 在每個文件的末尾添加一個新行。
  • 為每個文件和函數(shù)添加一個文檔串。
  • import語句從 helpersimportconnect_db修改為 .helpersimportconnect_db。

一旦我們解決了這些問題,我們會看到另一個問題——我們需要將 is_connected變量大寫。我們可以改變變量名稱,或者抑制警告來處理這個錯誤。

抑制警告

在對Python代碼進(jìn)行檢查時,你很有可能需要定制或抑制多個警告。每次都添加注釋是沒有意義的。你可以創(chuàng)建一個 .rc文件來定制Pylint的行為,并直接從 .rc文件中抑制整個項目的警告,而不是一個一個地處理警告抑制實例。

你可以用下面的命令創(chuàng)建一個:

$ pylint 
--
generate
-
rcfile 
>
 pylint
.
rc

用Linting更好、更安全地編寫代碼

在Python中,在代碼編寫過程中對源代碼進(jìn)行檢查,并在我們運(yùn)行代碼之前,沿途標(biāo)記出錯誤。你也可以將Pylint嵌入到編輯器中,實時查看提示信息。

雖然提示并不能自動修復(fù)錯誤,但持續(xù)使用它有助于確保我們的代碼質(zhì)量保持高水準(zhǔn)。因此,雖然有些開發(fā)者認(rèn)為linting是浪費(fèi)時間,但它在小問題滾雪球般發(fā)展成大問題之前就能極其有效地捕捉到。

在這篇文章中,我們已經(jīng)探討了如何通過linting和實施Pylint的建議來改善我們的示例代碼。此外,這個過程本質(zhì)上有助于我們遵守PEP8的風(fēng)格指南?,F(xiàn)在,你可以在你的項目中實施linting,你可以探索許多可用的linting工具,并確定哪種工具最能補(bǔ)充,并增強(qiáng)你的Python開發(fā)方法。

總結(jié)

到此這篇關(guān)于手把手教你用Python中Linting提高代碼質(zhì)量的文章就介紹到這了,更多相關(guān)Python Linting提高代碼質(zhì)量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • Pandas 合并多個Dataframe(merge,concat)的方法

    Pandas 合并多個Dataframe(merge,concat)的方法

    今天小編就為大家分享一篇Pandas 合并多個Dataframe(merge,concat)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 小白學(xué)Python之實現(xiàn)OCR識別

    小白學(xué)Python之實現(xiàn)OCR識別

    將圖片翻譯成文字一般被稱為光學(xué)文字識別(Optical Character Recognition,OCR),這篇文章主要給大家介紹了關(guān)于Python實現(xiàn)OCR識別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • Python使用keras和tensorflow遇到的問題及解決

    Python使用keras和tensorflow遇到的問題及解決

    這篇文章主要介紹了Python使用keras和tensorflow遇到的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 使用python提取PowerPoint中的音頻和視頻

    使用python提取PowerPoint中的音頻和視頻

    將多種格式的媒體內(nèi)容進(jìn)行重新利用(如PowerPoint演示中的音頻和視頻)是非常有價值的,從演示文稿中提取這些媒體文件可以為多媒體內(nèi)容的多次使用提供更大的靈活性,本文將演示如何使用Python從PowerPoint演示文稿中提取音頻和視頻,需要的朋友可以參考下
    2024-09-09
  • python繪制折線圖和條形圖的方法

    python繪制折線圖和條形圖的方法

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)折線圖和條形圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • python 寫入csv亂碼問題解決方法

    python 寫入csv亂碼問題解決方法

    這篇文章主要介紹了python 寫入csv亂碼問題解決方法的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Python實現(xiàn)推送百度鏈接的示例代碼

    Python實現(xiàn)推送百度鏈接的示例代碼

    有時為了提高搜索效率,也讓搜索引擎更容易發(fā)現(xiàn)自己的文章,我們需要將文章鏈接推送到百度站長平臺,起到快速收錄的目的。本文將主要介紹如何通過Python實現(xiàn)這一功能,需要的可以參考一下
    2021-12-12
  • Python3 io文本及原始流I/O工具用法詳解

    Python3 io文本及原始流I/O工具用法詳解

    這篇文章主要介紹了Python3 io文本及原始流I/O工具用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 機(jī)器學(xué)習(xí)10大經(jīng)典算法詳解

    機(jī)器學(xué)習(xí)10大經(jīng)典算法詳解

    這篇文章主要為大家詳細(xì)介紹了機(jī)器學(xué)習(xí)10大經(jīng)典算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 最新評論