1. 設為首頁   文化中國網歡迎您~!

          python小課堂37 - 你并沒有真正的理解 ifname的作用

          前言

          在 Python 中,我們經常會看到

          if __name__ == '__main__':

          那么你真的理解此寫法的作用嗎?今天我們就來聊一聊它真正的含義。

          筆者最喜歡的就是用示例講明白一個問題,這次也不例外,依然是看例子來說話!

          示例說話

          舉個例子來說:

          有一個物體質量 m=10,g=9.8 (重力參數),求它的重力。 公式:G=m*g 所以創建一個 param.py 的文件,其中代碼如下:

          # 重力參數
          g = 9.8
          def main():
          print("g:", g)

          main()

          >>> 控制臺會打印出 --> g : 9.8。

          在創建一個 sum.py 的文件求 G ,代碼如下:

          # 在這里我們將上面文件定義的param中的g作為重力參數引入到其中
          from param import g

          # 計算重力的函數
          def calc_G(m):
          G = m * g
          return G

          def main():
          print("G:", calc_G(10))

          main()

          結果如下:

          結果可以看到,在 param.py 文件中的 main 函數也被執行了,而實際上我們并不希望它被執行,只是想 G 被打印出來即可。

          此時 if __name__ == '__main__' 便派上了用場。我們將 param.py 中稍作修改:

          # 重力參數
          g = 9.8

          def main():
          print("g:", g)

          if __name__ == '__main__':
          main()

          加上后,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 框架中,我們通常使用下面的代碼來進行項目的啟動:

          from flask import Flask
          app = Flask(__name__)

          # Flask quickly start
          @app.route('/')
          def hello_world():
          return 'Hello World!'

          if __name__ == '__main__':
          app.run(host='0.0.0.0',port=81)

          上面的代碼是官方給出來的一段最快啟動的小 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 自帶的服務器啟動。

          這塊兒算是一點小小的拓展,關于拓展知識,若是哪里有疑問,歡迎溝通交流吶!

          有想交流Python的同學,歡迎關注公號:migezatan(咪哥雜談)。

          推薦閱讀:買禮物
          好运来 www.dominatanja.com:合江县| www.shahnawazenterprises.com:桃江县| www.inkedcreatively.com:务川| www.yiyituofu.com:靖州| www.guitartrick.net:冷水江市| www.sxshangle.com:漯河市| www.jb908.com:玉环县| www.balchdercymru.com:大丰市| www.mdgc360.com:延川县| www.iclcsw.com:云和县| www.izzedu.com:眉山市| www.carecnn.com:介休市| www.687090.com:得荣县| www.nazliyarim.com:磴口县| www.sqtextiles.com:崇州市| www.company-in-china.com:安庆市| www.aliciacreative.com:九寨沟县| www.huwei688.com:灵武市| www.oblocals.com:岗巴县| www.quicksharehq.com:庆城县| www.fxptgs.com:井陉县| www.nordea-im.com:将乐县| www.borealmatters.org:建湖县| www.investment-e.com:塔城市| www.jdtzwd.com:白水县| www.kieanna.com:奉贤区| www.inside-economics.com:资讯| www.hbjtls.com:和林格尔县| www.tjjdwsbesrq.com:万安县| www.inkedcreatively.com:邹城市| www.brillonenbarrois.org:长海县| www.sqgdz.com:保靖县| www.dapinlv.com:育儿| www.karamankardesler.com:清丰县| www.qiaotaitai-bj.com:申扎县| www.culasse-moteur.com:根河市| www.popitaragones.com:临邑县| www.guoshiyan.com:庆元县| www.carbonsilver.com:泌阳县| www.mfggn.com:大埔县| www.dlzhutan.com:贡觉县| www.repingou.com:城步| www.kidizzle.com:和政县| www.happydogvideo.com:湛江市| www.hokhauhanoi24h.com:青阳县| www.garagedoorsirvine.com:北宁市| www.cigdemyartasi.com:五寨县| www.catalinamotoroiu.com:故城县| www.beverlysteelasia.com:东乌| www.creativeshoponline.com:渝北区| www.arcadaproductions.com:天长市| www.fzjiulong.com:合川市| www.sutibao.com:南投市| www.zainvista.com:交城县| www.dongfanghuojia.com:桑日县| www.cp1696.com:昌吉市| www.minamihompi.com:阳曲县| www.bestkitchenkniveslist.com:尉氏县| www.thejoyryders.com:绵阳市| www.soledoubtshow.com:射洪县| www.e-young2009.com:抚顺县| www.gztbyf.com:安图县| www.seocontest2008.com:清徐县| www.andreacurryyoga.com:房产| www.zjyoushun.com:雅江县| www.anhaohk.com:天柱县| www.lemonadedoll.com:平远县| www.agaogluexport.com:嵊州市| www.jmin00.com:陇川县| www.bogree.com:聂拉木县| www.cmagermany.com:通城县| www.rjsprafka.com:鄯善县| www.lianyunlipin.com:盐津县| www.chambres-dhotes-le-cigalon.com:耒阳市| www.supermoveme.com:景洪市| www.51peiyi.com:容城县| www.pazarlamaturkiye.net:株洲市| www.steven-z.com:荆门市| www.silviatenenti.com:凉山| www.votextile.com:仲巴县| www.bjdongzefa.com:外汇| www.iamsaneen.com:聂拉木县| www.semhb.com:昔阳县| www.karakitap.com:刚察县|