如果你是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
app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' def main(): app.run() 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 = { 'console_scripts': 'runserver=flask_example.flask_example:main' }
)
這樣做有一些優點。首先,你現在可以使用“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 <your_package_name>
這可以在提交到Git庫前就捕捉所有類型的錯誤。你可以對代碼中的語法錯誤以及其他的一個良好的linter 可以捕捉到的錯誤說再見了,
在python中,導入命令語句中(如 from . import module_name)很少使用相對模塊路徑。如果你已經經歷了為你的項目創建setup.py文件(或者類似的機制)的過程, 你可以簡單地通過它們的完整模塊路徑來引用子模塊。
在Python 風格指南PEP-8中推薦使用絕對導入。這是因為在它們的名字里包含了更多的信息,而且根據 Python Softwa的說法,這樣也有“更好的表現”。
我深有體會的是使用相對導入很快會成為一場噩夢。當你開始編程的時候,萬事皆好,但是,一旦你可以移動模塊或者進行重大重構的時候,這會讓你感到頭疼了。
無論你何時打開一個文件、流或者是連接器的時候,你都會和上下文管理器打交道。上下文管理器的重要性在于:如果使用恰當,它們可以處理諸如關閉文件時拋出異常這樣的問題。為了做到這一點,只需使用關鍵字。
下面是大多數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分鐘時間,這實際上是一個非常有價值的改進。但是我們該怎么做呢?如何做一些簡單的如更改變量名字這樣事情,來節省開發時間?
在命名函數或變量時,我喜歡考慮三件主要的事情:
例如,如果我想創建一個函數來計算矩形的面積,我可能會將其命名為“calc_rect_area”。但是這不會讓用戶了解更多的信息。它會返回這個值?或者它會存儲在什么位置?這個值單位是英尺還是米?
為了提高這個函數的名字,我會把其改為 “get_rect_area_sq_ft”。這就讓用戶清楚的了解函數的功能和返回值。也讓用戶明白面積的單位是平方英尺。
如果你可以通過給函數和變量恰當的命名來給開發人員處處節約時間,不僅提高了開發效率,也使他們更樂意使用你的代碼。
在作為Python程序員的這些年里,我發現這些技巧還是很有幫助的。有些是我自己摸索出來的,有些是別人教我的。我希望這個列表能夠幫助您編寫更好的Python代碼。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。