您好,登錄后才能下訂單哦!
前言
在 Python 中,我們經常會看到
if__name__?=='__main__':
那么你真的理解此寫法的作用嗎?今天我們就來聊一聊它真正的含義。
筆者最喜歡的就是用示例講明白一個問題,這次也不例外,依然是看例子來說話!
示例說話
舉個例子來說:
有一個物體質量 m=10,g=9.8 (重力參數),求它的重力。
公式:G=m*g
所以創建一個 param.py 的文件,其中代碼如下:
在創建一個 sum.py 的文件求 G ,代碼如下:
結果如下:
結果可以看到,在 param.py 文件中的 main 函數也被執行了,而實際上我們并不希望它被執行,只是想 G 被打印出來即可。
此時?if __name__ == '__main__'?便派上了用場。我們將 param.py 中稍作修改:
加上后,Pycharm 中多了一個綠色小按鈕,點擊后:
可以看到,在 param.py 中加上這么一句話,起到了一個入口函數的作用,也就是說對于 param.py 來說,程序入口是從這里開始的。同時不影響它自身的 g 打印輸出,那么來看下求 G 中的程序。
求重力 G 的程序中,我們是沒有改變任何代碼的,可以看到結果已經變了。
結論
if __name__ == '__main__'?相當于 Python 模擬的程序入口。Python 本身并沒有規定這么寫,這只是一種編碼習慣。由于模塊之間相互引用,不同模塊可能都有這樣的定義,而入口程序只能有一個。到底哪個入口程序被選中,這取決于?name?的值。
__name__是內置變量,用于表示當前模塊的名字。
所以,
if __name__ == '__main__'
我們簡單的理解就是:如果本模塊是被直接運行的,則代碼塊被運行,如果本模塊是被導入到其它模塊中去,則處于?name?中的代碼不被運行。
官方文檔
查閱官方文檔可以看到相應的解釋:
什么?看不懂,來個中文的!~
原文鏈接
https://docs.python.org/3/library/main__.html?highlight=__name
關于 Flask 中的拓展知識
學過 Flask 的同學,可以看下此知識點,沒有學過的也可以了解一下,萬一后續用到了呢,有可能面試中會問到的一個小知識點。
在 Flask 框架中,我們通常使用下面的代碼來進行項目的啟動:
上面的代碼是官方給出來的一段最快啟動的小 demo。不難發現,在官方定義的代碼中,入口函數把 app.run() 放在了if __name__ == '__main__'里。
但是有沒有想過為什么要放在里面呢?
正常開發情況下調用 app.run() 啟動,使用的 web 服務器是 Flask 自帶的一個簡單內置服務器。
對于生產環境而言,啟動一個 Flask 項目是不能直接通過 Python 去運行的,因為還面臨著很多問題,比如并發性不好,無法監控項目各指標等。。。
所以在正式的生產環境中,我們是不會使用 Flask 自帶的服務器的,而是通過 nginx + uwsgi 來部署項目。nginx 作為前置服務器,用來接收瀏覽器發來的請求,接著會把請求轉發給 uwsgi ,uwsgi 會以配置文件的形式加載我們寫好的項目,而加載入口則是本地開發環境下的 app.run() 方法所在的入口模塊。就像下圖:
于是,在生產環境下, app.run() 所在的模塊相對于 uwsgi 來說便不是入口文件了,它是需要被導入到 uwsgi 中的一個普通模塊。使用if __name__ == '__main__'?的用途就是,不讓 app.run()進行啟動。也就是禁止所謂 Flask 自帶的服務器啟動。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。