编写通过输入命令调用对应函数的Python装饰器,报错是否与_input有关
Python装饰器实现命令匹配调用问题解决方案
问题原因
- 你的代码仅完成了命令和对应函数的绑定逻辑,没有触发任何被装饰的函数执行,因此不会有输出。
- 现有写法中
_input在模块加载阶段就会执行输入读取,单命令场景可以正常使用,但如果要支持多轮命令交互需要调整读取时机。
最小改动实现预期效果
如果不调整原有装饰器逻辑,仅需要在代码末尾添加对所有被装饰函数的调用即可,装饰器内部会自动判断是否匹配输入的命令:
import random from functools import wraps _input = input() def name(command='help'): def _name(func): @wraps(func) def inner(*args, **kwargs): if _input == command: func(*args, **kwargs) return inner return _name @name(command='test') def poo(): print('5') @name(command='test_2') def foo(): print('Hello') # 新增以下两行触发执行 poo() foo()
运行后输入test即可输出5,输入test_2即可输出Hello。
更合理的优化方案
上述写法每次新增命令都需要手动调用对应函数,推荐使用命令注册表的方式简化逻辑:
from functools import wraps # 存储命令和对应函数的映射关系 command_registry = {} def name(command='help'): def _name(func): @wraps(func) def inner(*args, **kwargs): return func(*args, **kwargs) # 注册命令 command_registry[command] = inner return inner return _name @name(command='test') def poo(): print('5') @name(command='test_2') def foo(): print('Hello') if __name__ == "__main__": input_cmd = input().strip() # 匹配命令自动执行,新增命令不需要修改此处逻辑 if input_cmd in command_registry: command_registry[input_cmd]()
内容的提问来源于stack exchange,提问作者Lolo
相关产品推荐
相关产品推荐

