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.qyjmgg.com:电白县| www.70088z.com:若羌县| www.tecnoconfundido.org:瓮安县| www.ttjm6898lsc.com:桦甸市| www.520lei.com:鹤壁市| www.hlswclub.com:顺平县| www.duhocnamhai.com:什邡市| www.cw199.com:乐安县| www.aromatherapy-eucalyptus.com:湖口县| www.jnddq.com:连城县| www.1958difan.com:普安县| www.uniquemicrofinance.com:镇赉县| www.faplo.com:乐业县| www.foxbreaks.com:大兴区| www.fromussr.com:金塔县| www.takarasushioakland.com:静安区| www.karakitap.com:天等县| www.bazardasminas.net:普洱| www.cngsc.com:刚察县| www.alishaallport.com:麦盖提县| www.weekdigital.com:莆田市| www.saveattorney.com:惠水县| www.elipalteco.com:东兴市| www.shareuams.com:浦江县| www.jobexperts.org:大埔区| www.msmicrosoft.com:巫溪县| www.waerdi.com:抚顺市| www.saveattorney.com:灵璧县| www.matthiasgille.com:阿城市| www.mfjcg.com:梁平县| www.sz-jinxuan.com:上栗县| www.wordcountonline.net:贵阳市| www.tjbgl.com:台北县| www.shtmcl.com:泉州市| www.debbiesellsredding.com:改则县| www.qbjsc.com:山西省| www.youlanqiu.com:于都县| www.bestbridalevent.com:洱源县| www.mirrorsmagnifiers.com:微博| www.zhongyuanpq.com:汾西县| www.uidongmun.com:乌兰浩特市| www.foorat.com:安达市| www.celineverlant.com:桦川县| www.nosdepotsvente.com:东光县| www.gumur.com:永平县| www.elegooo.com:麻城市| www.lalshahbaz.com:河南省| www.ukbmw.com:赤城县| www.joannaselby.com:读书| www.pboworks.com:莱阳市| www.mesutaydin.com:香格里拉县| www.mybzw.com:绥化市| www.snowkeyice.com:万州区| www.resediservice.com:涿鹿县| www.oxbtest.com:高青县| www.muotioikeus.com:潞西市| www.opomart.com:收藏| www.taralynnfoxxblog.com:罗源县| www.kjyzw.cn:万安县| www.py556.com:舟山市| www.812760.com:射阳县| www.romanyrestaurant.com:明溪县| www.daqingwater.com:芦溪县| www.chcdistribution.com:无锡市| www.cedarcoverentals.com:沁阳市| www.zrvzsv.com:九江县| www.giggiblu.com:怀柔区| www.kssrw.cn:宜宾县| www.cm766.com:嘉鱼县| www.danangfoundation.org:涟水县| www.jimmysocks.com:扎囊县| www.standartstill.com:蒙城县| www.radiocachora.com:北票市| www.b-ads.com:庆阳市| www.howsvps.com:南充市| www.eegeu.com:阿荣旗| www.gf665.com:文成县| www.radiosolmansi.org:永仁县| www.in2demo.com:博乐市| www.r9892.com:石家庄市| www.gamehostingreview.com:江永县| www.cp1105.com:武隆县| www.addx-technologies.com:华阴市| www.ztxx.com.cn:抚州市|