首页 > 编程语言 >实用:python中命令调度分发器

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

时间:2022-10-15 04:11:05浏览次数:61  
标签:分发 python cmd 调度 add fn print reg def


'''
要求:

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

标签:分发,python,cmd,调度,add,fn,print,reg,def
From: https://www.cnblogs.com/mengdie1978/p/16793467.html

相关文章

  • Python实验报告——第6章 函数
    实验报告【实验目的】 1.掌握如何创建并调用一个函数,以及如何进行参数传递和指定函数的返回值等。2.掌握变量的作用域和匿名函数。【实验条件】1.PC机或者远程编程......
  • Python Flask-SocketIO没有启动成功
    背景最近想做websocket服务端,发现Flask已提供第三方库;尝试使用后,发现前端也必须使用SocketIO,不太适用,所以放弃。 问题WARNINGininit:WebSockettransportnotavai......
  • Python Flask 返回html文件
    1、在templates文件夹建立一个html文件<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>Index</title></head><body><h2>This is i......
  • Python Flask报错:TypeError: 'NoneType' object is not subscriptable
    问题:用Flask写了一个请求,用Jmeter请求时报错;但在postman中参数发送,可以成功返回数据以及正常状态码200; 分析:request以json形式发送post请求时,需要headers 解决:he......
  • Python 第一个Flask
    安装flaskpip3installflask 导入类fromflaskimportFlask 第一个Flask实例化创建一个Flask应用,第一个参数是Flask应用的名称app=Flask(__name_......
  • Python Flask HTTP请求
    GET请求@app.route('/get',methods=["GET"])defget_():#返回字符串return'这是get请求' POST请求@app.route('/post',methods=["POST"])defpost......
  • Python 正则表达式匹配数字及字符串中的纯数字
    Python正则表达式匹配数字电话号码:\d{3}-\d{8}|\d{4}-\d{7} QQ号:[1-9][0-9]{4,}中国邮政编码:[1-9]\d{5}(?!\d)身份证:\d{15}|\d{18}ip地址:\d+\.\d+\.\d+\.\d+ [1-9]......
  • 核心分发器DispatcherServlet
    核心分发器DispatcherServlet1.5.1DispatcherServletDispatcherServlet是SpringMVC的"灵魂"和"心脏",它负责接受HTTP请求并协调SpringMVC的各个组件完成请求处理的工作......
  • 核心分发器DispatcherServlet
    核心分发器DispatcherServlet1.5.1DispatcherServletDispatcherServlet是SpringMVC的"灵魂"和"心脏",它负责接受HTTP请求并协调SpringMVC的各个组件完成请求处理的工作......
  • python 异常的捕获
    1.捕获常规异常1.1基本语法try:可能发生错误的代码except:如果出现异常执行的代码快速入门需求:尝试以‘r’模式打开文件,如果文件不存在,则以‘w’方式打开try......