每個(gè)程序員在學(xué)習(xí)編程的過(guò)程中,肯定沒(méi)少寫(xiě)過(guò)main()函數(shù),Python程序員也不例外。本文為大家分享Python之父Guido van Rossum推薦的函數(shù)寫(xiě)法,可以大大提高這個(gè)函數(shù)的靈活性。
一般來(lái)說(shuō),Python程序員可能是這樣寫(xiě)main()函數(shù)的:
"""Module docstring.
This serves as a long usage message.
"""
import sys
import getopt
def main():
成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站與策劃設(shè)計(jì),光山網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:光山等地區(qū)。光山做網(wǎng)站價(jià)格咨詢:18982081108
try:
opts, args = getopt.getopt(sys.argv[1:], "h", ["help"])
except getopt.error, msg:
print msg
print "for help use --help"
sys.exit(2)
# process options
for o, a in opts:
if o in ("-h", "--help"):
print __doc__
sys.exit(0)
# process arguments
for arg in args:
process(arg) # process() is defined elsewhere
if name== "main":
main()
Guido也承認(rèn)之前自己寫(xiě)的main()函數(shù)也是類(lèi)似的結(jié)構(gòu),但是這樣寫(xiě)的靈活性還不夠高,尤其是需要解析復(fù)雜的命令行選項(xiàng)時(shí)。為此,他向大家提出了幾點(diǎn)建議。
添加可選的 argv 參數(shù)
首先,修改main()函數(shù),使其接受一個(gè)可選參數(shù) argv,支持在交互式shell中調(diào)用該函數(shù):
def main(argv=None):
if argv is None:
argv = sys.argv
這樣做,我們就可以動(dòng)態(tài)地提供 argv 的值,這比下面這樣寫(xiě)更加的靈活:
def main(argv=sys.argv):
這是因?yàn)樵谡{(diào)用函數(shù)時(shí),sys.argv 的值可能會(huì)發(fā)生變化;可選參數(shù)的默認(rèn)值都是在定義main()函數(shù)時(shí),就已經(jīng)計(jì)算好的。
但是現(xiàn)在sys.exit()函數(shù)調(diào)用會(huì)產(chǎn)生問(wèn)題:當(dāng)main()函數(shù)調(diào)用sys.exit()時(shí),交互式解釋器就會(huì)推出!解決辦法是讓main()函數(shù)的返回值指示退出狀態(tài)(exit status)。因此,最后面的那行代碼就變成了這樣:
if name== "main":
sys.exit(main())
并且,main()函數(shù)中的sys.exit(n)調(diào)用全部變成return n。
定義一個(gè)Usage()異常
另一個(gè)改進(jìn)之處,就是定義一個(gè)Usage()異常,可以在main()函數(shù)最后的except子句捕捉該異常:
import sys
import getopt
class Usage(Exception):
def init(self, msg):
self.msg = msg
def main(argv=None):
if argv is None:
argv = sys.argv
try:
try:
opts, args = getopt.getopt(argv[1:], "h", ["help"])
except getopt.error, msg:
raise Usage(msg)
except Usage, err:
print >>sys.stderr, err.msg
print >>sys.stderr, "for help use --help"
return 2
if name== "main":
sys.exit(main())
這樣main()函數(shù)就只有一個(gè)退出點(diǎn)(exit)了,這比之前兩個(gè)退出點(diǎn)的做法要好。而且,參數(shù)解析重構(gòu)起來(lái)也更容易:AxiTrader返傭www.kaifx.cn/broker/axitrader.html,在輔助函數(shù)中引發(fā)Usage的問(wèn)題不大,但是使用return 2卻要求仔細(xì)處理返回值傳遞的問(wèn)題。
python 中name == ‘main’ 的作用
經(jīng)典的英文解釋:Make a script both importable and executable
中文解釋:使腳本可以被調(diào)用import并且也可以直接運(yùn)行
1、直接運(yùn)行
def fun():
print(name)
print('this is fun')
if name== 'main':
fun()
print('this is main')
python test_fun.py
main
this is fun
this is main
2、被調(diào)用import
import test_fun
test_fun.fun()
test_fun
this is fun
調(diào)用導(dǎo)入時(shí):此處輸出沒(méi)有顯示”main“,也就是說(shuō)模塊name = ‘main’ 下面的代碼并未執(zhí)行,main函數(shù)沒(méi)有執(zhí)行。
這個(gè)功能還有一個(gè)用處:調(diào)試代碼的時(shí)候,在”if name == ‘main‘“中加入一些我們的調(diào)試代碼,我們可以讓外部模塊調(diào)用的時(shí)候不執(zhí)行我們的調(diào)試代碼,但是如果我們想排查問(wèn)題的時(shí)候,直接執(zhí)行該模塊文件,調(diào)試代碼能夠正常運(yùn)行!
?python是一種解釋型腳本語(yǔ)言,和C/C++語(yǔ)言不同,C/C++程序從main函數(shù)開(kāi)始執(zhí)行,python程序從開(kāi)始到結(jié)尾順序執(zhí)行。先總結(jié)下python中的main函數(shù)的作用:讓模塊(函數(shù))可以自己?jiǎn)为?dú)執(zhí)行(調(diào)試),相當(dāng)于構(gòu)造了調(diào)用其它函數(shù)的入口,這就類(lèi)似于C/C++里面的mian函數(shù)了。
一方面:我們想要自己?jiǎn)为?dú)執(zhí)行(調(diào)試)
這里我們實(shí)際調(diào)試一下(假設(shè)這個(gè)文件是test.py):
#test.py
print('Hello World!')
def aaa():
print('this message is from aaa function')
def main():
print('this message is from main function')
if name== 'main':
main()
print ('now nameis %s' %name)
執(zhí)行python test.py??輸出:
Hello World!
this message is from main function
now nameis main
這里我們看到我們定義的aaa函數(shù)沒(méi)有被執(zhí)行,而main函數(shù)里面的內(nèi)容被執(zhí)行了,表明?if name== 'main':?這條判斷語(yǔ)句是通過(guò)的,執(zhí)行了判斷條件里的main();?
另一方面:通過(guò)import命令就可以使用其它.py文件里面的函數(shù),我們將test.py中的模塊(函數(shù))導(dǎo)入call.py,需注意test.py和call.py放在同一個(gè)文件夾下;
#call.py
from test import aaa
aaa()
print ('now nameis %s' %name)
執(zhí)行python? call.py? 輸出:
Hello World!
this message is from aaa function
now nameis main
所以當(dāng)我們自己寫(xiě)了.py文件,想要測(cè)試?yán)锩娴暮瘮?shù)時(shí),就這樣構(gòu)造一個(gè)main函數(shù)入口就可以調(diào)用測(cè)試自己寫(xiě)的函數(shù)啦~