最近在用python2爲sublime2寫一個插件,其中有一個命令功能,就是輸入不一樣的命令調用不一樣的函數,可是python不支持switch,只用ifelse的話感受特別的low並且明顯不是好的設計:若是要新增一個命令,就要先寫完函數之後再在ifelse裏面新增一行,不只增長了代碼的工做量,並且查找命令也很不方便,因此我想到了python的函數名__name__,能不能用函數名來實現自動查找相應函數去調用呢?
html
通常的想法是利用getattr,將函數裝到類裏面去,就像這樣:python
>>>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)
若是要新增命令,只須要寫:.net
def newcommand(): print 'newcommand' command['newcommand'] = newcommand
固然這樣也不完善,由於要手動維護一個dict,可是比起文檔的麻煩來講,已經好太多了,並且有很重要的一點是,這樣的函數不用寫self參數,短了很多……
插件
email mousecatchcat@yeah.net
點擊查看個人其它博客地址code