最近在用python2為sublime2寫一個插件,其中有一個命令功能,就是輸入不同的命令調用不同的函數,但是python不支持switch,只用ifelse的話感覺特別的low而且明顯不是好的設計:如果要新增一個命令,就要先寫完函數以后再在ifelse里面新增一行,不僅增加了代碼的工作量,而且查找命令也很不方便,所以我想到了python的函數名__name__,能不能用函數名來實現自動查找相應函數去調用呢?
一般的想法是利用getattr,將函數裝到類里面去,就像這樣:
>>>class testClass(): ... def funcA(self,name): ... PRint 'funcA'+name... ... def funcB(self):... print 'funcB' ... ... >>>t = testClass() >>>a = getattr(t,'funcA',None) >>>b = getattr(t,'funcB',None) >>>a('name')'funcAname' >>>b()'funcB'這樣就可以輕松實現工廠模式,但是這樣做有個弊端就是我們并不能夠動態的管理所有命令,而且有些命令指向同一個函數,這樣做也會使函數的管理變得很不方便,而且需要對類管理,每次更新文檔,我們都要重復的去修改文檔中的內容,于是想到了python的另一個強大的功能:字典
字典里可以存儲函數,這樣只需要查找字典中的全部值再加上函數強大的__doc__就可以方便的對函數與文檔進行維護,而且易于查找的函數字典可以更方便更靈活的對函數進行操作
具體示例代碼如下:
def commandA(name): 'commandA is for testA' print name def commandB(): 'commandB is for testB' print 'hello world' command = {'commandA':commandA,'commandB':commandB} command['commandA']('testA') command['commandB']() def show_doc(): for func in command.values(): print func.__doc__ def commandf(commandstr,params = []): func = command[commandstr] if None != func: func(params)如果要新增命令,只需要寫:
def newcommand(): print 'newcommand' command['newcommand'] = newcommand當然這樣也不完善,因為要手動維護一個dict,但是比起文檔的麻煩來說,已經好太多了,而且有很重要的一點是,這樣的函數不用寫self參數,短了不少……
email
點擊查看我的其它博客地址
新聞熱點
疑難解答