if condition 大于_if __name__ == #x27;__main__#x27;: 究竟起什么作用,阅读本文后,其他文章不必再看...
這種形式的代碼,相信你已經(jīng)見過很多,在腳本的末尾,出現(xiàn)一個if條件判斷,這個if條件判斷的作用是什么呢, __name__ 事先并沒有定義,為什么可以直接使用呢,它從哪里來? 回答這些問題,必須先了解模塊屬性
1、模塊屬性
一個python腳本(以.py 結(jié)尾的文件)就是一個模塊,模塊自身有若干屬性,其中比較常用的是如下兩個
1. __name__ 模塊的名稱
2. __file__ 腳本的完整文件路徑
在任意一個python腳本里,你都可以輸出這兩個屬性
print(__name__) print(__file__)得到結(jié)果
__main__ /Users/zhangdongsheng/experiment/test/test.py__name__ 的值是 __main__ ,這表示模塊的名稱是__main__
__file__ 是文件的完整路徑
雖然弄清楚了__name__ 是怎么一回事,但也帶來了新的疑問,明明__name__ 就等于 __main__ ,為何還要做if條件判斷呢?顯然是存在 __name__ 不等于__main__ 的情況。
2、直接執(zhí)行與其他模塊引入
簡單的功能,我們可以在一個python腳本里完成,但復(fù)雜的功能,我們會寫多個python 腳本,比如下面的例子里,有兩個腳本,一個是main.py ,做為整個程序的啟動腳本,utils.py 提供一些輔助函數(shù),供main.py使用
(1)utils.py
def(2)main.py
from接下來,通過兩步實驗,來理解 __name__ 在不同場景下的取值情況。
第一步,先來執(zhí)行utils.py文件
python utils.py執(zhí)行結(jié)果為
utils 模塊里的__name__ 值為: __main__第二步,執(zhí)行main.py
python main.py執(zhí)行結(jié)果為
utils 模塊里的__name__ 值為: utils 輸入兩個整數(shù),中間用空格分開:5 2 2.5這里有一個現(xiàn)象,你必須理解其背后的原因,我們明明執(zhí)行的main.py腳本,但是utils.py腳本里的代碼也被執(zhí)行了,這是因為在main.py腳本里引入了utils.py 這個模塊,被引入的腳本里的代碼會在引入時執(zhí)行。
當(dāng)utils.py 被其他腳本引入時,它的__name__ 就不等于__main__, 而是等于utils,恰好是文件名稱去掉.py 剩余的部分。
經(jīng)過上面的實驗,我們可以得出兩個結(jié)論
1. 當(dāng)腳本被直接執(zhí)行時,模塊屬性__name__ 等于__main__
2. 當(dāng)腳本被其他模塊引入時,模塊屬性__name__ 等于腳本名稱去掉.py 后剩余的部分
3、終極目的---測試模塊里函數(shù)
由于一個腳本被引入時,自身的代碼會被執(zhí)行,因此我們在每個腳本里都寫上一段if __name__ == '__main__': 如果你希望一些代碼只有在腳本被直接執(zhí)行時才執(zhí)行,那么就把這些代碼放入到if 語句塊中,最常見的情形就是測試代碼,下面我對utils.py 進(jìn)行修改
def我們寫完一個函數(shù)后,不免要寫一些測試的代碼,而這些測試的代碼我們不希望他們在utils.py被引入時執(zhí)行,只有當(dāng)我們主動執(zhí)行utils.py 進(jìn)行測試才執(zhí)行這些測試代碼
掃一掃,更多專業(yè)python技術(shù)分享
總結(jié)
以上是生活随笔為你收集整理的if condition 大于_if __name__ == #x27;__main__#x27;: 究竟起什么作用,阅读本文后,其他文章不必再看...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据来源渠道及采集工具_GrowingI
- 下一篇: ec200s 封装_什么是无闪退免签封装