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.pymarry()刪除,在test.py裡面執行marry()這個方法,然把之前的test.py裡面的內容換成下面這個,(記得把test.pycuihua_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__?

www.jianshu.com

,為了方便在知乎上複製了一下。如需轉載,望能註明來源


推薦閱讀:
相關文章