毫無疑問 Python 中沒有所謂的 main 入口函數,可是網上常常看到一些文章提「Python 的 main 函數」、「建議寫 main 函數」……python
有些人是知情的,他的意圖多是模仿那些正宗的 main 函數,但還有很多人明顯是被誤導了(或本身誤解了),就寫出來很累贅的代碼。程序員
本期「Python 爲何」欄目來聊聊 Python 爲何沒有 main 函數? 編程
在開始正題以前,先要來回答這兩個問題:所謂的 「main 函數」是指什麼?爲何有些編程語言須要強制寫一個 main 函數? 編程語言
某些編程語言以 main 函數做爲程序的執行入口,例如 C/C++、C#、 Java、Go 和 Rust 等,它們具備特定的含義:ide
爲何要強制一個 main 入口函數呢?函數
這些語言是編譯型語言,須要把代碼編譯成可執行的二進制文件,爲了讓操做系統/啓動器找到程序的起點,因此要約定這一個函數。簡單地說,就是在一大堆代碼裏,須要定義一個顯著的可用於執行的開頭。測試
不難看出,main 函數是那些語言中重要而不可缺的有機組成部分。spa
然而,咱們再來看看 Python,狀況就大不相同了。操作系統
__main__.py
文件,它所在的包被當成一個「文件」來執行了歸結起來,意思是說 Python 這種腳本語言跟編譯型語言不一樣,它不論是在單個模塊層面(即一個 .py 文件),仍是在由多個模塊組成的包層面,均可選擇靈活的執行方式,不像其它語言缺了約定好的入口就無法執行。命令行
也就是說,Python 沒有必要在語法層面規定程序員必須定義出一個統一的入口(不論是函數仍是類仍是什麼東西)。
有些同窗可能會有疑惑,由於他們常常看到或者本身寫出下面這樣的代碼:
# main 裏是某些主體代碼 def main(): …… if __name__ == '__main__': main()
難道這不就是 Python 的 main 函數麼?相信有很多同窗會這麼想!
非也!非也!
除了函數名是「main」之外,它跟咱們前面介紹的正統的 main 函數沒有半毛錢關係,既沒有強制性,也沒有必然決定程序執行順序的做用。缺乏它,也不會致使什麼語法問題。
之因此有些知情人要命名出一個」main「函數,實際上是想強調它的」主要「地位,想要人爲地安排它做爲第一個執行的函數。他們可能認爲這樣命名的函數,比較容易記憶。
之因此有些知情人要寫if __name__ == '__main__'
,可能想代表 main() 只有在當前腳本被直接執行時才運行,不但願被導入其它模塊時運行。
對於這些「知情人」,他們有必定的道理。
可是,我我的並不推薦這種寫法,甚至有時候會很是反感!
最明顯的例子:明明只有幾十行代碼,或者僅有一個腳本文件,實現一個簡單的功能(一小段爬蟲、用 turtle 畫張圖等等),可是它們都按前面的樣式寫了。
我每次看到這種不假思索的累贅代碼,就以爲難受。爲何要寫那行 if 語句呢?可能的話,應該拆分 main 函數,甚至沒必要封裝成一個函數啊!
我我的總結出如下的經驗:
__main__.py
做爲入口文件。這個文件結合命令行的「-m」參數使用,很是好用。推薦閱讀:Python 中 -m 的典型用法、原理解析與發展演變 if __name__ == '__main__'
。首先,若是隻有一個文件的話,由於不存在導出的可能,不建議寫。其次,存在多文件時,入口文件(main.py)中極不推薦寫這一句,此文件的代碼邏輯應該精煉,理論上其內容不應被導出到其它模塊使用,由於它是起點!最後,多文件的非入口文件也不建議寫,由於在非入口文件中寫這個判斷,最大的做用就是寫一些測試代碼,可是測試代碼應該分離出來,寫到專門的目錄或文件中。小結:本文首先解釋了什麼是 main 入口函數,以及爲何某些語言會強制要求寫 main 函數;接着,解釋了爲何 Python 不須要寫 main 函數;最後則是針對某些人存在的慣性誤區,分享了我我的的四點編程經驗。
本文屬於「Python爲何」系列文章(Python貓出品),該系列主要關注 Python 的語法、設計和發展等話題,以一個個「爲何」式的問題爲切入點,試着展示 Python 的迷人魅力。部分話題會推出視頻版,請在 B 站收看,觀看地址:視頻地址
公衆號【Python貓】, 本號連載優質的系列文章,有Python爲何系列、喵星哲學貓系列、Python進階系列、好書推薦系列、技術寫做、優質英文推薦與翻譯等等,歡迎關注哦。