原文:5 tips for writing better python譯者注:如果你是python程式設計師,你一定積累了不少的程式設計技巧,下文中的這些技巧,你掌握了麼?翻譯:夜風輕揚
我寫python已經有一段時間了,當我回顧起一些較老的**時,我有時會感到一些畏縮。例如,當我剛開始程式設計的時候,我用python編寫了這個sudoku 遊戲(在github上可以獲得)。我當時認為這是我最好的作品之一。事實證明,我甚至不能轉殖並執行它,因為我沒有新增乙個setup.py或 requirements.txt檔案,這是我今天絕不會犯的錯誤!
這讓我反思了多年來python**的質量是如何變化的。它確實變得更乾淨,更健壯,更易於閱讀。但是是什麼使它成為這樣的呢?
在這篇文章中,我將**一下對於編寫python**方式所做的一些改變——不管是大的還是小的。我這樣做是希望能夠幫助你提高python**的質量。其中一些技術甚至可能適用於其他語言和技術。
當你拿到乙個新的python包時,開始使用它還是比較容易的,你所做的只需輸入「pip install」,加上包名或者路徑,然後執行它。
有很多種方法來完成這項工作,我的方法是為我的專案建立乙個setup.py檔案。
假定在 「flask_example.py」中有乙個簡單的flask程式:
from flask import flask
defhello_world
():return
'hello, world!'
defmain
():if __name__ == 『__main__』:
main()
我們可以將其轉換為可安裝的python包,首先將其移動到乙個單獨的資料夾中(我們將其稱為「flask_example/」。然後,我們可以在根專案資料夾中建立setup.py檔案,該檔案看起來是這樣的:
from distutils.core import setup
setup(
name='flask_example',
version='1.0',
description='hello, world! in flask.',
packages=['flask_example'],
install_requires=[
'flask==0.12.2'
],entry_points =
)
這樣做有一些優點。首先,你現在可以使用「pip install -e .」本地安裝你的應用。這使得開發人員可以更容易地轉殖和安裝你的專案。因為setup.py檔案將處理所有繁重的工作。
其次,setup.py還可以處理依賴管理工作。 install_requires變數允許你定義使用的包和特定的版本。如果你不確定所使用的包和版本,你可以執行「pip freeze」來檢視這些資訊。
最後,這樣還允許你為你的包定義入口,這只需在命令列上輸入「runserver」來執行**。
使用linter可以在**中解決很多問題。pylint是python的乙個很好的linter,如果你使用像git這樣的版本控制系統,那麼你可以在提交**前,讓git通過乙個linter執行你的**,。
要做到這一點,需要安裝pylint包。
pip install pylint
然後,將以下**新增到.git/hooks/pre-commit中。如果你已經有了乙個預提交鉤子,那麼簡單地將pylint命令附加到檔案的末尾。
#!/bin/sh
pylint
這可以在提交到git庫前就捕捉所有型別的錯誤。你可以對**中的語法錯誤以及其他的乙個良好的linter 可以捕捉到的錯誤說再見了,
在python中,匯入命令語句中(如 from . import module_name)很少使用相對模組路徑。如果你已經經歷了為你的專案建立setup.py檔案(或者類似的機制)的過程, 你可以簡單地通過它們的完整模組路徑來引用子模組。
我深有體會的是使用相對匯入很快會成為一場噩夢。當你開始程式設計的時候,萬事皆好,但是,一旦你可以移動模組或者進行重大重構的時候,這會讓你感到頭疼了。
無論你何時開啟乙個檔案、流或者是聯結器的時候,你都會和上下文管理器打交道。上下文管理器的重要性在於:如果使用恰當,它們可以處理諸如關閉檔案時丟擲異常這樣的問題。為了做到這一點,只需使用關鍵字。
下面是大多數python初級程式設計師可能寫入檔案的語句。
f = open(『newfile.txt』, 『w』)
f.write(『hello, world!』)
f.close()
這相當簡單,但是想象一下如下場景:你正在將成千上萬行**寫入乙個檔案。在某個時候,出現了乙個異常。因為異常的產生,你的檔案沒有正確地關閉,那些所有的你認為已經正確寫入檔案的資料都損壞或丟失了。
不過,不要擔心,通過一些簡單的重構,我們可以確保檔案正確地關閉,即使遇到異常。我們可以這樣做,如下所示。
with
open(『file』, 『w』) as
file:
file.write(『hello, world!』)
太棒了!真的很簡單。此外,**看起來更清爽,而且更簡潔。你還可以使用單個「with」語句開啟多個上下文管理器,從而消除了巢狀「with」語句的需要。
with
open(『file1』, 『w』) as f1, open(『file2』, 『w』) as f2:
f1.write(『hello』)
f2.write(『world』)
5.使用良好命名(well-named)的函式和變數
在python,尤其是非強型別語言中,很容易不清楚什麼樣的函式要返回什麼值。特別是當你只是某個庫中一些函式的使用者時。如果你可以為開發人員節省在文件中查詢函式的5分鐘時間,這實際上是乙個非常有價值的改進。但是我們該怎麼做呢?如何做一些簡單的如更改變數名字這樣事情,來節省開發時間?
在命名函式或變數時,我喜歡考慮三件主要的事情:
函式和變數要做什麼
任何與函式或變數相關的單元
函式或變數的資料型別
為了提高這個函式的名字,我會把其改為 「get_rect_area_sq_ft」。這就讓使用者清楚的了解函式的功能和返回值。也讓使用者明白面積的單位是平方英呎。
如果你可以通過給函式和變數恰當的命名來給開發人員處處節約時間,不僅提高了開發效率,也使他們更樂意使用你的**。
在作為python程式設計師的這些年裡,我發現這些技巧還是很有幫助的。有些是我自己摸索出來的,有些是別人教我的。我希望這個列表能夠幫助您編寫更好的python**。
用Python編寫web爬蟲的5個方法
這些庫可以使你更容易構架個人專案。在 python django 的世界裡有這樣乙個諺語 為語言而來,為社群而留。對絕大多數人來說的確是這樣的,但是,還有一件事情使得我們一直停留在 python 的世界裡,不願離開,那就是我們可以很容易地利用一頓午餐或晚上幾個小時的時間,把乙個想法快速地實現出來。這...
python編寫乙個使用者登入程式
print 新建使用者 n n print 登入賬號 e e print 退出程式 q q contact dict while 1 a input 請輸入指令 if a n or a n name input 請輸入使用者名稱 if name in contact name input 此使用者已...
Python 編寫的分析網速程式
我們宿舍原來是 7 個人共享乙個 1m 的 adsl 寬頻,最近感覺這點頻寬用起來是越來越力不從心了,所以我們打算做一次全面的分析,看看到底是誰的哪種網路應用占用頻寬比較多。首先得測試一下大家在正常使用時的網速。還好我們的 tp link 的那個路由器有流量統計的功能,開啟這功能後路由器的管理頁面可...