命令分发器
注册函数到一个名字,调用名字的时候,路由到注册函数,如果名字没有注册函数,路由到缺省函数
def cmd_dispatcher():
command={}
def reg(name): # 注册函数装饰器
def _reg(fn):
command[name]=fn
return fn
return _reg
def defaultfunc():
print('defaultfunc')
def dispatcher():
while True:
cmd=input('>>').strip()
if cmd == 'quit':
return None
command.get(cmd,defaultfunc)()
return reg,dispathcer
reg,dispatcher=cmd_dispatcher()
@reg('zxc')
def dix1():
print('dix1')
@reg('vbn')
def dix2():
print('dix2')
dispatcher()
带参
import functools
def command_dispatcher():
cmd_dict={}
def defaultfunc():
print('defaultfunc')
def reg(cmd,*args,**kwargs):
def _reg(fn):
newfn=functools.partial(fn,*args,**kwargs)
cmd_dict[cmd]=newfn
return fn
return _reg
def dispatcher():
while True:
zim=input('>>').strip()
if zim == 'quit':
return None
cmd_dict.get(zim,defaultfunc)()
return reg,dispatcher
reg,dispatcher=command_dispatcher()
@reg('zxc',5,6)
def viz(x,y):
print(x+y)
@reg('bb',b=99) # 原函数只有a的默认值生效
@reg('vbn',6,b=400) # 经过partial处理后形参a,b都有赋值,因此原函数的默认值不再生效
def vib(a=4,b=88):
print(a+b)
dispatcher()