问题背景:

最近在用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 mousecatchcat@yeah.net

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

python2 ----函数字典的使用的更多相关文章

  1. Python2 中字典实现的分析【翻译】

    在这片文章中会介绍 Python2 中字典的实现,Hash 冲突的解决方法以及在 C 语言中 Python 字典的具体结构,并分析了数据插入和删除的过程.翻译自python-dictionary-im ...

  2. python2.7字典转换成json时中文字符串变成unicode的问题:

    参考:http://blog.csdn.net/u014431852/article/details/53058951 编码问题: python2.7字典转换成json时中文字符串变成unicode的 ...

  3. 零基础学python-2.8 字典

    字典类型,事实上就是相当于java的map,通过key-value来记录数据,工作原理类似于哈希表 差点儿全部的python对象都能够作为key,可是一般最经常使用的还是数字和字符串 字典元素使用{} ...

  4. Python---2. 函数

    转载: Py西游攻关之函数 补充: map函数和reduce函数的区别

  5. python2函数

    1.函数的定义 函数的定义形式如下: def <name>(arg1,arg2...argN): <statements> 函数的名字必须以字母开头,可以包括下划线.函数的目的 ...

  6. python-2函数

    http://docs.python.org/3/library/functions.html 或者菜鸟中文资料 1-使用函数 abs(-20)#求绝对值 max(1,4,200,3,2) #求最大的 ...

  7. day11.1函数进阶 列表集合 字典中的函数变量,函数作为形参

    函数进阶 1.函数作为变量 a=123 name="gao" nums=[1,2,3] data=nums#指向同一个内存地址 #查看内存地址篇章 def func(): prin ...

  8. [Python3 填坑] 012 字典的遍历在 Python2 与 Python3 中区别

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python2 中字典的遍历 2.2 Python3 中字典的遍历 2.3 结论 1. print( 坑的信息 ) 挖坑时间:2019/ ...

  9. 总结:自动将函数对象添加到字典的bug

    介绍 本文以ATM项目为背景,介绍一个比较实用的编程技巧,使用装饰器将项目中的指定函数添加到字典中. 利用字典通过key访问value的特点,实现用户输入编号,通过字典直接获取并调用编号对应的功能函数 ...

随机推荐

  1. 转载:常见EXE文件反编译工具

    PE Explorer V1.99 R5 绿色汉化特别版_强大的可视化汉化集成工具 功能极为强大的可视化汉化集成工具,可直接浏览.修改软件资源,包括菜单.对话框.字符串表等: 另外,还具备有 W32D ...

  2. 在FMX中实现PostMessage的方法

    在FMX中实现PostMessage的方法 http://www.qdac.cc/?p=1090 2014-10-31 • Android.C++ Builder.Delphi.杂谈 • 4条评论 • ...

  3. PooledDataSource--mybatis-3-mybatis-3.2.3

    org.apache.ibatis.executor.SimpleExecutor public <E> List<E> doQuery(MappedStatement ms, ...

  4. 修改Fedora 20 启动项

    在Fedora 20里面,Fedora 使用了systemd作为系统与服务的管理工具,这个守护进程是系统开机后第一个开启的进程,pid 为1.systemd扮演着初始化系统的角色,主要用于开启与维护系 ...

  5. jquery插件-省市联动

        由于项目需要需要实现一个省市联动,由于业务有一些特殊的需求,使用现有的插件略有不便,就自己实现了一个.     首先需要保存地区数据的JS数据文件,我这里命名为areaData.js,内容如下 ...

  6. hdu 5642 King's Order(数位dp)

    Problem Description After the king's speech , everyone is encouraged. But the war is not over. The k ...

  7. Git的一些用法(建立新的branch)

    建立新的branch和查看全部的branch(kk的代码是基于现有的branch) 切换到branch kk: 当然我们也能够在android studio里操作: 注意切换的时候代码会丢失,必须先c ...

  8. POJ 3254 炮兵阵地(状态压缩DP)

    题意:由方格组成的矩阵,每个方格可以放大炮用P表示,不可以放大炮用H表示,求放最多的大炮,大炮与大炮间不会互相攻击.大炮的攻击范围为两个方格. 分析:这次当前行的状态不仅和上一行有关,还和上上行有关, ...

  9. 连数据库是ODBC好还是OLEDB好

    1.连数据库是ODBC好还是OLEDB好?2.是不是只有微软的数据库才可以用OLEDB?3.要切换这两种连接,是不是只需要修改连接字符串?谢谢大家了,小弟对这三个问题不解 分享到:   2009-03 ...

  10. 7. 稀疏表示之OMP,SOMP算法及openCV实现

    一.前言 稀疏表示是自上世纪90年代开始,从人眼的视觉感受野获得启示,逐渐被人们所研究.现在已经发展为一种重要的信息表示方法.所谓稀疏表示是指,一个信号在过完备字典中,可以由少数个原子线性表达, 其数 ...