python中def main是什么意思_关于python:为什么使用def main()?
本問(wèn)題已經(jīng)有最佳答案,請(qǐng)猛點(diǎn)這里訪問(wèn)。
Possible Duplicate:
What does if __name__=="__main__" do?
我看過(guò)一些代碼示例和教程
1
2
3
4
5def main():
# my code here
if __name__ =="__main__":
main()
但是為什么呢?有沒(méi)有什么理由不在文件的頂部定義函數(shù),然后在下面寫(xiě)代碼?工業(yè)工程
1
2
3
4
5
6
7
8
9def my_function()
# my code here
def my_function_two()
# my code here
# some code
# call function
# print(something)
我只是想知道主旋律有沒(méi)有押韻?
請(qǐng)參閱stackoverflow.com/questions/419163/what-do-if-name-main-do
stackoverflow.com/questions/419163/what-do-if-name-main-do無(wú)法回答整個(gè)問(wèn)題。
所謂的副本并沒(méi)有回答:擁有一個(gè)main()函數(shù)(而不是僅僅將所有代碼寫(xiě)入"if name"塊)是有用的,因?yàn)樗梢员苊庖馔獾貏?chuàng)建可能影響其他函數(shù)的全局變量。
以及其他答案,有一個(gè)執(zhí)行代碼的入口點(diǎn)可以使用setup.py中的入口點(diǎn)自動(dòng)生成可執(zhí)行腳本,這些腳本包裝導(dǎo)入和執(zhí)行步驟。當(dāng)你希望你的用戶(hù)能夠?qū)憇etup-my-app ...而不是python2.7 /opaque/path/to/module.py ...時(shí),這是很好的。
如果沒(méi)有主sentinel,即使腳本作為模塊導(dǎo)入,也會(huì)執(zhí)行代碼。
同樣值得注意的是,擁有一個(gè)main()函數(shù)可以使用:import module; module.main()運(yùn)行該代碼。如果代碼只是在if塊中,則無(wú)法從其他地方運(yùn)行。
其他人都已經(jīng)回答過(guò)了,但我想我還有別的事要補(bǔ)充。
調(diào)用main()的if語(yǔ)句(無(wú)特殊順序)的原因:
其他語(yǔ)言(如C語(yǔ)言和Java語(yǔ)言)有一個(gè)EDOCX1×7函數(shù),它在執(zhí)行程序時(shí)被調(diào)用。使用這個(gè)if,我們可以使python的行為像它們一樣,這讓許多人覺(jué)得更熟悉。
代碼將更干凈、更容易閱讀和更具組織性。(是的,我知道這是主觀的)
對(duì)于import來(lái)說(shuō),將python代碼作為一個(gè)模塊是可能的,不會(huì)產(chǎn)生不良的副作用。
這意味著可以對(duì)該代碼運(yùn)行測(cè)試。
這意味著我們可以將該代碼導(dǎo)入到交互式Python shell中,并測(cè)試/調(diào)試/運(yùn)行它。
def main中的變量是局部變量,而它之外的變量是全局變量。這可能會(huì)引入一些錯(cuò)誤和意外行為。
但是,不需要編寫(xiě)main()函數(shù)并在if語(yǔ)句中調(diào)用它。
我自己通常開(kāi)始寫(xiě)一些沒(méi)有任何功能的廢棄腳本。如果腳本變得足夠大,或者如果我覺(jué)得將所有代碼放在函數(shù)中對(duì)我有利,那么我重構(gòu)代碼并執(zhí)行它。當(dāng)我編寫(xiě)bash腳本時(shí),也會(huì)發(fā)生這種情況。
即使您將代碼放在主函數(shù)中,也不需要完全按此方式編寫(xiě)代碼。一個(gè)簡(jiǎn)單的變化可能是:
1
2
3
4
5
6
7
8import sys
def main(argv):
# My code here
pass
if __name__ =="__main__":
main(sys.argv)
這意味著您可以從傳遞自定義參數(shù)的其他腳本(或交互shell)調(diào)用main()。這可能在單元測(cè)試或批處理時(shí)很有用。但請(qǐng)記住,上面的代碼將需要解析argv,因此最好使用傳遞已解析參數(shù)的不同調(diào)用。
在我編寫(xiě)的面向?qū)ο髴?yīng)用程序中,代碼如下所示:
1
2
3
4
5
6class MyApplication(something):
# My code here
if __name__ =="__main__":
app = MyApplication()
app.run()
因此,請(qǐng)隨意編寫(xiě)更適合您的代碼。:)
使用sys.argv作為參數(shù)調(diào)用main的一個(gè)好處是,這種方法與argparse模塊(imo是處理命令行參數(shù)的正確方法)很好地工作。你所需要做的就是在main中把a(bǔ)rgv傳給parse_args。
如果foo.py的內(nèi)容
1
2
3print __name__
if __name__ == '__main__':
print 'XXXX'
文件foo.py可以通過(guò)兩種方式使用。
imported in another file : import foo
在這種情況下,__name__為foo,代碼段不執(zhí)行,不打印XXXX。
executed directly : python foo.py
直接執(zhí)行時(shí),__name__與__main__相同,執(zhí)行該段代碼并打印XXXX。
使用此功能在同一模塊中編寫(xiě)各種單元測(cè)試的一種。
"if __name__=="__main__":是做什么的?"已經(jīng)回答。
如果您使用import模塊,那么擁有main()功能允許您調(diào)用它的功能。這個(gè)(imho)的主要(沒(méi)有雙關(guān)語(yǔ))好處是您可以對(duì)它進(jìn)行單元測(cè)試。
兩個(gè)答案相同的問(wèn)題不會(huì)重復(fù)。
@布巴卡佐巴:我同意。我沒(méi)有將這個(gè)問(wèn)題標(biāo)記為副本。這個(gè)問(wèn)題的一部分有一個(gè)很好的答案,我認(rèn)為復(fù)制答案毫無(wú)意義。我回答了剩下的問(wèn)題。
考慮第二個(gè)腳本。如果您將其導(dǎo)入到另一個(gè)目錄中,那么將執(zhí)行"全局級(jí)"的指令。
總結(jié)
以上是生活随笔為你收集整理的python中def main是什么意思_关于python:为什么使用def main()?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: extjs中store获取后台数据_Ex
- 下一篇: 一棵树的生物量怎么算_宾利的眼镜盒价值2