簡體   English   中英

如果 __name__ == '__main__' python

[英]if __name__ == '__main__' python

我已經閱讀了很多關於此的文章

if __name__ == '__main__'

但沒有得到它.. 我要分享你的代碼,請你能更簡單地解釋一下..

我創建了一個文件“ab.py”

def a():
    print('A function in ab file');

a()

第二個文件是“xy.py”

import ab

def b():
    print('b function')

def x(): print ('s');

x()

if __name__ == "__main__" :b()

當我執行此代碼時,此輸出即將到來

A function in ab file
s
b function

現在我想知道這是什么意思,這段代碼實際上在做什么,我們為什么要實現這個? 我們的代碼在沒有它的情況下也能工作

if __name__ == "__main__" :b()

您應該養成幾乎總是使用它的習慣。

if __name__ == '__main__':之后的任何內容只會在您明確運行文件時運行。

python myfile.py

但是,如果您在其他地方導入myfile.py

import myfile

if __name__ == '__main__':都不會被調用。

理解此語句的一個非常簡單的示例如下:

假設我們有以下名為的 python 腳本: 'using_name.py'


# Filename: using_name.py

if __name__ == '__main__':
    print 'This program is being run by itself'
else:
    print 'I am being imported from another module'

現在,嘗試做以下兩件事,看看會發生什么:


1)直接運行腳本

$ python using_name.py

結果

This program is being run by itself

2)導入腳本

$ python
import using_name

結果

I am being imported from another module

這段代碼實際上在做什么?

當你執行 xy.py 時,你導入了 ab。 import 語句在導入時運行模塊,因此 ab 的操作在 xy 的其余部分之前執行。 完成 ab 后,它繼續執行 xy。

解釋器使用__name__跟蹤哪些腳本正在運行。 當你運行一個腳本時——無論你給它起什么名字——解釋器都稱它為"__main__" 這就是它如何跟蹤哪個腳本是主文件,在外部調用另一個腳本后返回的腳本。 (您可能會說“home”腳本。)從此“main”腳本調用的任何其他腳本都將其文件名指定為其__name__ 因此, if __name__ == "__main__" :是解釋器的測試,以確定它是否在它正在查看(解析)的腳本上運行,或者它是否正在臨時查看另一個腳本。 這使程序員可以靈活地讓腳本在外部調用時表現不同。

要了解發生了什么,首先關注未縮進的行以及它們在腳本中的出現順序。 請記住,函數 - 或def - 塊在被調用之前不會自己做任何事情。 如果自言自語,口譯員可能會怎么想:

  • 打開 xy.py。
  • 使用__name__ ab.py 導入並打開文件。
  • 哦,一個函數。 我會記住的。
  • 好的,函數 a(); 我剛剛學會了。 我想我現在就打印。
  • 文件結束; 回到'__main__'
  • 哦,一個函數。 我會記住的。
  • 另一個。
  • 函數 x(); 好的,打印's'。
  • 這是什么? 一個if語句。 好吧,條件已經滿足(變量__name__已設置為'__main__' ),所以我將打印 'b function'。

但是我認為你沒有正確使用它。 可能有例外,但最下面的兩行應該是:

if __name__ == "__main__":
main()

...這意味着“如果這是 'main' 或 home 腳本,則執行名為main()的函數。這就是為什么您會看到def main(): block up top,其中包含腳本功能的主要流程.

我們為什么要實施這個?

(哇,我實際上在編寫上述內容時想通了這一部分。這也是我真正難以理解的部分,因為我自己從未編寫過帶有從其他腳本調用的函數的腳本。)

還記得我之前說過的關於 import 語句的內容嗎? 當您導入一個模塊時,它不僅僅是“識別”它並等待進一步的指令。 它實際上運行腳本中包含的所有可執行操作。 因此,將腳本的main()放入main()函數中可以有效地隔離它,將其隔離,以便在被另一個腳本導入時無法立即運行。

同樣,會有例外,但通常的做法是main()通常不會被外部調用。 所以你可能想知道一件事:如果我們不調用main() ,我們為什么要調用腳本? 這是因為許多人使用獨立的函數來構建他們的腳本,這些函數是為自己運行而構建的。 然后它們在腳本主體的其他地方被調用。 這讓我想到:

我們的代碼在沒有它的情況下也能工作

你是對的。 可以從不包含在main()函數中的內嵌腳本調用這些單獨的函數。 如果您習慣於(就像我一樣,在我編程的早期學習階段)構建完全符合您需要的內嵌腳本,並且如果您再次需要該操作,您將嘗試再次弄清楚 - 好吧,你不習慣你的代碼的這種內部結構,因為它構建起來更復雜,閱讀起來也不那么直觀。 但這是一個可能無法在外部調用其函數的腳本,因為如果這樣做,它將開始計算和分配變量。 並且很有可能,如果您嘗試重用某個函數,您的新腳本與舊腳本的關聯度足夠高,以至於可能存在變量沖突。

順便說一句, 這個帖子包含@kindall 的回答,最終幫助我理解了 - 為什么,而不是如何。 不幸的是,它被標記為this one的副本,我認為這是一個錯誤。 (我是這個板子的新手,所以還不能標記它;如果你同意我的觀點,請標記它以獲得進一步的模組關注。)

簡而言之, if __name__ == "__main__":僅在模塊由 python 解釋器直接執行時運行(例如:python module.py)或者在導入后顯式調用函數時運行。

示例:testFile.py

#this will always be executed even if this module is simply imported by other file or this module is the entry point
print "I will always run in any situation. Even when this module is 'just' imported"

if __name__ == "__main__":
    #this will be executed only when this module is the entry point eg. python testFile.py but not if this file is imported
    print "I will only run if this module (testFile.py) is executed directly by python interpreter"

應用程序

import testFile

蟒蛇測試文件.py

輸出:在任何情況下我都會跑步。 即使這個模塊是“剛剛”導入的

只有當這個模塊(testFile.py)被python解釋器直接執行時,我才會運行


蟒蛇應用程序.py

輸出:在任何情況下我都會跑步。 即使這個模塊是“剛剛”導入的


如果你想了解__name__變量的內部__name__ :檢查這個if __name__ == "__main__": do?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM