學習過C語言或者Java語言的盆友應該都知道程序運行必然有主程序入口main函數,而python卻不同,即便沒有主程序入口,程序一樣可以自上而下對代碼塊依次運行,然後python不少開源項目或者模塊中依然存在 __name__ == “__main__” 這種寫法,具體是上面意思呢?
一.語義解釋
1.__name__
__name__ 是python的內置屬性,是系統全局變量!每一個py文件都有一個屬於自己的__name__:
如果py文件作爲模塊被導入(import),那麼__name__就是該py文件的文件名(也稱 模塊名);
如果py文件直接運行時(Ctrl+Shift+F10),那麼__name__默認等於字符串”__main__”;
舉個簡單的例子:假如你名字是張三,在朋友眼中,你是張三(__name__ == '張三')
;在你自己眼中,你是你自己(__name__ == '__main__')
2.”__main__”
“_ _main_ _” 實際上就是一個字符串,用來鑑別程序入口,沒有太多花裏胡哨的東西.
3.__name__ == “__main__”
當.py文件被直接運行 (Ctrl+Shift+F10)時, if __name__ == “__main__” 之下的代碼塊將被運行,該語句就相當與python的main主函數入口,示例代碼如下:
a.新建一個 my_name.py 文件,作爲模塊文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解憂 @Blog(個人博客地址): shuopython.com @WeChat Official Account(微信公衆號):猿說python @Github:www.github.com
@File:my_name.py @Time:2019/10/14 22:02
@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累! """
# 定義一個函數並打印 __name__ def prit_name(): print("my_name.py __name__:", __name__)
if __name__ == "__main__": prit_name() |
b.新建一個 python_main.py 文件,作爲啓動文件 (Ctrl+Shift+F10):
1 2 3 4 5 6 7 8 9 10 | # 導入 my_name 模塊 import my_name
# 定義一個函數並打印 __name__ def prit_name(): my_name.prit_name() print("python_main.py __name__:", __name__)
if __name__ == "__main__": prit_name() |
輸出結果:
1 2 | my_name.py __name__: my_name python_main.py __name__: __main__ |
由此可見,作爲啓動文件 python_main.py ,該文件的內置屬性 __name__ 等於 “__main__”,而my_name.py 作爲導入模塊,該模塊的 __name__ 等於文件名(也稱模塊名字),所以my_name.py 中的 表達式 if __name__ == “__main__” 並不成立!
當直接將my_name.py作爲啓動文件時 (Ctrl+Shift+F10),輸出:
1 | my_name.py __name__: __main__ |
如果py文件作爲模塊被導入(import),那麼__name__就是該py文件的文件名(也稱 模塊名);
如果py文件直接運行時(Ctrl+Shift+F10),那麼__name__默認等於字符串”__main__”;
二.作用
1.__name__ == “__main__” 作爲啓動py文件的main函數入口
2.一個項目中必然會包含多個模塊文件,每個模塊文件在自己寫完代碼之後會做一些簡單的測試用於檢測bug 或者 對自己的函數調用寫一個簡單的示例,而恰到好處的是:__name__ == “__main__” 既不會影響你的測試代碼,也不會影響別人調用你的接口函數。
猜你喜歡:
轉載請註明:猿說Python » python __name__ == “__main__” 詳細解釋