首页 > 学院 > 开发设计 > 正文

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

2019-11-14 17:07:14
字体:
来源:转载
供稿:网友

问题背景:

最近在用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参数,短了不少……

关于getattr部分,请参考这里
关于__doc__的部分,请参考这里

@ Sprout

email
点击查看我的其它博客地址


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表