如何理解Python裡的__name__與__main__的理解

by yenchialu
#範例 1 

def a(x,y) :
	return x+y
if __name__ == "__main__" :
	a(x,y)

程式碼第三行,__name__ == “__main__“到底該怎麼理解 ? 本文將慢慢解析

什麼是name?

__name__是一個內置屬性,當你訪問__name__時,會回覆你當前文件(模組)或者引入的模組名稱。

#範例 2-1

print(__name__)

執行結果
>>> __main__

上面的程式,詢問執行中的文件,名字(__name__)是什麼?程式回傳名稱__main__
python對於自己執行的主程式,會用__main__來自稱。

如果匯入模組,訪問其名字,則會回傳模組名稱。

#範例 2-2

import numpy as np
print (np.__name__)
# >>> numpy

print (np.random.__name__)
#  >>> numpy.random

什麼是main?

如上段提到,訪問__name__時,他會回覆你所使用的模組的名稱。

如果直接訪問,會回傳當前程式(主程式)的資訊,但不會用模組名(或說.py檔名、當前程式名稱),而是會用__main__自稱。見範例程式 2-1。

if __name__ == “__main__” 是什麼意思 ?

可以程式使用口語翻譯理解這句話

” 如果 模組名稱 就是 “__main__”的話,…… “

意思是如果執行模組時,他是當作主程式進行的話(而不是被引入的模組),就執行if後的內容。

我們寫的.py檔有時會當主程式運行,有時會被當模組引入。

如果沒這個條件句寫在程式內,在import引入會遇到一些問題,我只是想引入一些def方法而已,但程式會把所有的內容執行完。

範例 3-1是被引入的模組 bar.py,範例 3-2是主要執行的程式 foo.py

#範例 3-1
#被引入的模組 bar.py
def test1():
	print ("被引入的模組名稱",__name__)
test1()
print("今天要偷買珍珠奶茶")

#範例 3-2
#主要執行的模組(文件) foo.py
import bar
def test2():
	print ("主程式名稱",__name__)
test2()
bar.test1()

執行範例3-2的執行結果

>>> 被引入的模組名稱 bar #在import那行執行了test1(),因為被引入了所以變成 bar
今天要偷買珍珠奶茶 #在import那行,執行了print()
主程式名稱 __main__ #主程式執行test2()
被引入的模組名稱 bar #主程式引入模組bar的test1執行,因為被引入了所以變成 bar

以上範例,討論最後的兩個結果,但因為引入模組有其他零碎的程式碼,所以會被跑出很多我不需要的東西。

那解決的思維就是,bar.py這個檔案

  • 當作主程式(當前程式)執行時,才希望有”今天要偷買珍珠奶茶”的字串以及test1()的執行。
  • 當作主程式(當前程式)執行時,才希望有”今天要偷買珍珠奶茶”的字串以及test1()的執行。

那該如何實現,這時就要用到 if __name__ == “__main__” ,這個判斷式的口語意思是 判斷當前檔案是否為主程式,主程式的__name__都是”__main__“,如果是引入的話__name__就是檔名。

所以上方程式碼就該修改為下面示範,即能達到效果

#範例 4-1
#被引入的模組 bar.py
def test1():
	print ("被引入的模組名稱",__name__)
if __name__ == "__main__" : 
	test1()
	print("今天要偷買珍珠奶茶")

執行結果
>>> 被引入的模組名稱 __main__
今天要偷買珍珠奶茶

引用”愛學習的豆包“的文章圖示與範例,展示模組運行命名流程

狀況1 : 直接執行指令碼

#被引入的模組 bar.py
def test1():
	print ("被引入的模組名稱",__name__)
if __name__ == "__main__" : 
	test1()
	print("今天要偷買珍珠奶茶")

狀況2:從其他腳本里匯入

import nameScript as ns
ns.myFunction()

問題回顧

  • __name__是什麼 ?
  • __main__是什麼?
  • 如何理解 if name == “main” :

You may also like

Leave a Comment