def cmds_dispatcher():
commands = {}
def reg(name):
def _reg(fn):
commands[name] = fn
return fn
return _reg
def default():
print('not register')
def dispatcher():
while True:
cmd = input('>>>')
if cmd == 'quit':
return
commands.get(cmd, default)()
return reg, dispatcher
reg,dispatcher = cmds_dispatcher()
@reg('lnx')
def foo1():
print('welcome linux')
@reg('py')
def foo2():
print('welcome python')
@reg('hello')
def foo3():
print('hello the world')
dispatcher()
运行结果:
>>>lnx
welcome linux
>>>py
welcome python
>>>hello
hello the world
>>>abc
not register
>>>quit
案例变形:(函数带参)
from functools import partial
commands = {}
def reg(name,*args,**kwargs):
def _reg(fn):
fn = partial(fn,*args,**kwargs) #偏函数+参数解构
commands[name] = fn
return fn
return _reg
@reg('lnx',200,100,50)
def foo1(x,y,z):
print('welcome linux')
ret = x + y + z
print(ret)
return ret
@reg('py',200,100,50)
def foo2(x,y,z):
print('welcome python')
ret = x+y+z
print(ret)
return ret
@reg('hello',200,100,50)
def foo3(x,y,z):
print('hello the world')
ret = x+y+z
print(ret)
return ret
def default():
print('not register')
def distribution():
while True:
cmd = input('>>>')
if cmd == 'quit':
return
commands.get(cmd, default)()
distribution()
运行结果:
>>>lnv
not register
>>>lnx
welcome linux
350
>>>quit
用类实现命令分发器
1.传统的分发器
def dispatcher():
cmds = {}
def reg(name,fn):
cmds[name] = fn
def run():
while True:
name = input('>>>')
cmds.get(name,default)()
def default():
print('error')
return reg,run
reg,run = dispatcher()
reg('cmd1',lambda :print(1))
reg('cmd2',lambda :print(2))
dispatcher()
run()
运行结果:
>>>cmd1
1
>>>cmd2
2
>>>sjdklj
error
2.类的分发器
class dispatcher:
def reg(self,name,fn):
setattr(self,name,fn)
def run(self):
while True:
name = input('>>>')
getattr(self,name,self.default)() #1"setattr定义"的方法自己传参;2"非setattr定义"的方法帮你传self实参
def default(self):
print('error')
dis = dispatcher()
dis.reg('cmd2',lambda :print(2))
dis.reg('cmd3',lambda :print(3))
dis.run()
运行结果:
>>>cmd2
2
>>>cmd3
3
>>>sdf
error