问题背景:
最近在用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参数,短了不少……
@ Sprout
email mousecatchcat@yeah.net
点击查看我的其它博客地址
python2 ----函数字典的使用的更多相关文章
-
Python2 中字典实现的分析【翻译】
在这片文章中会介绍 Python2 中字典的实现,Hash 冲突的解决方法以及在 C 语言中 Python 字典的具体结构,并分析了数据插入和删除的过程.翻译自python-dictionary-im ...
-
python2.7字典转换成json时中文字符串变成unicode的问题:
参考:http://blog.csdn.net/u014431852/article/details/53058951 编码问题: python2.7字典转换成json时中文字符串变成unicode的 ...
-
零基础学python-2.8 字典
字典类型,事实上就是相当于java的map,通过key-value来记录数据,工作原理类似于哈希表 差点儿全部的python对象都能够作为key,可是一般最经常使用的还是数字和字符串 字典元素使用{} ...
-
Python---2. 函数
转载: Py西游攻关之函数 补充: map函数和reduce函数的区别
-
python2函数
1.函数的定义 函数的定义形式如下: def <name>(arg1,arg2...argN): <statements> 函数的名字必须以字母开头,可以包括下划线.函数的目的 ...
-
python-2函数
http://docs.python.org/3/library/functions.html 或者菜鸟中文资料 1-使用函数 abs(-20)#求绝对值 max(1,4,200,3,2) #求最大的 ...
-
day11.1函数进阶 列表集合 字典中的函数变量,函数作为形参
函数进阶 1.函数作为变量 a=123 name="gao" nums=[1,2,3] data=nums#指向同一个内存地址 #查看内存地址篇章 def func(): prin ...
-
[Python3 填坑] 012 字典的遍历在 Python2 与 Python3 中区别
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python2 中字典的遍历 2.2 Python3 中字典的遍历 2.3 结论 1. print( 坑的信息 ) 挖坑时间:2019/ ...
-
总结:自动将函数对象添加到字典的bug
介绍 本文以ATM项目为背景,介绍一个比较实用的编程技巧,使用装饰器将项目中的指定函数添加到字典中. 利用字典通过key访问value的特点,实现用户输入编号,通过字典直接获取并调用编号对应的功能函数 ...
随机推荐
-
JavaScript闭包之“词法作用域”
大家应该写过下面类似的代码吧,其实这里我想要表达的是有时候一个方法定义的地方和使用的地方会相隔十万八千里,那方法执行时,它能访问哪些变量,不能访问哪些变量,这个怎么判断呢?这个就是我们这次需要分析的问 ...
-
rails下react的demo
gemfile gem 'react-rails' gen一下 react:install 创建组件 react:component MyComponent name:string age:int v ...
-
在項目中快速部署SLF4J+LOGBACK
想了解SLF4J,LOGBACK是什么?可以访问:http://www.slf4j.org/ http://logback.qos.ch/ 本文大部分参考了Cody Burleson<Ho ...
-
sizeof()用法汇总
sizeof()功能:计算数据空间的字节数 1.与strlen()比较 strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素. ...
-
注意!你的Thread.Abort方法真的让线程停止了吗?
大家都知道在C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Threa ...
-
靠边伸缩菜单的做法(类似QQ,碰到就会伸出来)
这段脚本主要实现一个group的伸缩功能,group里面的内容也就是菜单的内容可以*添加. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...
-
Java集合类 java.util包
概述 软件包 类 使用 树 已过时 索引 帮助 JavaTM Platform Standard Ed. 6 上一个软件包 下一个软件包 框架 无框架 ...
-
源代码安装GIT
参考URL:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=25150840&id=4250659 若是条件允许,从源代 ...
-
mysql 的crud操作(增删改查)
1.mysql添加记录 --添加记录的语法(可添加单条记录或者多条记录),INTO是可以省略的,字段名也可以省略的,但是如果省略的话,后面对应的value的值就要全部填写 INSERT [INTO] ...
-
DOS中的ECHO命令详解
1. 作为控制批处理命令在执行时是否显示命令行自身的开关 格式:ECHO [ON|OFF] 如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”. 2. 显示当前ECHO ...