2010-10-28 87 views
400

可能重複:
What does if __name__== "__main__" do?爲什麼使用def main()?

我已經看到了一些代碼示例和使用

def main(): 
    # my code here 

if __name__ == "__main__": 
    main() 

但爲什麼教程?有什麼理由不在文件頂部定義你的函數,然後在它下面編寫代碼?即

def my_function() 
    # my code here 

def my_function_two() 
    # my code here 

# some code 
# call function 
# print(something) 

我只是想知道主音是否有韻?

+2

請參閱http://stackoverflow.com/questions/419163/what-does-if-name-main-do – gimel 2010-10-28 08:57:47

+8

stackoverflow.com/questions/419163/what-does-if-name-main-do does不回答整個問題。 – Johnsyweb 2010-10-28 09:09:09

+4

假定的重複沒有回答:有一個main()函數(而不是僅將所有代碼寫入「if __name__」塊)非常有用,因爲它避免了意外創建可能影響其他函數的全局變量。 – slowdog 2010-10-29 17:05:40

回答

465

沒有主標記,即使腳本作爲模塊導入,代碼也會執行。

+121

也值得注意的是,有一個'main()'函數可以使用以下代碼運行該代碼:'import module; module.main()'。如果代碼只在「if」塊中,則不能從其他位置運行。 – FogleBird 2010-10-28 13:13:04

7

考慮第二個腳本。如果您將其導入另一個,則將執行指令,如「全局級」。

72

如果foo.py

print __name__ 
if __name__ == '__main__': 
    print 'XXXX' 

的文件foo.py的內容可以以兩種方式使用。

  • 進口在另一個文件:import foo

在這種情況下__name__foo,代碼部分沒有得到執行,並且不打印XXXX

  • 直接執行:python foo.py

當直接執行,__name__是相同__main__並執行該節中的代碼,並打印XXXX

一項的用途的該功能可以在同一模塊中編寫各種單元測試。

+0

雖然這個答案比其他人少投票,但解釋得很清楚。我讀過[這個答案](http://stackoverflow.com/a/419185/2455888)之前,但你的解釋很好。 +1 – haccks 2014-07-06 10:32:56

15

What does if __name__==「__main__」: do?」已經被回答。

擁有main()功能允許您調用它的功能,如果您的模塊爲import。這個(恕我直言)的主要(不是雙關語意圖)好處是你可以單元測試它。

+1

2個問題具有相同的答案不會讓他們重複 – bubakazouba 2015-05-20 00:26:59

+3

@bubakazouba:我同意。我沒有把這個問題標記爲重複。 *這個問題的一部分*有一個非常好的答案,我沒有看到重複答案。我回答了問題的其餘部分。 – Johnsyweb 2015-05-20 05:24:37

183

其他人都已經回答了,但我想我還有其他東西要補充。

原因有if聲明,呼籲main()(排名不分先後):

  • 其他語言(如C和Java)有main()功能執行程序時調用。使用這個if,我們可以讓Python像他們一樣行事,這讓很多人感到更加熟悉。

  • 代碼將是清潔器,更易於閱讀和更好的組織。 (是的,我知道這是主觀的)

  • 這將是可能的import python代碼作爲模塊沒有討厭的副作用。

    • 這意味着可以針對該代碼運行測試。

    • 這意味着我們可以將該代碼導入交互式python shell並測試/調試/運行它。

  • def main變量是當地,而外面是全球。這可能會引入一些錯誤和意外行爲。

但是,你不需要main()功能,並把它稱爲if語句中。

我自己通常開始寫沒有任何功能的小型一次性腳本。如果腳本變得足夠大,或者如果我覺得把所有的代碼放在一個函數中會使我受益,那麼我會重構代碼並執行它。當我編寫bash腳本時,也會發生這種情況。

即使您將代碼放在主函數中,也不需要像這樣寫。一個整潔的變化可能是:

import sys 

def main(argv): 
    # My code here 
    pass 

if __name__ == "__main__": 
    main(sys.argv) 

這意味着你可以調用其他腳本(或交互shell)將自定義參數main()。這可能對單元測試或批處理有用。但請記住,上面的代碼需要解析argv,因此可能最好使用不同的調用來傳遞已解析的參數。

在我寫了一個面向對象的應用程序,代碼是這樣的:

class MyApplication(something): 
    # My code here 

if __name__ == "__main__": 
    app = MyApplication() 
    app.run() 

所以,請隨時到更適合寫的代碼你。 :)

+0

以'sys.argv'作爲參數調用'main'的好處之一就是這種方法適用於'argparse'模塊(其中,IMO是用於處理命令行參數的*正確的方法) 。所有你需要做的不同就是將'argv'傳遞給'main'中的'parse_args'。 – jkt123 2017-08-23 21:54:02

相關問題