Python中if name == 'main':的作用和原理

Python中if name == 'main':的作用和原理

abstract:

參見我的語雀: https://www.yuque.com/jhongtao/zr9a1x/hyqgqk.

python 中name = ‘main’ 的作用,到底是幹嘛的?

有句話經典的概括了這段代碼的意義:“Make a script both importable and executable”

一個python文件通常有兩種使用方法,第一是作爲腳本直接執行,第二是 import 到其他的 python 腳本中被調用(模塊重用)執行。
因此 if name == ‘main’: 的作用就是控制這兩種情況執行代碼的過程,在 if name == ‘main’: 下的代碼只有在直接作爲腳本直接執行時纔會被執行,而 import 到其他腳本中是不會被執行的

if name == ‘main’:的運行原理

name

每個python模塊(python文件,也就是此處的 one.py 和 two.py)都包含內置的變量 name,當該模塊被直接執行的時候,name**** 的值等於當前模塊的文件(包含後綴 .py );如果該模塊 import 到其他模塊中,則該模塊的 name 值等於塊名稱(不包含後綴.py)****。

** **'main

而** main 始終指當前執行模塊的文件名稱(包含後綴.py。進而當模塊被直接執行name == main **** 結果爲true;當模塊被import到其它模塊時****,__name__的值爲模塊名稱(不包括文件後綴.py),main的值還是模塊文件全稱(包含文件後綴.py),所以此時****name**** == ****'main的結果就爲false,因此if name == ‘main’**後面的代碼不會被執行。

案例說明

one.py模塊:

# one.py
# 在one模塊中使用if __name__ == '__main__':
# 此時one.py模塊的'__main__'的是one.py;__name__的值也是one.py,也就是'__main__'的值

print("__name__.value:" ,__name__)

print ("this is one")

if __name__ == '__main__':
    print("process one main")

two.py模塊:

# two.py
# 引入one.py模塊
# 當模塊one.py模塊被引入到two.py模塊時:
	# one.py模塊的__name__的值爲:one  (沒有文件擴展名)
    # one.py木塊的'__main__'的值還視爲:one.py  (有文件擴展名)
import one

執行:one.py

image.png
直接執行 one.py,結果如圖,__name__的值爲:可以成功 print 兩行字符串。即,if name==“main”: 語句之前和之後的代碼都被執行。

執行:two.py

image.png
執行 import_test.py 腳本,**__name__的值爲:one,**只輸出了第一行字符串。即,if name==“main”: 之前的語句被執行,之後的沒有被執行。

總結一下:

這個功能還有一個用處:調試代碼的時候,在”if name=="main“中加入一些我們的調試代碼,我們可以讓外部模塊調用的時候不執行我們的調試代碼,但是如果我們想排查問題的時候,直接執行該模塊文件,調試代碼能夠正常運行!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章