創建名為main()的函數來包含要運行的代碼
現在,您可以編寫作為腳本由從命令行執行並導入且沒有副作用的Python代碼。接下來,您將學習如何編寫代碼並使其他程式設計師能輕鬆地理解其含義。
許多語言,如C,C++,Java以及其他的一些語言,都會定義一個叫做main()的函數,當編譯程序時,作業系統會自動調用該函數。此函數通常被稱為入口點(entry point),因為它是程序進入執行的起始位置。
相比之下,Python沒有一個特殊的函數作為腳本的入口點。實際上在Python中可以將入口點定義成任何名稱。
儘管Python不要求將函數命名為main(),但是最佳的做法是將入口點函數命名為main()。這樣方便其他程式設計師定位程序的起點。
此外,main()函數應該包含Python解釋器執行文件時要運行的任何代碼。這比將代碼放入條件語塊中更好,因為用戶可以在導入模塊時重複使用main()函數。
修改best_practices.py文件如下所示:
在這個示例中,定義了一個main()函數,它包含了上面的條件語句塊。之後修改條件語塊執行main()。如果您將此代碼作為腳本運行或導入,將獲得與上一節相同的輸出。
在main()中調用其他函數
另一種常見的實現方式是在main()中調用其他函數,而不是直接將代碼寫入main()。這樣做的好處在於可以實現將幾個獨立運行的子任務整合。
例如,某個腳本有如下功能:
從數據源如資料庫,文件,硬碟或web API讀取數據。
處理數據。
將處理後的數據寫入另一個位置。
如果在單獨的函數中各自實現這些子任務,您(或其他用戶)可以很容易地實現代碼重用。之後您可以在main()函數中創建默認的工作流。
您可以根據自己的情況選擇是否使用此方案。將任務拆分為多個函數會使重用更容易,但會增加他人理解代碼的難度。
修改best_practices.py文件如下所示:
在此示例代碼中,文件的前10行具有與之前相同的內容。第12行的第二個函數創建並返回一些示例數據,第17行的第三個函數模擬將修改後的數據寫入資料庫。
第21行定義了main()函數。在此示例中,對main()做出修改,它將調用數據讀取,數據處理以及數據寫入等功能。
首先,從read_data_from_web()中創建data。將data作為參數傳入process_data(),之後將返回modified_data。最後,將modified_data傳入write_data_to_database()。
腳本的最後兩行是條件語塊用於驗證__name__,並且如果if語句為True,則執行main()。
在命令行中運行如下所示:
根據執行結果,Python解釋器在執行main()函數時,將依次執行read_data_from_web(),process_data()以及write_data_to_database()。當然,您也可以導入best_practices.py文件並重用process_data()作為不同的數據輸入源,如下所示:
在此示例中,導入了best_practices並且將其簡寫為bp。
導入過程會導致Python解釋器執行best_practices.py的全部代碼,因此輸出顯示解釋文件用途的信息。
然後,從文件中存儲數據而不是從Web中讀取數據。之後,可以重用best_practices.py文件中的process_data()和write_data_to_database()函數。在此情況下,可以利用代碼重寫來取代在main()函數中實現全部的代碼邏輯。
實踐總結
以下是Python中main()函數的四個關鍵最佳實踐:
將計算時間過長或對計算機產生其他影響的代碼寫入函數或類,這樣可以精確地控制代碼的運行時間。
使用不同的__name__值來確定上下文並使用條件語句更改代碼的行為。
將入口點函數命名為main(),以便傳達函數的意圖,即使Python對名為main()的函數並沒有賦予特殊的含義。
如果想代碼重用,請在main()外定義函數,並在main()中對其進行調用。
結論
恭喜!您現在已經了解如何創建Python main()函數了。
本文介紹了如下內容:
了解__name__變量的值對於編寫用於可執行腳本和導入模塊的雙重用途的代碼的重要性。
根據執行Python文件的方式,__name__具有不同的值。__name__的取值有以下幾種情況:
對於開發可重用的代碼,Python程式設計師已經提供了一套良好的方案。
現在,您可以開始編寫一些非常棒的關於Python main()函數代碼啦!
英文原文:https://realpython.com/python-main-function/