实现一个命令分发器

要求:

  程序员可以方便的注册函数到某个命令,用户输入命令时,路由到注册的函数,如果没有此命令,执行默认函数,用户输入input

分析:

  1 '''实现一个命令分发器'''
  2 
  3 # 初步实现
  4 commands = {} # 命令字典
  5 
  6 def reg(cmd, fn):
  7     commands[cmd] = fn
  8 
  9 # 默认函数
 10 def defaultfn():
 11     print('Unkonw cmd')
 12 
 13 # 函数
 14 def foo1():
 15     print('1')
 16 
 17 def foo2():
 18     print('2')
 19 
 20 # 注册(但是要有判断,不同用户或同一个用户,注册时使用的名字一样,会冲突,会覆盖
 21 # 1、每个用户有自己的commands
 22 # 2、加判断条件
 23 reg('mag',foo1)
 24 reg('py',foo2)
 25 
 26 
 27 def dispatcher():
 28     while True:
 29         cmd = input('>>')
 30         if cmd == '':
 31             print('bye')
 32             break
 33         commands.get(cmd, defaultfn)() #  拿到的是defaultfn对象,所以还要加一个括号
 34 
 35 dispatcher()
 36 print(commands)
 37 
 38 # 输出:
 39 # >>ds
 40 # Unkonw cmd
 41 # >>mag
 42 # 1
 43 # >>py
 44 # 2
 45 # >>
 46 # bye
 47 # {'mag': <function foo1 at 0x0000000001E5C620>, 'py': <function foo2 at 0x0000000001E5C6A8>}
 48 
 49 
 50 # 添加装饰器:现在的顺序是由上至下
 51 commands = {} # 命令字典
 52 
 53 def reg(cmd):
 54     def _reg(fn):
 55         commands[cmd] = fn
 56         return fn
 57     return  _reg
 58 
 59 
 60 # # 默认函数
 61 def defaultfn():
 62     print('Unkonw cmd')
 63 
 64 # 函数
 65 @reg('mag') # foo1 = reg('mag')(add) = _reg(add)
 66 #从装饰器的定义出发,先程序由上到下,到此处时,先执行foo1=reg('mag')(foo1),创建foo1函数对象,此时已经注册好了
 67 def foo1():
 68     print('1')
 69 @reg('py')
 70 def foo2():
 71     print('2')
 72 
 73 
 74 def dispatcher():
 75     while True:
 76         cmd = input('>>')
 77         if cmd == '':
 78             print('bye')
 79             break
 80         commands.get(cmd, defaultfn)() #  拿到的是defaultfn对象,所以还要加一个括号
 81         print(commands)
 82 dispatcher()
 83 print(commands)
 84 
 85 # 封装:
 86 def cmds_dispatcher():
 87     commands = {} # 命令字典
 88 
 89     def reg(cmd):
 90         def _reg(fn):
 91             commands[cmd] = fn
 92             return fn
 93         return  _reg
 94 
 95 
 96     # 默认函数
 97     def defaultfn():
 98         print('Unkonw cmd')
 99 
100     def dispatcher():
101         while True:
102             cmd = input('>>')
103             if cmd == '':
104                 print('bye')
105                 break
106             commands.get(cmd, defaultfn)() #  拿到的是defaultfn对象,所以还要加一个括号
107             print(commands)
108     return reg,dispatcher
109 
110 reg,run = cmds_dispatcher()
111 
112 # 函数
113 @reg('mag') # foo1 = reg('mag')(add) = _reg(add)
114 #从装饰器的定义出发,先程序由上到下,到此处时,先执行foo1=reg('mag')(foo1),创建foo1函数对象,此时已经注册好了
115 def foo1():
116     print('1')
117 @reg('py')
118 def foo2():
119     print('2')
120 
121 run()

猜你喜欢

转载自www.cnblogs.com/JerryZao/p/9574963.html