实用:python中命令调度分发器


'''
要求:

  程序员可以方便的注册函数到某个命令,用户输入命令时,路由到注册的函数,如果没有此命令,执行默认函数,用户输入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)
'''

posted @ 2022-10-15 03:58  布衣梦蝶1978  阅读(65)  评论(0编辑  收藏  举报