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

相关文章
相关标签/搜索