(1)背景:在python中每個獨立的python文件,都是一個模塊。在導入文件時,文件中沒有任何縮進的代碼(即主方法)都會被執行一遍。
(2)在實際開發中,開發人員會在主方法中增加一些測試代碼,比如測試一下函數是否正常執行,打印一些日志等。在不作處理的情況下,如果在其它文件中導入該模塊,將會自動執行這些測試代碼,一般這是不允許的。
1 # 文件1 2 # 文件名:測試模塊1.py 3 4 def say_hello(): 5 print("hello world") 6 7 print("這是測試模塊1") 8 say_hello()
1 # 文件2 導入文件1 2 # 文件名:test.py 3 4 import 測試模塊1 5 6 # 不必添加任何代碼,直接運行該文件,控制台會輸出文件1的測試代碼 7 #這是測試模塊1 8 #hello world
(3)此時要解決導入模塊自動執行測試代碼的問題,就輪到主人公"__name__"內置函數的出場了:
·作用:__name__ 屬性可以做到,測試模塊的代碼只在測試情況下被運行,而在被導入時不會被執行。
__name__ 記錄着一個字符串:①當前執行的程序調用__name__ ,返回的字符串是" __main__ ";
②如果是被其它文件導入,__name__ 返回的字符串則是導入文件的文件名。
# 文件1 # 文件名:測試模塊1.py def say_hello(): print("hello world") print(__name__) print("這是測試模塊1") say_hello() # 控制台輸出 #__main__ #這是測試模塊1 #hello world
# 文件2 導入文件1 # 文件名:test.py import 測試模塊1 # 不必添加任何代碼,直接運行該文件,控制台會輸出文件1的測試代碼 #測試模塊1 #這是測試模塊1 #hello world
利用 __name__ 的這個屬性,我們可以改造文件1的代碼,解決測試代碼自動執行的問題:
# 文件1 # 文件名:測試模塊1.py def say_hello(): print("hello world") if __name__ == "__main__": print(__name__) print("這是測試模塊1") say_hello()
再次執行文件2,控制台就不會有測試代碼的輸出了。