python2 ----函數字典的使用

問題背景:

最近在用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參數,短了很多……

插件

關於getattr部分,請參考這裏
關於__doc__的部分,請參考這裏設計

@ Sprout

email mousecatchcat@yeah.net
點擊查看個人其它博客地址code

相關文章
相關標籤/搜索