命令分发器

 

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

复制代码
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()
复制代码

 

posted @   ascertain  阅读(178)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示