国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) 后端開發(fā) Python教程 為初學(xué)者組織和維護(hù) Python 代碼庫(kù)的步驟

為初學(xué)者組織和維護(hù) Python 代碼庫(kù)的步驟

Nov 04, 2024 am 06:58 AM

我寫這篇文章的原因是分享一些關(guān)于保持項(xiàng)目干凈的見解,即使有很多貢獻(xiàn)者??紤]到數(shù)據(jù)不斷變化的性質(zhì)以及 Python 庫(kù)和應(yīng)用程序中的處理需求,這一點(diǎn)對(duì)于數(shù)據(jù)工程師來說尤其重要。

標(biāo)題可能聽起來有點(diǎn)標(biāo)題黨,但如果您遵循這些步驟,您的 Python 代碼將變得更容易管理。如果您是一名高級(jí)開發(fā)人員,您可能不會(huì)在這里找到任何新東西 - 別擔(dān)心,我為您準(zhǔn)備了一個(gè)有趣的模因。

Steps to Organize and Maintain Your Python Codebase for Beginners

第 1 步:版本控制

這可能看起來微不足道,但我實(shí)際上認(rèn)識(shí)一些人,他們只將代碼存儲(chǔ)在本地計(jì)算機(jī)上 - 不幸的是,由于他們沒有在其他地方備份它,所以丟失了代碼。有多種可用的版本控制系統(tǒng),例如 Git,它可與 GitHub、GitLab 和 Bitbucket 等平臺(tái)配合使用。雖然 Git 是許多人的首選,但 SVN (Subversion) 和 Mercurial 等其他版本控制系統(tǒng)仍然在代碼管理中發(fā)揮著重要作用。

在本指南中,我打算創(chuàng)建一個(gè)小型演示 Python 庫(kù),其中包含一個(gè)函數(shù)來說明基本數(shù)據(jù)處理。它并不是一個(gè)完整的工具包,而是作為一個(gè)簡(jiǎn)單的示例來演示代碼質(zhì)量、環(huán)境管理和 CI/CD 工作流程等最佳實(shí)踐。

首先,我為我們的演示 Python 庫(kù)創(chuàng)建了一個(gè)存儲(chǔ)庫(kù),并將其命名為 blog_de_toolkit。它是公開的,因此請(qǐng)隨意分叉它并使用現(xiàn)有代碼作為您自己的項(xiàng)目的起點(diǎn)。由于良好的文檔至關(guān)重要,因此我提供了一個(gè)建議的空自述文件。為了保持倉(cāng)庫(kù)整潔,我添加了一個(gè)默認(rèn)的 Python .gitignore 模板,以防止上傳不必要的文件。

Steps to Organize and Maintain Your Python Codebase for Beginners

現(xiàn)在我們有了存儲(chǔ)庫(kù),我們可以克隆它。

Steps to Organize and Maintain Your Python Codebase for Beginners

我不打算在這里深入探討 Git 命令——你可以在網(wǎng)上找到大量教程。如果您不喜歡使用普通終端 CLI,您還可以使用 GitHub Desktop 或 SourceTree 等工具來管理存儲(chǔ)庫(kù),它們提供了更直觀的界面。

就我個(gè)人而言,我非常喜歡使用 GitHub Desktop。因此,讓我們將存儲(chǔ)庫(kù)克隆到本地計(jì)算機(jī)并在您喜歡的 IDE 中打開它。

Steps to Organize and Maintain Your Python Codebase for Beginners

讓我們看看到目前為止我們得到了什么:

Steps to Organize and Maintain Your Python Codebase for Beginners

開始還不錯(cuò)!

第 2 步:項(xiàng)目結(jié)構(gòu)

對(duì)于第 2 步,我們將組織我們的 de_toolkit 項(xiàng)目。良好的結(jié)構(gòu)可以輕松找到東西并保持一切整潔。我們將為代碼、測(cè)試和文檔創(chuàng)建文件夾,設(shè)置一個(gè)簡(jiǎn)單、干凈的框架來構(gòu)建。

blog_de_toolkit/  
│  
├── de_toolkit/  
│   ├── __init__.py  
│   └── data_tools.py  
│  
├── tests/  
│   ├── __init__.py  
│   └── test_data_tools.py  
│  
├── .gitignore  
├── setup.py  
└── README.md

我們有一個(gè)主文件夾來存放我們將要添加的所有有用代碼,一個(gè) tests 文件夾用于我們未來的單元測(cè)試,以及一個(gè) .gitignore 將不必要的文件保留在我們的存儲(chǔ)庫(kù)之外。還有一個(gè) setup.py 文件,這是使項(xiàng)目可安裝的基本設(shè)置。我現(xiàn)在不會(huì)詳細(xì)介紹它,因?yàn)槲覀兩院髮⒃?strong>第 8 步:創(chuàng)建分發(fā)包中介紹它。

在設(shè)置項(xiàng)目結(jié)構(gòu)時(shí),保持一致會(huì)產(chǎn)生巨大的差異。隨著項(xiàng)目的發(fā)展,最好將其分解為更小的模塊,例如將 data_tools.py 拆分為 csv_tools.py 和 json_tools.py。這樣,您就可以更輕松地管理和查找所需內(nèi)容,而無(wú)需翻閱長(zhǎng)文件。

添加 docs/ 文件夾也是一個(gè)明智之舉,即使它只是以一些注釋開頭。它將幫助您(和其他人)隨著項(xiàng)目的發(fā)展跟蹤事情的運(yùn)作方式。如果您正在使用 YAML 或 JSON 等配置,configs/ 文件夾可以幫助保持整潔。如果您計(jì)劃編寫自動(dòng)化或測(cè)試腳本,scripts/ 文件夾將使它們井然有序。

此時(shí),我們需要安裝一些額外的庫(kù)來繼續(xù)構(gòu)建項(xiàng)目。

第三步:開發(fā)環(huán)境

當(dāng)然,我們可以從命令行運(yùn)行 pip install 來安裝我們需要的依賴項(xiàng)。但是,如果我們要處理多個(gè)項(xiàng)目,每個(gè)項(xiàng)目都需要不同版本的 Python 和庫(kù)怎么辦?這就是虛擬環(huán)境的用武之地——它們隔離每個(gè)項(xiàng)目的依賴關(guān)系,包括特定的 Python 版本,因此一切都保持獨(dú)立和獨(dú)立。

幸運(yùn)的是,有很多工具可以創(chuàng)建虛擬環(huán)境,因此您可以選擇最適合您的工具:

  • virtualenv

  • venv

  • 康達(dá)

  • pyenv

  • pipenv

  • 詩(shī)歌

就我個(gè)人而言,我是 pyenv 的忠實(shí)粉絲,所以這就是我將在這里使用的。我已經(jīng)將它安裝在我的筆記本電腦上,因?yàn)樗俏夜ぷ骱蛡€(gè)人項(xiàng)目的首選。

讓我們從安裝 Python 開始:

blog_de_toolkit/  
│  
├── de_toolkit/  
│   ├── __init__.py  
│   └── data_tools.py  
│  
├── tests/  
│   ├── __init__.py  
│   └── test_data_tools.py  
│  
├── .gitignore  
├── setup.py  
└── README.md

如果 pyenv 無(wú)法識(shí)別此 Python 版本,請(qǐng)先嘗試更新它。例如,如果您使用的是 Mac 并使用 Homebrew 安裝了 pyenv,請(qǐng)運(yùn)行:

pyenv install 3.12.2

如果遇到錯(cuò)誤 ModuleNotFoundError:沒有名為 '_lzma' 的模塊,請(qǐng)嘗試:

brew update && brew upgrade pyenv

接下來,在我們的項(xiàng)目文件夾中,創(chuàng)建一個(gè)新的虛擬環(huán)境:

brew install readline xz

現(xiàn)在,將本地Python版本設(shè)置為您剛剛創(chuàng)建的虛擬環(huán)境:

pyenv virtualenv 3.12.2 de_toolkit

如果在 MacOS 上運(yùn)行命令后環(huán)境沒有切換,網(wǎng)上有一個(gè)有用的線程提供了解決方案。一旦一切設(shè)置正確,您應(yīng)該在命令行開頭看到 de_toolkit,如下所示:

Steps to Organize and Maintain Your Python Codebase for Beginners

現(xiàn)在,讓我們安裝我們的依賴項(xiàng):

pyenv local de_toolkit

接下來,我們將把所有已安裝的軟件包及其版本保存到requirements.txt 文件中。這使得共享項(xiàng)目的依賴項(xiàng)或在其他地方重新創(chuàng)建相同的環(huán)境變得容易:

pip install setuptools wheel twine pandas 

這是我們得到的已安裝軟件包的列表:

Steps to Organize and Maintain Your Python Codebase for Beginners

當(dāng)然,如果您愿意,您可以編輯requirements.txt 文件以僅保留主庫(kù)及其版本。

第 4 步:管理憑證和秘密

這一步至關(guān)重要——可能是最重要的步驟之一。您可能聽說過有關(guān) GitHub 存儲(chǔ)庫(kù)中的憑據(jù)被泄露或敏感令牌意外在公共場(chǎng)合共享的恐怖故事。為了避免這種情況,必須從一開始就將敏感信息排除在代碼之外。否則,很容易忘記您硬編碼了數(shù)據(jù)庫(kù)密碼,推送了更改,然后突然——您的憑據(jù)現(xiàn)在公開了。

硬編碼密碼、API 密鑰或數(shù)據(jù)庫(kù)憑據(jù)是主要的安全風(fēng)險(xiǎn)。如果它們進(jìn)入公共倉(cāng)庫(kù),它們可能會(huì)損害您的整個(gè)系統(tǒng)。處理秘密的最安全方法是將它們存儲(chǔ)在環(huán)境變量或 .env 文件中。為了幫助將這些變量加載到您的 Python 項(xiàng)目中,我們將使用 python-dotenv 庫(kù)。它從 .env 文件中讀取鍵值對(duì),并將它們用作代碼中的環(huán)境變量。

首先,安裝庫(kù):

pip freeze > requirements.txt

在項(xiàng)目文件夾中創(chuàng)建一個(gè) .env 文件,其中包含以下內(nèi)容:

pip install python-dotenv

現(xiàn)在,讓我們修改 data_tools.py 以使用 python-dotenv:

加載這些機(jī)密

當(dāng)您調(diào)用 load_dotenv() 時(shí),它會(huì)在當(dāng)前目錄中搜索 .env 文件并將其內(nèi)容加載到環(huán)境中。使用 os.getenv() 允許您在代碼中安全地訪問這些變量,使憑據(jù)與源代碼隔離并降低意外暴露的風(fēng)險(xiǎn)。

一個(gè)關(guān)鍵提示是避免將 .env 文件提交到版本控制。將其添加到 .gitignore 中以防止意外推送:

blog_de_toolkit/  
│  
├── de_toolkit/  
│   ├── __init__.py  
│   └── data_tools.py  
│  
├── tests/  
│   ├── __init__.py  
│   └── test_data_tools.py  
│  
├── .gitignore  
├── setup.py  
└── README.md

如果您使用 VSCode,有一個(gè)有用的 dotenv 擴(kuò)展可以自動(dòng)識(shí)別您的 .env * 文件。如果您更喜歡從終端工作,您可以導(dǎo)出 *.env 文件,如下所示:

pyenv install 3.12.2

第五步:編寫代碼

在處理項(xiàng)目時(shí),嘗試編寫易于理解和管理的小型、可重用的函數(shù)。一個(gè)好的經(jīng)驗(yàn)法則是:“如果您使用它超過兩次,請(qǐng)將其變成一個(gè)函數(shù)?!?/em>

在我們的 data_tools.py 中,我們創(chuàng)建一個(gè)函數(shù)來演示典型的數(shù)據(jù)工程邏輯,例如從 CSV 加載數(shù)據(jù)并清理它:

專業(yè)提示:在 Python 中堅(jiān)持使用 snake_case

作為函數(shù)和變量名稱 - 它可以使您的代碼保持一致且易于閱讀。避免使用 x 或 df2 等神秘名稱;清晰的描述性名稱使您的代碼更易于使用。

我們?cè)谶@里使用文檔字符串來描述函數(shù)的功能、參數(shù)和返回類型。這使得其他開發(fā)人員(以及未來的你)可以輕松了解如何使用該功能。有幾種流行的文檔字符串約定,但最常見的包括 PEP 257、Google Style 和 NumPy Style:

對(duì)于較小的函數(shù),PEP 257 通常就足夠了,但對(duì)于更復(fù)雜的項(xiàng)目,Google 或 NumPy 樣式提供了更多的清晰度和結(jié)構(gòu)。

Python 中的類型提示(如我們示例中的 file_path: str)顯示函數(shù)輸入和輸出的預(yù)期數(shù)據(jù)類型。它們提高了可讀性,幫助發(fā)現(xiàn)錯(cuò)誤,并通過設(shè)定明確的期望使協(xié)作變得更容易。

以下是類型提示如何改進(jìn)函數(shù)簽名的示例:

blog_de_toolkit/  
│  
├── de_toolkit/  
│   ├── __init__.py  
│   └── data_tools.py  
│  
├── tests/  
│   ├── __init__.py  
│   └── test_data_tools.py  
│  
├── .gitignore  
├── setup.py  
└── README.md

在這個(gè)例子中,類型提示 file_path: str 表明參數(shù)應(yīng)該是一個(gè)字符串,而 ->; pd.DataFrame 指示該函數(shù)返回一個(gè) Pandas DataFrame。這使得該函數(shù)的行為一目了然。類型提示還可以與 IDE 和 linter(例如 PyCharm、VSCode 或 mypy)很好地配合使用,在傳遞不兼容的類型時(shí)提供自動(dòng)完成和早期警告。

如果函數(shù)可以返回多種類型或無(wú),您可以使用輸入模塊中的可選

pyenv install 3.12.2

這表明該函數(shù)可以返回字符串或 None。對(duì)于更復(fù)雜的數(shù)據(jù)結(jié)構(gòu),您可以使用輸入模塊中的 List、DictTuple 來指定預(yù)期類型。

第 6 步:編寫測(cè)試

編寫單元測(cè)試是一種簡(jiǎn)單的方法,可以確保您的代碼執(zhí)行預(yù)期的操作,而不會(huì)出現(xiàn)意外的情況。它們可以幫助您及早發(fā)現(xiàn)錯(cuò)誤并充滿信心地進(jìn)行更改,因?yàn)槟酪磺腥匀话搭A(yù)期運(yùn)行。在 Python 中,有多個(gè)可用于單元測(cè)試的庫(kù),每個(gè)庫(kù)都有其優(yōu)點(diǎn)和生態(tài)系統(tǒng):

  • 單元測(cè)試

  • pytest

  • 鼻子2

  • 假設(shè)

對(duì)于本指南,我們將使用 pytest 因?yàn)樗?jiǎn)單、靈活且易于使用。您可以使用以下命令安裝它:

brew update && brew upgrade pyenv

接下來,在 tests/ 文件夾中創(chuàng)建一個(gè)名為 test_data_tools.py 的文件。讓我們?yōu)橹皩?shí)現(xiàn)的代碼編寫一些測(cè)試。這是我們的 load_and_clean_data() 函數(shù)和環(huán)境變量檢索邏輯的示例測(cè)試:

在 test_load_and_clean_data() 中,我們使用 StringIO 模擬 CSV 文件作為輸入。這使我們無(wú)需實(shí)際文件即可進(jìn)行測(cè)試。該測(cè)試驗(yàn)證該函數(shù)是否正確刪除重復(fù)項(xiàng)和 NaN 值,檢查 DataFrame 是否沒有丟失數(shù)據(jù),并確認(rèn)“名稱”列中的唯一條目正確。

在test_get_database_url()和test_get_api_key()中,我們使用pytest提供的monkeypatch工具來在測(cè)試過程中臨時(shí)設(shè)置環(huán)境變量。這確保函數(shù)返回預(yù)期值,而不需要真正的環(huán)境變量。

要運(yùn)行所有測(cè)試,只需執(zhí)行以下命令:

blog_de_toolkit/  
│  
├── de_toolkit/  
│   ├── __init__.py  
│   └── data_tools.py  
│  
├── tests/  
│   ├── __init__.py  
│   └── test_data_tools.py  
│  
├── .gitignore  
├── setup.py  
└── README.md

Steps to Organize and Maintain Your Python Codebase for Beginners

我喜歡pytest的原因之一是它的靈活性。它超越了基本的單元測(cè)試,提供了強(qiáng)大的功能,如夾具、參數(shù)化測(cè)試和插件。夾具可讓您設(shè)置多個(gè)測(cè)試可以重復(fù)使用的測(cè)試數(shù)據(jù)或配置,從而使您的代碼保持干燥(不要重復(fù))。參數(shù)化測(cè)試允許您使用不同的輸入運(yùn)行相同的測(cè)試,從而節(jié)省時(shí)間并減少重復(fù)。如果您需要擴(kuò)展 pytest 的功能,可以使用廣泛的插件生態(tài)系統(tǒng),例如測(cè)試 Django 應(yīng)用程序、測(cè)量代碼覆蓋率或模擬 HTTP 請(qǐng)求。

第 7 步:代碼質(zhì)量和預(yù)提交 Hook

保持高代碼質(zhì)量可確保您的代碼易于閱讀、維護(hù)并且沒有常見錯(cuò)誤。有多種工具可以幫助實(shí)施一致的編碼標(biāo)準(zhǔn)、自動(dòng)格式化代碼并及早檢測(cè)潛在問題。一些流行的選項(xiàng)包括 pylintflake8、黑色檢測(cè)秘密。

  • pylint 強(qiáng)制執(zhí)行編碼標(biāo)準(zhǔn)并捕獲常見錯(cuò)誤。

  • flake8 結(jié)合了檢測(cè)樣式違規(guī)和邏輯錯(cuò)誤的工具。

  • black 是一個(gè)固執(zhí)己見的格式化程序,可確保您的代碼遵循 PEP8 標(biāo)準(zhǔn)。

  • 檢測(cè)秘密掃描您的代碼以防止硬編碼的秘密被暴露。

您可以通過以下方式安裝這些工具:

pyenv install 3.12.2

例如,在特定文件或目錄上運(yùn)行 pylint:

brew update && brew upgrade pyenv

Steps to Organize and Maintain Your Python Codebase for Beginners

您將收到一份報(bào)告,其中包含警告和改進(jìn)代碼的建議。要忽略特定警告,您可以使用:

brew install readline xz

您還可以使用flake8來查找樣式問題和邏輯錯(cuò)誤:

blog_de_toolkit/  
│  
├── de_toolkit/  
│   ├── __init__.py  
│   └── data_tools.py  
│  
├── tests/  
│   ├── __init__.py  
│   └── test_data_tools.py  
│  
├── .gitignore  
├── setup.py  
└── README.md

Steps to Organize and Maintain Your Python Codebase for Beginners

要自動(dòng)格式化代碼,請(qǐng)運(yùn)行 black:

pyenv install 3.12.2

您可以使用預(yù)提交掛鉤自動(dòng)執(zhí)行該過程,而不是每次進(jìn)行更改時(shí)手動(dòng)運(yùn)行這些工具。預(yù)提交掛鉤在每次提交之前自動(dòng)運(yùn)行,如果任何工具失敗,則會(huì)阻止提交。

首先,安裝預(yù)提交軟件包:

brew update && brew upgrade pyenv

接下來,在項(xiàng)目目錄中創(chuàng)建一個(gè) .pre-commit-config.yaml 文件,其中包含以下內(nèi)容(這里我使用了所有我最喜歡的基本預(yù)提交):

激活本地存儲(chǔ)庫(kù)中的預(yù)提交掛鉤:

blog_de_toolkit/  
│  
├── de_toolkit/  
│   ├── __init__.py  
│   └── data_tools.py  
│  
├── tests/  
│   ├── __init__.py  
│   └── test_data_tools.py  
│  
├── .gitignore  
├── setup.py  
└── README.md

現(xiàn)在,每次您嘗試提交時(shí),這些工具都會(huì)自動(dòng)運(yùn)行。如果任何工具失敗,提交將被阻止,直到問題得到解決。您還可以在代碼庫(kù)中手動(dòng)運(yùn)行所有掛鉤:

pyenv install 3.12.2

第8步:創(chuàng)建分發(fā)包

現(xiàn)在我們已經(jīng)構(gòu)建了我們的項(xiàng)目,編寫了一些代碼,添加了測(cè)試并設(shè)置了預(yù)提交掛鉤,下一步是弄清楚其他人(甚至未來的我們)如何輕松使用它。打包項(xiàng)目使這成為可能。它允許我們將所有內(nèi)容整齊地捆綁在一起,以便無(wú)需手動(dòng)復(fù)制文件即可安裝和使用。

要共享您的項(xiàng)目,您需要正確構(gòu)建包、編寫有意義的自述文件、創(chuàng)建啟動(dòng)腳本并生成分發(fā)包。一個(gè)好的自述文件通常包括項(xiàng)目名稱和其功能的簡(jiǎn)要描述、安裝說明、使用示例、設(shè)置環(huán)境的開發(fā)說明以及貢獻(xiàn)指南。您可以在存儲(chǔ)庫(kù)中找到我們的 blog_de_toolkit 項(xiàng)目的簡(jiǎn)單 README.md 示例。

任何 Python 包的核心都是 setup.py 文件。該文件是我們定義打包和安裝項(xiàng)目所需的元數(shù)據(jù)和配置的地方。它包括項(xiàng)目的 名稱、版本描述,這使其可識(shí)別。 long_description 從 README 文件中讀取內(nèi)容,以便當(dāng)用戶在 PyPI 上看到該項(xiàng)目時(shí)為他們提供有關(guān)該項(xiàng)目的更多背景信息。我們?cè)?install_requires 列表中指定依賴項(xiàng),以便它們與包一起自動(dòng)安裝。 entry_points 部分定義了命令行界面 (CLI) 條目,以便用戶可以從終端運(yùn)行該工具。我們使用 find_packages() 來包含包中的所有子模塊,并且 classifiers 部分提供元數(shù)據(jù),例如項(xiàng)目使用的 Python 版本和許可證。最后,python_requires 字段確保包僅安裝在兼容的 Python 版本上。這是我們的 blog_de_toolkit 項(xiàng)目的 setup.py 配置:

配置setup.py后,您可以構(gòu)建分發(fā)包。首先安裝必要的工具:

blog_de_toolkit/  
│  
├── de_toolkit/  
│   ├── __init__.py  
│   └── data_tools.py  
│  
├── tests/  
│   ├── __init__.py  
│   └── test_data_tools.py  
│  
├── .gitignore  
├── setup.py  
└── README.md

然后構(gòu)建包:

pyenv install 3.12.2

此命令創(chuàng)建兩個(gè)分發(fā)文件:

  • sdist:源存檔(例如 .tar.gz)

  • bdist_wheel:構(gòu)建的包(例如.whl)

Steps to Organize and Maintain Your Python Codebase for Beginners

這些文件將位于 dist/ 目錄中。要測(cè)試該包,請(qǐng)使用以下命令在本地安裝它:

brew update && brew upgrade pyenv

您還可以通過運(yùn)行來測(cè)試 CLI 命令:

brew install readline xz

他應(yīng)該打印數(shù)據(jù)庫(kù) URL、API 密鑰以及來自 sample_data.csv.

的已清理數(shù)據(jù)

如果您想公開分享該包,您可以將其上傳到PyPI。首先,安裝 Twine:

pyenv virtualenv 3.12.2 de_toolkit

然后上傳包:

pyenv local de_toolkit

系統(tǒng)將提示您輸入 PyPI 憑據(jù)。上傳后,其他人可以直接從 PyPI 安裝您的包:

pip install setuptools wheel twine pandas 

第10步:保護(hù)主分支

隨著您的項(xiàng)目的發(fā)展,更多的人通常會(huì)同時(shí)在同一個(gè)代碼庫(kù)上工作。如果沒有適當(dāng)?shù)谋Wo(hù)措施,錯(cuò)誤、未經(jīng)測(cè)試的代碼或意外合并很容易潛入并造成混亂。為了保持事情順利進(jìn)行并保持高標(biāo)準(zhǔn),保護(hù)主干就變得至關(guān)重要。在此步驟中,我們將了解如何設(shè)置分支保護(hù)規(guī)則,并分享一些對(duì)拉取請(qǐng)求進(jìn)行順利代碼審查的技巧。

分支保護(hù)規(guī)則確保任何人都無(wú)法在未通過測(cè)??試或代碼審查的情況下直接推送到主分支。這可以防止未完成的功能、錯(cuò)誤或不良代碼潛入并破壞項(xiàng)目。它還通過要求拉取請(qǐng)求來促進(jìn)團(tuán)隊(duì)合作,讓其他人有機(jī)會(huì)提供反饋。另外,自動(dòng)檢查(如測(cè)試和 linter)可確保代碼在合并之前是可靠的。

在 GitHub 上設(shè)置分支保護(hù)規(guī)則非常簡(jiǎn)單。前往存儲(chǔ)庫(kù)的設(shè)置,然后單擊“代碼和自動(dòng)化”部分下的分支。查找分支保護(hù)規(guī)則并單擊添加分支保護(hù)規(guī)則。在分支名稱字段中輸入 main,現(xiàn)在是時(shí)候調(diào)整一些設(shè)置了。

Steps to Organize and Maintain Your Python Codebase for Beginners

您可以設(shè)置分支保護(hù)規(guī)則來要求拉取請(qǐng)求審查,確保有人在合并之前檢查代碼。狀態(tài)檢查確保測(cè)試通過并且 linter 順利運(yùn)行,并使分支保持最新更改有助于避免沖突。如果需要,您可以限制誰(shuí)可以推送到分支,甚至需要簽名提交以提高安全性。一切設(shè)置完畢后,單擊創(chuàng)建,就像這樣 - 不再直接推送或跳過測(cè)試。

當(dāng)您的拉取請(qǐng)求接受審核時(shí),最好讓審核者感到輕松。首先清楚地描述您的更改的作用以及為什么需要它們。使用有意義的提交消息來反映已更新的內(nèi)容。如果更改較小且重點(diǎn)突出,則審核過程會(huì)變得更加順利和更快。不要忘記禮貌地回復(fù)評(píng)論并跟進(jìn)請(qǐng)求的更改 - 這表明您重視反饋并有助于保持積極的合作。

如果您是審查拉取請(qǐng)求的人,那么您的工作不僅僅是發(fā)現(xiàn)錯(cuò)誤 - 還包括改進(jìn)代碼并支持您的隊(duì)友。首先閱讀拉取請(qǐng)求描述,以了解更改試圖實(shí)現(xiàn)的目標(biāo)。專注于提供建設(shè)性反饋——如果需要,建議替代方案,并解釋為什么它們可能效果更好。通過簡(jiǎn)單的“重構(gòu)不錯(cuò)?!”來認(rèn)可優(yōu)秀的工作還有助于創(chuàng)造積極的評(píng)論體驗(yàn)。密切關(guān)注測(cè)試,確保它們存在、相關(guān)且通過。如果有些事情不清楚,請(qǐng)?zhí)岢鰡栴}而不是做出假設(shè)。歸根結(jié)底,評(píng)論是關(guān)于團(tuán)隊(duì)合作的——合作使項(xiàng)目變得更好。

使用審核模板可以讓每個(gè)人都專注于重要的事情,從而使流程更加順利。以下是拉取請(qǐng)求審核模板的示例:

blog_de_toolkit/  
│  
├── de_toolkit/  
│   ├── __init__.py  
│   └── data_tools.py  
│  
├── tests/  
│   ├── __init__.py  
│   └── test_data_tools.py  
│  
├── .gitignore  
├── setup.py  
└── README.md

將這樣的模板添加到您的貢獻(xiàn)指南中或?qū)⑵滏溄拥酱鎯?chǔ)庫(kù)中,可以讓審閱者輕松保持在正軌上。它還使評(píng)論之間的內(nèi)容保持一致,幫助團(tuán)隊(duì)維護(hù)干凈且有組織的代碼庫(kù)。

第 11 步:CI/CD 的 GitHub Actions

基于保護(hù)主分支的重要性,確保在合并或部署之前對(duì)每個(gè)代碼更改進(jìn)行正確的測(cè)試、審查和驗(yàn)證也至關(guān)重要。這就是持續(xù)集成(CI)持續(xù)交付/部署(CD)發(fā)揮作用的地方。 CI/CD 自動(dòng)化運(yùn)行測(cè)試、執(zhí)行代碼檢查和部署更改的過程,為開發(fā)人員提供快速反饋并減少錯(cuò)誤進(jìn)入生產(chǎn)的機(jī)會(huì)。

GitHub Actions 是直接集成到 GitHub 中的自動(dòng)化工具。它使您能夠創(chuàng)建響應(yīng)存儲(chǔ)庫(kù)中的事件(例如推送或拉取請(qǐng)求)的工作流程。在 GitHub Actions 中,我們可以自動(dòng)執(zhí)行多項(xiàng)關(guān)鍵任務(wù)以維護(hù)健康的代碼庫(kù)。例如:

  • 每當(dāng)推送代碼或創(chuàng)建拉取請(qǐng)求時(shí)運(yùn)行測(cè)試,確保新的更改不會(huì)破壞任何內(nèi)容。

  • 檢查代碼風(fēng)格和 linting 以執(zhí)行一致的編碼標(biāo)準(zhǔn)。

  • 應(yīng)用預(yù)提交掛鉤來格式化代碼并捕獲尾隨空格等小問題。

  • 在所有檢查通過后生成文檔甚至部署代碼。

讓我們?cè)O(shè)置一個(gè) GitHub Actions 工作流程,運(yùn)行我們的單元測(cè)試,并在主分支上發(fā)生推送或拉取請(qǐng)求時(shí)應(yīng)用預(yù)提交 linter(如黑色)。

首先,創(chuàng)建工作流程文件:

blog_de_toolkit/  
│  
├── de_toolkit/  
│   ├── __init__.py  
│   └── data_tools.py  
│  
├── tests/  
│   ├── __init__.py  
│   └── test_data_tools.py  
│  
├── .gitignore  
├── setup.py  
└── README.md

這是ci.yml的內(nèi)容:

每當(dāng)在主分支上推送代碼或打開拉取請(qǐng)求時(shí),此工作流程都會(huì)自動(dòng)進(jìn)行測(cè)試和檢查。它確保在合并代碼之前通過所有質(zhì)量檢查。 actions/checkout 操作將存儲(chǔ)庫(kù)克隆到運(yùn)行器中,我們使用 actions/setup-python 為工作流程配置 Python 3.12。依賴項(xiàng)是使用 pip 從requirements.txt 安裝的。之后,所有測(cè)試都使用 pytest 運(yùn)行,預(yù)提交掛鉤確保代碼遵循格式和樣式指南。如果任何測(cè)試或檢查失敗,工作流程就會(huì)停止,以防止損壞的代碼被合并。

讓我們測(cè)試一下。首先,從主分支創(chuàng)建一個(gè)新分支并進(jìn)行一些更改。

Steps to Organize and Maintain Your Python Codebase for Beginners

就我而言,我更新了自述文件文件。提交您的更改并向主分支打開拉取請(qǐng)求。

Steps to Organize and Maintain Your Python Codebase for Beginners

現(xiàn)在您將看到需要進(jìn)行審核,并且 GitHub Actions (GA) 正在運(yùn)行所有檢查。即使合并被分支保護(hù)規(guī)則阻止,我仍然可以“無(wú)需等待滿足要求即可合并”,因?yàn)槲业臋?quán)限允許繞過保護(hù)。

Steps to Organize and Maintain Your Python Codebase for Beginners

您可以在 Actions 選項(xiàng)卡中跟蹤 GitHub Actions 工作流程的結(jié)果。

Steps to Organize and Maintain Your Python Codebase for Beginners

以下是運(yùn)行期間 pytest 步驟的示例:

Steps to Organize and Maintain Your Python Codebase for Beginners

第 12 步:語(yǔ)義版本控制 (SemVer)

手動(dòng)跟蹤項(xiàng)目的版本可能會(huì)變得混亂,尤其是隨著項(xiàng)目的增長(zhǎng)。這就是 語(yǔ)義版本控制 (SemVer) 的用武之地 - 它遵循 MAJOR.MINOR.PATCH 模式來傳達(dá)每個(gè)版本中發(fā)生的更改。使用 python-semantic-release 自動(dòng)進(jìn)行版本控制使這變得更加容易。它會(huì)分析您的提交消息,根據(jù)更改類型、標(biāo)記版本來升級(jí)版本,如果需要,甚至可以將您的包發(fā)布到 PyPI。這消除了版本管理中的猜測(cè)并確保了一致性。

為了實(shí)現(xiàn)無(wú)縫版本控制,您可以將 python-semantic-release 直接集成到 GitHub Actions 中。官方文檔提供了每當(dāng)您推送到主分支時(shí)自動(dòng)進(jìn)行版本更新和發(fā)布的工作流程。通過此設(shè)置,發(fā)布過程變得順暢且無(wú)需干預(yù),因此您可以專注于編寫代碼,而不必?fù)?dān)心手動(dòng)管理版本。

常見工作流程示例 — python-semantic-release

為了實(shí)現(xiàn)此目的,您的提交消息需要遵循傳統(tǒng)的提交標(biāo)準(zhǔn)。每種類型的提交決定版本是否會(huì)提升 PATCH、MINORMAJOR 級(jí)別:

  • 修復(fù):觸發(fā) PATCH 版本更新(例如 1.0.0 → 1.0.1)。

  • 壯舉:觸發(fā)次要版本更新(例如,1.0.0 → 1.1.0)。

  • 重大更改:提交消息中的! 會(huì)觸發(fā)主要版本更新(例如,1.0.0 → 2.0.0)。

通過遵循這些簡(jiǎn)單的約定,您將始終知道每個(gè)新版本會(huì)發(fā)生什么。

結(jié)論

我們涵蓋了從組織項(xiàng)目和管理機(jī)密到編寫測(cè)試、自動(dòng)化工作流程以及使用語(yǔ)義版本控制處理發(fā)布的所有內(nèi)容。有了正確的工具和流程,構(gòu)建可靠且可維護(hù)的項(xiàng)目就會(huì)變得更加順利,甚至充滿樂趣。

關(guān)鍵是保持一致,盡可能實(shí)現(xiàn)自動(dòng)化,并不斷改進(jìn)。隨著時(shí)間的推移,每一個(gè)小步驟都會(huì)產(chǎn)生很大的變化?,F(xiàn)在輪到你了——去構(gòu)建、實(shí)驗(yàn)并享受這個(gè)過程!嘗試將這些步驟應(yīng)用到您的下一個(gè)項(xiàng)目中 - 并隨時(shí)在評(píng)論中分享您的經(jīng)驗(yàn)!

以上是為初學(xué)者組織和維護(hù) Python 代碼庫(kù)的步驟的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

Python類中的多態(tài)性 Python類中的多態(tài)性 Jul 05, 2025 am 02:58 AM

多態(tài)是Python面向?qū)ο缶幊讨械暮诵母拍睿浮耙环N接口,多種實(shí)現(xiàn)”,允許統(tǒng)一處理不同類型的對(duì)象。1.多態(tài)通過方法重寫實(shí)現(xiàn),子類可重新定義父類方法,如Animal類的speak()方法在Dog和Cat子類中有不同實(shí)現(xiàn)。2.多態(tài)的實(shí)際用途包括簡(jiǎn)化代碼結(jié)構(gòu)、增強(qiáng)可擴(kuò)展性,例如圖形繪制程序中統(tǒng)一調(diào)用draw()方法,或游戲開發(fā)中處理不同角色的共同行為。3.Python實(shí)現(xiàn)多態(tài)需滿足:父類定義方法,子類重寫該方法,但不要求繼承同一父類,只要對(duì)象實(shí)現(xiàn)相同方法即可,這稱為“鴨子類型”。4.注意事項(xiàng)包括保持方

什么是python的列表切片? 什么是python的列表切片? Jun 29, 2025 am 02:15 AM

ListslicinginPythonextractsaportionofalistusingindices.1.Itusesthesyntaxlist[start:end:step],wherestartisinclusive,endisexclusive,andstepdefinestheinterval.2.Ifstartorendareomitted,Pythondefaultstothebeginningorendofthelist.3.Commonusesincludegetting

python`@classmethod'裝飾師解釋了 python`@classmethod'裝飾師解釋了 Jul 04, 2025 am 03:26 AM

類方法是Python中通過@classmethod裝飾器定義的方法,其第一個(gè)參數(shù)為類本身(cls),用于訪問或修改類狀態(tài)。它可通過類或?qū)嵗{(diào)用,影響的是整個(gè)類而非特定實(shí)例;例如在Person類中,show_count()方法統(tǒng)計(jì)創(chuàng)建的對(duì)象數(shù)量;定義類方法時(shí)需使用@classmethod裝飾器并將首參命名為cls,如change_var(new_value)方法可修改類變量;類方法與實(shí)例方法(self參數(shù))、靜態(tài)方法(無(wú)自動(dòng)參數(shù))不同,適用于工廠方法、替代構(gòu)造函數(shù)及管理類變量等場(chǎng)景;常見用途包括從

Python函數(shù)參數(shù)和參數(shù) Python函數(shù)參數(shù)和參數(shù) Jul 04, 2025 am 03:26 AM

參數(shù)(parameters)是定義函數(shù)時(shí)的占位符,而傳參(arguments)是調(diào)用時(shí)傳入的具體值。1.位置參數(shù)需按順序傳遞,順序錯(cuò)誤會(huì)導(dǎo)致結(jié)果錯(cuò)誤;2.關(guān)鍵字參數(shù)通過參數(shù)名指定,可改變順序且提高可讀性;3.默認(rèn)參數(shù)值在定義時(shí)賦值,避免重復(fù)代碼,但應(yīng)避免使用可變對(duì)象作為默認(rèn)值;4.args和*kwargs可處理不定數(shù)量的參數(shù),適用于通用接口或裝飾器,但應(yīng)謹(jǐn)慎使用以保持可讀性。

如何使用CSV模塊在Python中使用CSV文件? 如何使用CSV模塊在Python中使用CSV文件? Jun 25, 2025 am 01:03 AM

Python的csv模塊提供了讀寫CSV文件的簡(jiǎn)單方法。1.讀取CSV文件時(shí),可使用csv.reader()逐行讀取,并將每行數(shù)據(jù)作為字符串列表返回;若需通過列名訪問數(shù)據(jù),則可用csv.DictReader(),它將每行映射為字典。2.寫入CSV文件時(shí),使用csv.writer()并調(diào)用writerow()或writerows()方法寫入單行或多行數(shù)據(jù);若要寫入字典數(shù)據(jù),則使用csv.DictWriter(),需先定義列名并通過writeheader()寫入表頭。3.處理邊緣情況時(shí),模塊自動(dòng)處理

解釋Python發(fā)電機(jī)和迭代器。 解釋Python發(fā)電機(jī)和迭代器。 Jul 05, 2025 am 02:55 AM

迭代器是實(shí)現(xiàn)__iter__()和__next__()方法的對(duì)象,生成器是簡(jiǎn)化版的迭代器,通過yield關(guān)鍵字自動(dòng)實(shí)現(xiàn)這些方法。1.迭代器每次調(diào)用next()返回一個(gè)元素,無(wú)更多元素時(shí)拋出StopIteration異常。2.生成器通過函數(shù)定義,使用yield按需生成數(shù)據(jù),節(jié)省內(nèi)存且支持無(wú)限序列。3.處理已有集合時(shí)用迭代器,動(dòng)態(tài)生成大數(shù)據(jù)或需惰性求值時(shí)用生成器,如讀取大文件時(shí)逐行加載。注意:列表等可迭代對(duì)象不是迭代器,迭代器到盡頭后需重新創(chuàng)建,生成器只能遍歷一次。

如何在Python中結(jié)合兩個(gè)列表? 如何在Python中結(jié)合兩個(gè)列表? Jun 30, 2025 am 02:04 AM

合并兩個(gè)列表有多種方法,選擇合適方式可提升效率。1.使用 號(hào)拼接生成新列表,如list1 list2;2.使用 =修改原列表,如list1 =list2;3.使用extend()方法在原列表上操作,如list1.extend(list2);4.使用號(hào)解包合并(Python3.5 ),如[list1,*list2],支持靈活組合多個(gè)列表或添加元素。不同方法適用于不同場(chǎng)景,需根據(jù)是否修改原列表及Python版本進(jìn)行選擇。

如何在Python中調(diào)用功能? 如何在Python中調(diào)用功能? Jun 25, 2025 am 12:59 AM

要調(diào)用Python中的函數(shù),需先定義函數(shù)再使用函數(shù)名加括號(hào)的形式進(jìn)行調(diào)用。1.使用def關(guān)鍵字定義函數(shù),如defgreet():print("Hello,world!");2.通過函數(shù)名后加括號(hào)調(diào)用函數(shù),如greet();3.若函數(shù)需要參數(shù),調(diào)用時(shí)在括號(hào)內(nèi)傳入對(duì)應(yīng)值,如defgreet(name):print(f"Hello,{name}!")和greet("Alice");4.可傳遞多個(gè)參數(shù),如defadd(a,b):result=a

See all articles