Python之父教你寫main()函數

2021-03-02 編程派

編程派微信號:codingpy

每個程式設計師在學習編程的過程中,肯定沒少寫過main()函數,Python程式設計師也不例外。本文為大家分享Python之父Guido van Rossum推薦的函數寫法,可以大大提高這個函數的靈活性。

有篇文章將Guido列入了歷史上最偉大的12名程式設計師之一哦。

一般來說,Python程式設計師可能是這樣寫main()函數的:

Guido也承認之前自己寫的main()函數也是類似的結構,但是這樣寫的靈活性還不夠高,尤其是需要解析複雜的命令行選項時。為此,他向大家提出了幾點建議。


首先,修改main()函數,使其接受一個可選參數 argv,支持在交互式shell中調用該函數:

def main(argv=None):    if argv is None:        argv = sys.argv
   

這樣做,我們就可以動態地提供 argv 的值,這比下面這樣寫更加的靈活:

def main(argv=sys.argv):    

這是因為在調用函數時,sys.argv 的值可能會發生變化;可選參數的默認值都是在定義main()函數時,就已經計算好的

但是現在sys.exit()函數調用會產生問題:當main()函數調用sys.exit()時,交互式解釋器就會推出!解決辦法是讓main()函數的返回值指示退出狀態(exit status)。因此,最後面的那行代碼就變成了這樣:

if __name__ == "__main__":    sys.exit(main())

並且,main()函數中的sys.exit(n)調用全部變成return n。


另一個改進之處,就是定義一個Usage()異常,可以在main()函數最後的except子句捕捉該異常:

這樣main()函數就只有一個退出點(exit point)了,這比之前兩個退出點的做法要好。而且,參數解析重構起來也更容易:在輔助函數中引發Usage的問題不大,但是使用return 2卻要求仔細處理返回值傳遞的問題。

閱讀英文原文:http://www.artima.com/weblogs/viewpost.jsp?thread=4829


相關焦點

  • Python 為什麼沒有 main 函數?為什麼我不推薦寫 main 函數?
    python_cat)毫無疑問 Python 中沒有所謂的 main 入口函數,但是網上經常看到一些文章提「Python 的 main 函數」、「建議寫 main 函數」……有些人是知情的,他的意圖可能是模仿那些正宗的 main 函數,但還有不少人明顯是被誤導了(或自己誤解了),就寫出來很累贅的代碼。
  • 為什麼 Python 沒有 main 函數?
    以下為譯文:眾所周知,Python中沒有所謂的main函數,但是網上經常有文章提到「 Python的main函數」和「建議編寫main函數」。其實,可能他們是想模仿真正的main函數,但是許多人都被誤導(或誤解),然後編寫了非常笨拙的代碼。在本文中,我們來討論一下為什麼Python沒有main函數。在開始討論之前,我們先來回答以下兩個問題:所謂的「main函數」究竟是什麼意思?為什麼有些程式語言必須編寫main函數?
  • Python 中的 main 函數
    毫無疑問 Python 中沒有所謂的 main 入口函數,但是網上經常看到一些文章提「Python 的 main 函數」、「建議寫 main 函數」……有些人是知情的,他的意圖可能是模仿那些正宗的 main 函數,但還有不少人明顯是被誤導了(或自己誤解了),就寫出來很累贅的代碼。
  • 在Python中定義Main函數(第三部分)
    儘管Python不要求將函數命名為main(),但是最佳的做法是將入口點函數命名為main()。這樣方便其他程式設計師定位程序的起點。此外,main()函數應該包含Python解釋器執行文件時要運行的任何代碼。這比將代碼放入條件語塊中更好,因為用戶可以在導入模塊時重複使用main()函數。
  • 為什麼我不推薦寫 main 函數?
    點擊上方「編程派」,選擇設為「設為星標」優質文章,第一時間送達!
  • 好冷的Python-- if __name__=='__main__'是啥東東
    1、__name__是什麼我們知道Python腳本執行時,解釋器會從文件開始逐行往後解析,如果遇到用def定義的函數或class定義的類,就會跳過該段代碼,如果是頂格寫的某些語句就會執行它,即使這個py文件是作為模塊被導入到其他文件中。
  • 如何簡單地理解 Python 中的 if __name__ == '__main__'
    通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');在你自己眼中,你是你自己(__name__ == '__main__')。
  • C語言 main 函數到底怎麼寫是對的?
    各位,C語言中的main函數大家都再熟悉不過了,這是你學習C語言首先就要學習的東西,但是我看過很多人寫的代碼包括我們的一些讀者在main函數的寫法方面版本很多
  • 如何寫好 C main 函數 | Linux 中國
    如果你需要速度,用 C 語言編寫可能就是你的答案。如果你正在尋找穩定的職業或者想學習如何捕獲空指針解引用,C 語言也可能是你的答案!在本文中,我將解釋如何構造一個 C 文件並編寫一個 C main 函數來成功地處理命令行參數。我:一個頑固的 Unix 系統程式設計師。你:一個有編輯器、C 編譯器,並有時間打發的人。讓我們開工吧。
  • main( )函數詳解
    C的設計原則是把函數作為程序的構成模塊。main()函數稱之為主函數,一個C程序總是從main()函數開始執行的。瀏覽老版本的C代碼,將會發現程序常常以:main()這種形式開始。C90標準允許這種形式,但是C99標準不允許。因此即使你當前的編譯器允許,也不要這麼寫。你還可能看到過另一種形式:void main()有些編譯器允許這種形式,但是還沒有任何標準考慮接受它。
  • Python之函數學習(八)
    ,而不需要為了某個功能寫重複性的代碼,這就是函數的魅力所在。在python中,函數的定義是使用關鍵字def,下面先來定義一個簡單的函數,通過這個例子來認識函數,見代碼:def f():   print('Hello World')在如上的代碼中,可以看到自定義了函數f,函數中輸出是 :Hello World,那麼編寫函數後,怎麼來進行調用函數了,函數的調用也是很簡單的,像如上的函數調用為:f(),就會輸出:Hello
  • 你有沒有想過,C語言 main 函數到底為啥這麼寫?
    但凡是學過C語言的人,都知道要先寫main函數,然而很多時候我們看到的main函數卻各有差異,這究竟是為啥?哪種是對的呢?今天我們就來聊聊main函數。那麼main函數一共有多少個版本呢?0;}void test(int a){printf("%d",a);}程序仍然可以正常運行,test函數雖然聲明為無入參,但調用時卻是可以傳入任何參數或不傳參數的
  • Python __name__ == '__main__'的用法
    可以看到我們在LOVE.py文件裡面定義了一個love的函數,接下來我們寫一個main.py的文件,將LOVE.py代入並調用love函數,代碼如下:可以看到程序輸出了「I Love You」,如果我們需要在LOVE.py裡面測試一下我們寫的love函數有沒有錯誤需要運行測試一下,接下來我們做如下操作:
  • 用Python寫個在線Python的網站怎麼樣
    前幾天,一個朋友提出了一個建議,如何用python寫出python的解釋器,我感覺這是一個很好的問題,於是就去看看,打算用python寫一個試試
  • C語言必須寫main函數?最簡單的Hello world 你其實一點都不懂!
    我們打眼一看,其實很簡單,就是引入頭文件,寫一個主函數,然後輸出一句話,但是當我們編譯出來ELF的時候,我們使用工具readelf,去查看下這裡面的FUNC,會發現多了很多方法。既然它們的流程是,系統加載進來,然後初始化,再到我們的main方法,那麼這個main方法,肯定是可以變的。為什麼這麼說呢?做過嵌入式開發的應該熟悉,基本上都沒有main函數一說,直接從跳轉入口開始跑就可以的。可以給任意函數,指定成Enter,也就是入口函數,使用連結腳本就可以指定,這塊感興趣的可以搜索gcc連結器參數。
  • C語言必須寫main函數?最簡單的 Hello world 你其實一點都不懂!
    :我們打眼一看,其實很簡單,就是引入頭文件,寫一個主函數,然後輸出一句話,但是當我們編譯出來ELF的時候,我們使用工具readelf,去查看下這裡面的FUNC,會發現多了很多方法。既然它們的流程是,系統加載進來,然後初始化,再到我們的main方法,那麼這個main方法,肯定是可以變的。為什麼這麼說呢?做過嵌入式開發的應該熟悉,基本上都沒有main函數一說,直接從跳轉入口開始跑就可以的。可以給任意函數,指定成Enter,也就是入口函數,使用連結腳本就可以指定,這塊感興趣的可以搜索gcc連結器參數。
  • Python|自動化測試與if __name__==「__main__」
    問題描述最近有小夥伴在學習python自動化測試的時候遇到了一個問題,下面我直接奉上代碼。解決方案若要讓此程序執行很簡單只需在最後一行代碼unittest.main()前加一行代碼if__name__==」__main__」:方可執行。
  • 深度剖析C語言的main函數!
    C++ 之父 Bjarne Stroustrup 在他的主頁上的 FAQ 中明確地寫著 「The definition void main( ) { /* … */ } is not and never has been C++, nor has it even been C.」
  • Python代碼結構:函數
    「1.定義函數與調用函數定義python函數:依次輸入def、函數名、帶有函數參數的圓括號,最後緊跟一個冒號(:)函數命名規範:必須使用字母或者下劃線_開頭,僅能含有字母、數字和下劃線;定義函數:def do_nothing():... pass註:python函數中的pass表明函數沒有做任何事情。
  • C語言的main函數到底該怎麼寫
    main函數,那麼哪一種才是正確的呢?我們先來看看目前有哪些版本。main函數版本第一種,沒有返回值,沒有入參:main()在C89標準中,這種寫法是可以接受的,但使用現在的編譯器編譯時,會報告警,並且會將其返回值默認為int。實際上,如果函數沒有顯式聲明返回類型,那麼編譯器會將返回值默認為int。