戲說python的特殊變數 __name__
python特殊變數__name__
最近看一些代碼的時候經常看到__name__
,說實話,我不想看到它,有點醜,這就像在現實生活中有名字人叫一二三狗子三二一
之類的。說到醜啊,我實在是不得不想起之前的一個讓人哭笑不得的事情
「身份證為什麼拍得這麼醜?」
因為拍的太漂亮太好看,你就會到處炫耀,誰知道哪一天給別人欣賞你的「秀色可餐」的面容的時候忘記拿回來,弄丟了。想想覺得很有道理!真的感謝公安人員的良苦用心啊!!!
這個變數就是python的內置變數
,寫成這樣就是防止你編程的時候取變數名的用到這個名字,你會用一二三狗子三二一
給自己的娃取名?(變數命名要麼是_
開頭,要麼是英文字母
開頭)。那它表示什麼意思呢?
它的意思就是運行的程序的名字(name)。
首先寫一個簡單的python
程序看一看,把這句話存到test.py
中運行一下:
print("NAME IS : " + __name__)
運行python test.py
,結果是:
NAME IS : __main__
咋地又來了一個一二三翠花三二一
(__main__
)?哈哈,你沒有看錯,這個內置變數的真實名字(值)是__main__
。
好吧!感覺python
這個世界有著形形色色的東西啊!
那它有著啥子用呢?
在一些代碼中你可能經常看到這個寫法:
if __name__ == __main__:
balabala...
代碼翻譯過來就是,如果這個程序的名字
是__main__
,那麼就balabala...
,那剛才我們試了,程序的名字就是__main__
這個翠花大西瓜啊!為啥還做這個判斷呢?難道是下雨天打孩子——閑著也是閑著?
嘿!如果把__name__
放在函數裡面是不是會神祕一些呢?我們把下面這些代碼保存到cuihua_and_dog.py
裡面
# cuihua_and_dog.py
# 聲明一個函數,這個用來試驗(名字我都給取好了,叫翠花狗子)
def marry():
baby = "cuihua" + "dog"
print(__name__ + "s baby is : " + baby)
marry()
當直接運行python cuihua_and_dog.py
的,結果是:
__main__s baby is : cuihuadog
結果__name__
還是和之前的那樣,還是__main__
這樣太直接的運行cuihua_and_dog.py
實在是沒意思,我們來回到狗子翠花小的時候!我們不這麼直接的運行它,我們把它當做模塊或者說包來運行看看會怎樣!把cuihua_and_dog.py
的marry()
刪除,在test.py
裡面執行marry()這個方法
,然把之前的test.py
裡面的內容換成下面這個,(記得把test.py
和cuihua_and_dog.py
這兩個文件放在一個文件夾裡面)
# test.py
# 從cuihua_and_dog包裡面導入marry方法到這裡來
from cuihua_and_dog import marry
marry()
然後運行python test.py
,結果是:
cuihua_and_dogs baby is : cuihuadog
__name__
名字終於變了,看來老天也覺得這個名字好!就這個了翠花狗子
,哈哈!
按照上面看,cuihua_and_dog.py
在兩種不同的運行方式裏,__name__
不一樣:
cuihua_and_dog.py --> __main__
+----------+ /
| | / 直接運行
| __name__ | -------
| | 當做包運行
+----------+
--> cuihua_and_dog
就是說,當這個程序直接運行的時候,__name__
的值就是__main__
,如果作為包運行的時候就是包名。到這裡應該理解了為什麼__name__
的值會是 __main__
了吧,也是為了防止我們把包的名字取為這個。
回到剛才那個if __name__ == __main__:
這句話上面來,想一下,如果說是直接執行這個程序的話,那麼這個判斷就成立了,那就執行if
裡面的代碼;如果是被當做包運行,那就不會運行if
裡面的代碼。
一般在執行程序的時候,直接執行的那個是父親,被載入的包是子女。
但是翠花和狗子小時候(當做包運行)怎麼可能會結婚呢?這樣做不行,既然可以用if
來判斷,我們改一下cuihua_and_dog.py
裡面的代碼:
# cuihua_and_dog.py
def marry():
if __name__ == "__main__": # 翠花狗子長大了(直接執行)
baby = "cuihua" + "dog"
print("baby is : " + baby)
else: # 翠花狗子還是小時候(被當做包導入執行)
print("They are the kids! It is a guojiajia game!")
# 翠花狗子長大了(直接執行)
if __name__ == "__main__":
# 這裡我們來佈置一下婚禮現場,不能太直接,我們拐彎抹角一下
# 將這個函數不要說得這麼直接,我們說這一天是快樂幸福的一天
OneFineDay = marry()
# 這裡到婚禮進行之前我們揭曉了
print("One Fine Day is : " + OneFineDay.__name__ )
# 結婚有了愛情的結晶
print("As time went by, They had a crystallization of love")
OneFineDay()
這樣我們在回頭來執行一下python test.py
,結果是:
They are the kids! It is a guojiajia game!
但是當翠花和狗子長大了(我們直接執行)的時候python cuihua_and_dog.py
,結果是
One Fine Day is : marry
As time went by, They had a crystallization of love
baby is : cuihuadog
從這裡我們又可以看到,如果直接用__name__
的話那麼就是代表當前這個包的名字。另外也可以知道函數的名字,例如上面寫的OneFineDay.__name__
,因為最原本的函數名是 marry
,所以這裡是顯示的marry
,而不是 OneFineDay
。
好的,狗子與翠花的故事完結了,很圓滿。
總結
- 如果直接執行某個
.py
文件的時候,這個文件裡面的__name__
就是__main__
,如果不是直接執行,而是被另外一個.py
文件import
的時候,這個文件裡面的__name__
是這個py
的文件名。 - 使用這個
__name__
可以對程序進行調試,如果說當程序之間互相之間調用,比較複雜的關係的時候,使用if __name__ == __main__:
將執行的代碼放在裡面,在執行其他的程序的時候,測試的程序本身不會運行,而這個程序有問題的時候,可以執行這個文件,那麼if __name__ == __main__:
裡面的代碼就執行了。 - 或者可以在不同的場景中來做不同的配置,作為包的時候是一套配置,作為主運行程序的時候又是另外一套配置,以應對不同的情況。
參考
python:淺析python 中__name__ = __main__ 的作用
之前寫在簡書上的,那個上面的格式渲染的好看一些,具體的可以
戲說python的特殊變數 __name__,為了方便在知乎上複製了一下。如需轉載,望能註明來源
推薦閱讀: