You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写通过输入命令调用对应函数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:09:05