最近在用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