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

装饰器未正常返回函数:计算器代码无效输入报错排查与修复

问题分析与修复方案

存在的核心问题

  • 非数字输入直接崩溃:menu()函数里直接把用户输入转成int,如果输入字母、符号等非整数内容,会触发ValueError,程序直接报错退出,此时valid_input装饰器根本没机会介入处理。
  • 无效输入后无返回值:valid_input装饰器的wrapper在输入不在0-4范围时,只打印提示但没有返回值,导致主循环里print(f"Result: {result}")会输出Result: None,逻辑不严谨。
  • 退出函数依赖环境:calc()里的quit()是Python交互式环境的专属函数,在脚本环境中用sys.exit()更通用可靠。

修复后的完整代码

import sys

def valid_input(func):
    def wrapper(x):
        if x in [0, 1, 2, 3, 4]:
            return func(x)
        else:
            print("Invalid Input")
            return None  # 添加明确返回值
    return wrapper

def show_operation(func):
    def wrapper(x, y):
        operation = func.__name__
        print(f"Performing {operation}")
        return func(x, y)
    return wrapper

@valid_input
def calc(op):
    if op == 0:
        print("Quitting calculator...")
        sys.exit()  # 替换为通用的sys.exit()
    else:
        x = get_operand()
        y = get_operand()
        if op == 1:
            return add(x, y)
        elif op == 2:
            return sub(x, y)
        elif op == 3:
            return mult(x, y)
        elif op == 4:
            return div(x, y)

def menu():
    while True:
        print("Enter an operation:")
        print("1 Add\n2 Subtract\n3 Multiply\n4 Divide\n0 Quit")
        user_input = input(">")
        try:
            return int(user_input)
        except ValueError:
            print("请输入有效数字(0-4)")  # 捕获非数字输入异常,提示后重新输入

def get_operand():
    while True:
        try:
            return int(input("Enter an operand:"))
        except ValueError:
            print("请输入有效的整数Operand")  # 同样给Operand添加异常处理,避免输入非数字崩溃

@show_operation
def add(x, y):
    return x + y

@show_operation
def sub(x, y):
    return x - y

@show_operation
def mult(x, y):
    return x * y

@show_operation
def div(x, y):
    return x / y

while True:
    op = menu()
    result = calc(op)
    if result is not None:  # 只有当result不为None时才打印结果
        print(f"Result: {result}\n")

关键修复点说明

  1. 给menu和get_operand添加异常捕获:用try-except包裹int()转换,遇到非数字输入时提示用户并重新获取输入,避免程序崩溃。
  2. 给valid_input的wrapper添加返回值:无效输入时返回None,主循环通过判断result是否为None决定是否打印结果,避免输出Result: None。
  3. 替换quit()为sys.exit():保证在所有Python环境中都能正常退出程序。

内容的提问来源于stack exchange,提问作者MessatsuX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:23:21