Python 爲何沒有 main 函數?爲何我不推薦寫 main 函數?

Python 爲何沒有 main 函數?爲何我不推薦寫 main 函數?

毫無疑問 Python 中沒有所謂的 main 入口函數,可是網上常常看到一些文章提「Python 的 main 函數」、「建議寫 main 函數」……python

有些人是知情的,他的意圖多是模仿那些正宗的 main 函數,但還有很多人明顯是被誤導了(或本身誤解了),就寫出來很累贅的代碼。程序員

本期「Python 爲何」欄目來聊聊 Python 爲何沒有 main 函數? 編程

在開始正題以前,先要來回答這兩個問題:所謂的 「main 函數」是指什麼?爲何有些編程語言須要強制寫一個 main 函數? 編程語言

某些編程語言以 main 函數做爲程序的執行入口,例如 C/C++、C#、 Java、Go 和 Rust 等,它們具備特定的含義:ide

  • main 函數名是強制的,也就是要求必須有一個 main 函數
  • main 函數最多隻能有一個,也就是說程序的入口是惟一的
  • 語法格式有必定的要求,具備相對固定的模板

爲何要強制一個 main 入口函數呢?函數

這些語言是編譯型語言,須要把代碼編譯成可執行的二進制文件,爲了讓操做系統/啓動器找到程序的起點,因此要約定這一個函數。簡單地說,就是在一大堆代碼裏,須要定義一個顯著的可用於執行的開頭。測試

不難看出,main 函數是那些語言中重要而不可缺的有機組成部分。spa

然而,咱們再來看看 Python,狀況就大不相同了。操作系統

  • Python 是解釋型語言,即腳本語言,運行過程是從上往下,逐行解析運行,也就是說它的起點是可知的
  • 每一個 .py 文件就是一個可執行文件,均可做爲整個程序的入口文件,也就是說程序的入口是靈活可變的,沒有必須遵照的約定
  • 有時候運行 Python 項目,並無指定入口文件(命令行中較常見,例如"python -m http.server 8000"), 那多是存在 __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 入口函數是某些語言特有的,不應在 Python 中「照貓畫虎」,應該瞭解腳本語言的特色,寫出簡潔優雅的風格
  • 使用 main.py 而非 main()。由於 Python 的程序執行單位實際上是腳本文件,而非某個函數或者類,因此建議把入口文件命名爲 main.py,內部的函數按需求而定
  • 能夠的話,使用__main__.py 做爲入口文件。這個文件結合命令行的「-m」參數使用,很是好用。推薦閱讀:Python 中 -m 的典型用法、原理解析與發展演變
  • 不推薦寫if __name__ == '__main__' 。首先,若是隻有一個文件的話,由於不存在導出的可能,不建議寫。其次,存在多文件時,入口文件(main.py)中極不推薦寫這一句,此文件的代碼邏輯應該精煉,理論上其內容不應被導出到其它模塊使用,由於它是起點!最後,多文件的非入口文件也不建議寫,由於在非入口文件中寫這個判斷,最大的做用就是寫一些測試代碼,可是測試代碼應該分離出來,寫到專門的目錄或文件中。

小結:本文首先解釋了什麼是 main 入口函數,以及爲何某些語言會強制要求寫 main 函數;接着,解釋了爲何 Python 不須要寫 main 函數;最後則是針對某些人存在的慣性誤區,分享了我我的的四點編程經驗。

本文屬於「Python爲何」系列文章(Python貓出品),該系列主要關注 Python 的語法、設計和發展等話題,以一個個「爲何」式的問題爲切入點,試着展示 Python 的迷人魅力。部分話題會推出視頻版,請在 B 站收看,觀看地址:視頻地址

公衆號【Python貓】, 本號連載優質的系列文章,有Python爲何系列、喵星哲學貓系列、Python進階系列、好書推薦系列、技術寫做、優質英文推薦與翻譯等等,歡迎關注哦。

相關文章
相關標籤/搜索