标签:分发,python,cmd,调度,add,fn,print,reg,def From: https://www.cnblogs.com/mengdie1978/p/16793467.html
'''
要求:
程序员可以方便的注册函数到某个命令,用户输入命令时,路由到注册的函数,如果没有此命令,执行默认函数,用户输入input
分析:
输入命令映射到一个函数,并执行这个函数,应该cmd_tb1[vmd]=fn的形式,字典正好合适。
如果输入了某个cmd命令后,没有找到函数,就要调用缺省的函数执行,这正好是字典缺省函数。
cmd是字符串
'''
'''
#初步实现
commands = {} #命令字典
# 注册
def reg(cmd,fn):
commands[cmd]=fn
#默认函数
def defaultfn():
print('Unknown command')
#函数
def foo1():
print('foo1')
def foo2():
print('foo2')
# 注册(但是要有判断,不同用户或同一个用户,注册时使用的名字一样,会冲突,会覆盖
# 1、每个用户有自己的commands
# 2、加判断条件
reg('mag',foo1)
reg('py',foo2)
def dispatcher():
while True:
cmd = input('>>>')
if cmd.strip() == "quit":
print('bye')
return
commands.get(cmd, defaultfn)() #拿到的是defaultfn对象,所以还要加一个括号
dispatcher()
# print(commands)
print('1',commands)
'''
'''
>>>mag
foo1
>>>py
foo2
>>>dt
Unknown command
>>>quit
bye
1 {'mag': <function foo1 at 0x00000226D7BD9670>, 'py': <function foo2 at 0x00000226D7BD95E0>}
'''
'''
# 实用:python中命令调度分发器
#命令分发器 Base64
def cmds_dispatch():
#命令和函数存储的地方
commands={}
#注册
def reg(name):
def _reg(fn):
commands[name]=fn
return fn
return _reg
def defaultfunc():
print('Unknown command')
def dispatcher():
while True:
cmd=input('>>>')
if cmd.strip()=="quit":
return
commands.get(cmd,defaultfunc)() # 拿到的是defaultfn对象,所以还要加一个括号
return reg ,dispatcher
reg,dispatcher=cmds_dispatch()
@reg('mag') # foo1 = reg('mag')(add) = _reg(add)
# 从装饰器的定义出发,先程序由上到下,到此处时,先执行foo1=reg('mag')(foo1),创建foo1函数对象,此时已经注册好了
def foo1():
print('welcome magedu')
@reg('py')
def foo2():
print('welcome python')
# 注册(但是要有判断,不同用户或同一个用户,注册时使用的名字一样,会冲突,会覆盖
# 1、每个用户有自己的commands
# 2、加判断条件
# reg('mag',foo1)
# reg('py',foo2)
if __name__=="__main__":
dispatcher()
'''
'''
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,60)
def foo2(x,y,z):
print('welcome python')
ret=x+y+z
print(ret)
return ret
@reg('hello',200,80,90)
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)()
if __name__=="__main__":
distribution()
'''
'''
def dispatcher():
cmds={}
def reg(name,fn):
cmds[name]=fn
def default():
print('error')
def run():
while True:
name=input('>>>')
cmds.get(name,default)()
return reg,run
reg,run=dispatcher()
reg('cmd1',lambda :print(1))
reg('cmd2',lambda :print(2))
dispatcher()
run()
def fn1():
print('1')
fn1()
def fn2():
print('2')
fn2()
'''
'''
class dispatcher:
def reg(self,name,fn):
setattr(self,name,fn)
def default(self):
print('error')
def run(self):
while True:
name=input('>>>')
#1 "setattr定义"的方法自己传参;2"非setattr定义"的方法帮你self传参
getattr(self,name,self.default)()
dis=dispatcher()
# dis.reg('cmd2',lambda:print('2'))
# dis.reg('cmd1',lambda :print('1'))
# dis.run()
# 这样的话,加载的时候,函数已经被注册进去了,运行的时候,根据cmd直接调用
@dis.reg('add') # add = dis.reg('add')(add)
def add(x, y):
print(x + y)
@dis.reg('sub') # add = dis.reg('add')(add)
def sub(x, y):
print(x - y)
dis.run(4, y = 5)
'''
'''
class Dispatcher:
def __init__(self):
#self.commands={}
pass
def reg(self,cmd):
def wrapper(fn):
setattr(self,cmd,fn)
return fn
return wrapper
def run(self,*args,**kwargs):
while True:
cmd=input('>>>').strip()
if cmd=='':
return
else:
getattr(self,cmd,lambda :print('Unknown'))(*args,**kwargs)
dis=Dispatcher()
# 这样的话,加载的时候,函数已经被注册进去了,运行的时候,根据cmd直接调用
@dis.reg('add') #add=dis.reg('add')('add')
def add(x,y):
print(x+y)
@dis.reg('sub') #add=dis.reg('add')(add)
def sub(x,y):
print(x-y)
dis.run(4,y=5)
'''