python如何寫好main函數(shù)

每個程序員在學習編程的過程中,肯定沒少寫過main()函數(shù),Python程序員也不例外。本文為大家分享Python之父Guido van Rossum推薦的函數(shù)寫法,可以大大提高這個函數(shù)的靈活性。
一般來說,Python程序員可能是這樣寫main()函數(shù)的:
"""Module docstring.
This serves as a long usage message.
"""
import sys
import getopt
def main():

成都創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計、成都做網(wǎng)站與策劃設(shè)計,光山網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:光山等地區(qū)。光山做網(wǎng)站價格咨詢:18982081108

parse command line options

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也承認之前自己寫的main()函數(shù)也是類似的結(jié)構(gòu),但是這樣寫的靈活性還不夠高,尤其是需要解析復(fù)雜的命令行選項時。為此,他向大家提出了幾點建議。
添加可選的 argv 參數(shù)
首先,修改main()函數(shù),使其接受一個可選參數(shù) argv,支持在交互式shell中調(diào)用該函數(shù):
def main(argv=None):
if argv is None:
argv = sys.argv

etc., replacing sys.argv with argv in the getopt() call.

這樣做,我們就可以動態(tài)地提供 argv 的值,這比下面這樣寫更加的靈活:
def main(argv=sys.argv):

etc.

這是因為在調(diào)用函數(shù)時,sys.argv 的值可能會發(fā)生變化;可選參數(shù)的默認值都是在定義main()函數(shù)時,就已經(jīng)計算好的。
但是現(xiàn)在sys.exit()函數(shù)調(diào)用會產(chǎn)生問題:當main()函數(shù)調(diào)用sys.exit()時,交互式解釋器就會推出!解決辦法是讓main()函數(shù)的返回值指示退出狀態(tài)(exit status)。因此,最后面的那行代碼就變成了這樣:
if name== "main":
sys.exit(main())
并且,main()函數(shù)中的sys.exit(n)調(diào)用全部變成return n。
定義一個Usage()異常
另一個改進之處,就是定義一個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)

more code, unchanged

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ù)就只有一個退出點(exit)了,這比之前兩個退出點的做法要好。而且,參數(shù)解析重構(gòu)起來也更容易:AxiTrader返傭www.kaifx.cn/broker/axitrader.html,在輔助函數(shù)中引發(fā)Usage的問題不大,但是使用return 2卻要求仔細處理返回值傳遞的問題。
python 中name == ‘main’ 的作用
經(jīng)典的英文解釋:Make a script both importable and executable
中文解釋:使腳本可以被調(diào)用import并且也可以直接運行
1、直接運行

cat test_fun.py

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)入時:此處輸出沒有顯示”main“,也就是說模塊name = ‘main’ 下面的代碼并未執(zhí)行,main函數(shù)沒有執(zhí)行。
這個功能還有一個用處:調(diào)試代碼的時候,在”if name == ‘main‘“中加入一些我們的調(diào)試代碼,我們可以讓外部模塊調(diào)用的時候不執(zhí)行我們的調(diào)試代碼,但是如果我們想排查問題的時候,直接執(zhí)行該模塊文件,調(diào)試代碼能夠正常運行!
?python是一種解釋型腳本語言,和C/C++語言不同,C/C++程序從main函數(shù)開始執(zhí)行,python程序從開始到結(jié)尾順序執(zhí)行。先總結(jié)下python中的main函數(shù)的作用:讓模塊(函數(shù))可以自己單獨執(zhí)行(調(diào)試),相當于構(gòu)造了調(diào)用其它函數(shù)的入口,這就類似于C/C++里面的mian函數(shù)了。
一方面:我們想要自己單獨執(zhí)行(調(diào)試)
這里我們實際調(diào)試一下(假設(shè)這個文件是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ù)沒有被執(zhí)行,而main函數(shù)里面的內(nèi)容被執(zhí)行了,表明?if name== 'main':?這條判斷語句是通過的,執(zhí)行了判斷條件里的main();?
另一方面:通過import命令就可以使用其它.py文件里面的函數(shù),我們將test.py中的模塊(函數(shù))導(dǎo)入call.py,需注意test.py和call.py放在同一個文件夾下;
#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
所以當我們自己寫了.py文件,想要測試里面的函數(shù)時,就這樣構(gòu)造一個main函數(shù)入口就可以調(diào)用測試自己寫的函數(shù)啦~

文章題目:python如何寫好main函數(shù)
鏈接URL:http://www.muchs.cn/article36/ijsspg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、關(guān)鍵詞優(yōu)化Google、微信公眾號、軟件開發(fā)、標簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)