優(yōu)化 Python 開發(fā)環(huán)境的幾個神技巧
用Python編代碼體驗極佳,并且隨著新版本的發(fā)布越來越好!
對于很多人而言,Python提供的大量免費(fèi)函數(shù)庫、高可讀性的程序和新引入的類型注釋讓很多愛不釋手。
然而,數(shù)據(jù)科學(xué)家特別容易使自己的Jupyter notebook變得龐大而雜亂,或者寫出一些難以理解的python文件。
此外,當(dāng)一個項目依賴于同一函數(shù)庫的不同版本時,常常發(fā)生版本沖突。
修復(fù)以上問題消耗大量時間,還經(jīng)常導(dǎo)致其他項目出現(xiàn)問題。必須找到避免這類問題的解決方式,為編寫代碼提供便利。
在本篇文章中我將詳細(xì)介紹常用的工具與技巧,希望能給大家提供幫助。
Python開發(fā)環(huán)境
解釋器:
從使用Python最重要的解釋器開始。你可以只下載最喜歡的Python版本,然后把所有內(nèi)容放在里面。
但如果你的程序需要不同版本的Python,或依賴于同一第三方模塊的不同版本,并需要在幾個程序之間無縫切換時該怎么辦?
Pyenv可以解決上述問題。
Pyenv共包含三個工具,下面將介紹其中兩個:pyenv(用于安裝python)和pyenv-virtualenv(用于配置全局工具)。
可通過下方網(wǎng)址安裝pyenv:
curl https://pyenv.run | bash
安裝后,向.bashrc(或.zshrc)文件中添加下方代碼,使得pyenv可用于設(shè)備。
exportPATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
最后,重啟設(shè)備。
現(xiàn)在可以使用pyenv安裝幾乎所有的python解釋器,包括pypy、anaconda。
需要注意的是,pyenv只在電腦上搭建本地python環(huán)境。搭建python環(huán)境需要多種函數(shù)庫。
在Ubuntu系統(tǒng)的電腦上,必須安裝以下函數(shù)庫以防止運(yùn)行出現(xiàn)問題。
sudo apt-get installbuild-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev
zlib1g-dev libssl-dev openssllibgdbm-dev libgdbm-compat-dev liblzma-dev libreadline-dev libncursesw5-devlibffi-dev uuid-dev
現(xiàn)在,要安裝python解釋器只需要執(zhí)行以下指令。
pyenv installVERSION_YOU_WOULD_LIKE_TO_INSTALL
可以通過pyenv列出所有可用版本。
pyenv install --list
為了使上述過程更加具體,在此安裝python3.7.5并且設(shè)置其為默認(rèn)的全局解釋器。
pyenv install 3.7.5
pyenv global 3.7.5
輸入Python-version指令,屏幕將顯示Python3.7.5。
依賴性關(guān)系管理(DependencyManagement)
Python中的依賴性管理是項繁重的工作。有許多工具可以幫助完成這項任務(wù)。
我最常使用的工具是Poetry。
Poetry可以幫助你簡單地完成如下工作。
管理項目依賴關(guān)系
通過虛擬環(huán)境將項目分開
輕松構(gòu)建應(yīng)用程序與函數(shù)庫
推薦通過以下方式安裝poetry:
curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
另外一種依賴性管理的方式是使用pip和pyenv-virtualenv指令。
大家可能會問:為什么不只用pip?
因為只用pip可能會在全局環(huán)境中安裝poetry及其依賴項,這可能是你不需要也不想要的。
必要指令如下:
# Create a virtual environmentcalled tools that is based on 3.7.5
pyenv virtualenv 3.7.5 tools
# Install poetry into the tools virtual env
pyenv activate tools
pip install poetry
# Check installed poetry version
poetry --version
# Leave the virtual env
pyenv deactivate
# This does not work yet
poetry --version
# Add your tools virtual env to the globally available ones
pyenv global 3.7.5 tools
# Now this works and you can start using poetry
poetry --version
在使用poetry創(chuàng)建第一個項目之前,建議先對其進(jìn)行配置,這樣就可以在項目目錄中的.venv文件夾中創(chuàng)建虛擬環(huán)境。
當(dāng)你使用VsCode或Pycharm這類集成開發(fā)環(huán)境時就會變得非常方便,因為它們可以立即識別并選擇正確的解釋器。
poetry configsettings.virtualenvs.in-project true
注意:你只需設(shè)置一次配置,設(shè)置結(jié)果將在全局環(huán)境保留。
終于完成了使用poetry創(chuàng)建項目的所有準(zhǔn)備工作,我把這個項目命名為dsexample,為了展示如何使用poetry,我添加了一個特定版本的pandas庫,以及所有額外需求的fastapi框架。
# Initialze a new project
poetry new dsexample
cd dsexample
# Add modules and create virtual environment.
poetry add pandas=0.25 fastapi --extras all
# As an example of how you could add a git module
poetry add tf2-utils --git [email protected]:Shawe82/tf2-utils.git
格式一致性與可讀性(Consistent Formatting and Readability)
現(xiàn)在,已經(jīng)創(chuàng)建好了項目,即將開始添加代碼。理想情況下,代碼庫的格式應(yīng)該一致,以確保可讀性和可理解性。這將是一個非常沉悶乏味的過程,尤其在還有其他人操作代碼庫時。
但用Black可以解決上述問題!
Black是一種讓程序員在編寫python代碼時能將精力集中于核心內(nèi)容的工具。它自動為代碼添加格式,避免程序員手動添加格式。
因為Black的效果非常好,我們把它添加到dsexample中,讓它為所有的文件添加格式。
# We add black as a developmentdependency with --dev as we don't
# need it when it comes to production
poetry add --dev black=19.3b0
# Assume we are inside the current toplevel dsexample folder
poetry run black .
好了,現(xiàn)在所有的文件看起來非常整齊了。
類型糾正(Type-Correctness)
自Python3.5開始,類型注釋開始成為標(biāo)準(zhǔn)庫的一部分通過類型注釋,代碼更好理解,更易維護(hù),不易出錯。
為什么會不易出錯呢?因為可以靜態(tài)地檢查變量和函數(shù)的類型是否符合預(yù)期。當(dāng)然,必須是自動完成的。
下面介紹mypy!
Mypy是一種靜態(tài)python代碼檢查器,作用是在錯誤發(fā)生之前找到他們。使用poetry向項目中添加mypy并進(jìn)行代碼檢查與添加black一樣簡單。
# mypy as a developmentdependency with --dev as we don't
# need it when it comes to production
poetry add --dev mypy
# Assume we are inside the current toplevel dsexample folder
poetry run mypy .
運(yùn)行mypy也可能導(dǎo)致很多麻煩。當(dāng)然,可以將其設(shè)置為只對你關(guān)心的錯誤發(fā)出警告。這可以通過在項目中添加mypy.ini文件實(shí)現(xiàn)。
將自動化工具自動化(Automate the Automation)
使用black和mypy,我們不再需要手工為代碼添加格式,并且可以避免不必要的錯誤。
但是我們?nèi)孕枰謩邮褂眠@兩個工具,這兩個工具不是應(yīng)該也自動化嗎?
是的!
Pre-commit可以完成一切。
Pre-commit工具是在代碼提交到倉庫前執(zhí)行檢查(我默認(rèn)讀者的代碼處在git的控制下)。無法通過檢查的代碼將被拒絕。
這樣代碼倉庫就永遠(yuǎn)不會出現(xiàn)格式不整齊或是未經(jīng)類型檢查的代碼,以及任何其他你需要檢查錯誤的代碼。
現(xiàn)在來安裝pre-commit。
可以使用poetry將其直接安裝在項目里,也可以安裝在本地機(jī)器里。我傾向于后者,因為precommit只在本地使用,而不在CI/CD服務(wù)器上。
相反,black和mypy在CI/CD服務(wù)器上運(yùn)行,因此,將它們添加到項目的dev依賴項是有意義的。
建議使用下面方法通過現(xiàn)有的工具虛擬環(huán)境安裝它!
# Install pre-commit into the tools virtual env
pyenv activate tools
pip install pre-commit
# Leave the virtual env
pyenv deactivate
# As we have already added the tool venv, it will work directly
pre-commit --version
要使用pre-commit,首先需要向頂級文件夾中添加一個名為.pre-commit-config.yarm的文件。在該文件里,你需要配置所有應(yīng)該運(yùn)行的鉤子。
在mypy與Black的環(huán)境下,文件內(nèi)容如下所示:
repos:
- repo: https://github.com/ambv/black
rev: 19.3b0
hooks:
- id: black
language_version: python3.7
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v0.740
hooks:
- id: mypy
最后,你必須執(zhí)行以下命令以設(shè)置鉤子。
# I assume your are in the toplevel folder
pre-commit install
現(xiàn)在,鉤子函數(shù)(hook)將在每次提交時運(yùn)行。Black工具的鉤子函數(shù)不僅會檢查格式,還會相應(yīng)地為文件添加格式。
每次添加新的鉤子函數(shù)時,建議一開始在所有文件中手動運(yùn)行pre-commit,因為它只能作用于上次提交之后更改過的文件。
pre-commit run --all-files
就這樣,對自動化工具的自動化完成了。
- EOF -
回復(fù)關(guān)鍵字“簡明python ”,立即獲取入門必備書籍《簡明python教程》電子版
回復(fù)關(guān)鍵字“爬蟲”,立即獲取爬蟲學(xué)習(xí)資料

推薦
