您好,登錄后才能下訂單哦!
每個程序員在學習編程的過程中,肯定沒少寫過main()函數,Python程序員也不例外。本文為大家分享Python之父Guido van Rossum推薦的函數寫法,可以大大提高這個函數的靈活性。
一般來說,Python程序員可能是這樣寫main()函數的:
"""Module docstring.
This serves as a long usage message.
"""
import sys
import getopt
def main():
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()函數也是類似的結構,但是這樣寫的靈活性還不夠高,尤其是需要解析復雜的命令行選項時。為此,他向大家提出了幾點建議。
添加可選的 argv 參數
首先,修改main()函數,使其接受一個可選參數 argv,支持在交互式shell中調用該函數:
def main(argv=None):
if argv is None:
argv = sys.argv
這樣做,我們就可以動態地提供 argv 的值,這比下面這樣寫更加的靈活:
def main(argv=sys.argv):
這是因為在調用函數時,sys.argv 的值可能會發生變化;可選參數的默認值都是在定義main()函數時,就已經計算好的。
但是現在sys.exit()函數調用會產生問題:當main()函數調用sys.exit()時,交互式解釋器就會推出!解決辦法是讓main()函數的返回值指示退出狀態(exit status)。因此,最后面的那行代碼就變成了這樣:
if name == "main":
sys.exit(main())
并且,main()函數中的sys.exit(n)調用全部變成return n。
定義一個Usage()異常
另一個改進之處,就是定義一個Usage()異常,可以在main()函數最后的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()函數就只有一個退出點(exit)了,這比之前兩個退出點的做法要好。而且,參數解析重構起來也更容易:AxiTrader返傭www.kaifx.cn/broker/axitrader.html,在輔助函數中引發Usage的問題不大,但是使用return 2卻要求仔細處理返回值傳遞的問題。
python 中name == ‘main’ 的作用
經典的英文解釋:Make a script both importable and executable
中文解釋:使腳本可以被調用import并且也可以直接運行
1、直接運行
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、被調用import
import test_fun
test_fun.fun()
test_fun
this is fun
調用導入時:此處輸出沒有顯示”main“,也就是說模塊name = ‘main’ 下面的代碼并未執行,main函數沒有執行。
這個功能還有一個用處:調試代碼的時候,在”if name == ‘main‘“中加入一些我們的調試代碼,我們可以讓外部模塊調用的時候不執行我們的調試代碼,但是如果我們想排查問題的時候,直接執行該模塊文件,調試代碼能夠正常運行!
?python是一種解釋型腳本語言,和C/C++語言不同,C/C++程序從main函數開始執行,python程序從開始到結尾順序執行。先總結下python中的main函數的作用:讓模塊(函數)可以自己單獨執行(調試),相當于構造了調用其它函數的入口,這就類似于C/C++里面的mian函數了。
一方面:我們想要自己單獨執行(調試)
這里我們實際調試一下(假設這個文件是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 name is %s' %name)
執行python test.py??輸出:
Hello World!
this message is from main function
now name is main
這里我們看到我們定義的aaa函數沒有被執行,而main函數里面的內容被執行了,表明?if name == 'main':?這條判斷語句是通過的,執行了判斷條件里的main();?
另一方面:通過import命令就可以使用其它.py文件里面的函數,我們將test.py中的模塊(函數)導入call.py,需注意test.py和call.py放在同一個文件夾下;
#call.py
from test import aaa
aaa()
print ('now name is %s' %name)
執行python? call.py? 輸出:
Hello World!
this message is from aaa function
now name is main
所以當我們自己寫了.py文件,想要測試里面的函數時,就這樣構造一個main函數入口就可以調用測試自己寫的函數啦~
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。