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

def cmds_dispatcher():
    commands = {}

    def reg(name):
        def _reg(fn):
            commands[name] = fn
            return fn
        return _reg

    def default():
        print('not register')

    def dispatcher():
        while True:
            cmd = input('>>>')
            if cmd == 'quit':
                return
            commands.get(cmd, default)()
    return reg, dispatcher

reg,dispatcher = cmds_dispatcher()

@reg('lnx')
def foo1():
    print('welcome linux')


@reg('py')
def foo2():
    print('welcome python')


@reg('hello')
def foo3():
    print('hello the world')


dispatcher()

运行结果:

>>>lnx
welcome linux
>>>py
welcome python
>>>hello
hello the world
>>>abc
not register
>>>quit

案例变形:(函数带参)

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,50)
def foo2(x,y,z):
    print('welcome python')
    ret = x+y+z
    print(ret)
    return ret

@reg('hello',200,100,50)
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)()

distribution()

运行结果:

>>>lnv
not register
>>>lnx
welcome linux
350
>>>quit

用类实现命令分发器
1.传统的分发器

def dispatcher():
    cmds = {}
    def reg(name,fn):
        cmds[name] = fn

    def run():
        while True:
            name = input('>>>')
            cmds.get(name,default)()

    def default():
        print('error')

    return reg,run

reg,run = dispatcher()

reg('cmd1',lambda :print(1))
reg('cmd2',lambda :print(2))

dispatcher()
run()

运行结果:

>>>cmd1
1
>>>cmd2
2
>>>sjdklj
error

2.类的分发器

class dispatcher:

    def reg(self,name,fn):
        setattr(self,name,fn)

    def run(self):
        while True:
            name = input('>>>')
            getattr(self,name,self.default)() #1"setattr定义"的方法自己传参;2"非setattr定义"的方法帮你传self实参

    def default(self):
        print('error')



dis = dispatcher()
dis.reg('cmd2',lambda :print(2))
dis.reg('cmd3',lambda :print(3))
dis.run()

运行结果:

>>>cmd2
2
>>>cmd3
3
>>>sdf
error
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值