zl程序教程

您现在的位置是:首页 >  工具

当前栏目

命令分发器

命令 分发
2023-09-11 14:16:17 时间

 

注册函数到一个名字,调用名字的时候,路由到注册函数,如果名字没有注册函数,路由到缺省函数

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()