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

Python add_new_device函数重复执行,如何终止旧调用仅运行新实例?

问题解决

问题根源

你当前的实现采用递归重启流程,但触发校验失败调用新的add_new_device()后,没有终止当前函数实例的运行,新递归实例执行完毕后,原函数会继续执行后续的输入、存储逻辑,最终导致重复输入、重复插入设备数据的问题。

方案1:最小改动修复(直接终止当前函数调用)

只需要在每次递归调用add_new_device()后添加return语句,直接结束当前函数的执行,就不会再跑后续逻辑:

import time
# 假设devices_all是全局存储的设备列表
devices_all = []

def add_new_device():
    print("\n––––––––––––––––––––––––––––––––––––––––––––––––––––––––––")
    print("\n  > MAIN MENU > SHOW OR EDIT INVENTORY > ADD NEW DEVICE")
    new_device = {}
    print ("\nPlease enter a key for your device - e.g.  \"R\" for Router")
    new_devkey = input("\n\n Device key:  ")
    new_device["dev_key"] = new_devkey
    if any(x["dev_key"] == new_devkey for x in devices_all):
        print("\n––––––––––––––––––––––––––––––––––––––––––––––––––––––––––")
        print("\n               DEVICE KEY ALREADY EXISTS!")
        print("              PLEASE ASSIGN A DIFFERENT KEY")
        time.sleep(1)
        add_new_device()
        # 新增return终止当前函数运行
        return

    new_devname = input(" Device name:  ") 
    new_device["dev_name"] = new_devname
    if any(y["dev_name"] == new_devname for y in devices_all):
        print("\n––––––––––––––––––––––––––––––––––––––––––––––––––––––––––")
        print("\n              DEVICE NAME ALREADY EXISTS!")
        print("             PLEASE ASSIGN A DIFFERENT NAME")
        time.sleep(1)
        add_new_device()
        # 新增return终止当前函数运行
        return
        
    new_device["dev_quantity"] = input(" Device quantity:  ")
    devices_all.append(new_device)
    
    print("\n––––––––––––––––––––––––––––––––––––––––––––––––––––––––––")
    print("\n              SUCCESSFULLY ADDED NEW DEVICE")
    print("\n. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ")
    return new_device

方案2:更推荐的循环实现(避免递归栈溢出风险)

递归方式如果用户连续多次输错,会触发递归深度超限报错,改用while循环逐步骤校验,逻辑更清晰稳定:

import time
devices_all = []

def add_new_device():
    print("\n––––––––––––––––––––––––––––––––––––––––––––––––––––––––––")
    print("\n  > MAIN MENU > SHOW OR EDIT INVENTORY > ADD NEW DEVICE")
    new_device = {}

    # 校验设备key
    while True:
        print ("\nPlease enter a key for your device - e.g.  \"R\" for Router")
        new_devkey = input("\n\n Device key:  ")
        if any(x["dev_key"] == new_devkey for x in devices_all):
            print("\n––––––––––––––––––––––––––––––––––––––––––––––––––––––––––")
            print("\n               DEVICE KEY ALREADY EXISTS!")
            print("              PLEASE ASSIGN A DIFFERENT KEY")
            time.sleep(1)
            continue
        new_device["dev_key"] = new_devkey
        break

    # 校验设备名称
    while True:
        new_devname = input(" Device name:  ")
        if any(y["dev_name"] == new_devname for y in devices_all):
            print("\n––––––––––––––––––––––––––––––––––––––––––––––––––––––––––")
            print("\n              DEVICE NAME ALREADY EXISTS!")
            print("             PLEASE ASSIGN A DIFFERENT NAME")
            time.sleep(1)
            continue
        new_device["dev_name"] = new_devname
        break

    # 输入数量
    new_device["dev_quantity"] = input(" Device quantity:  ")
    devices_all.append(new_device)
    
    print("\n––––––––––––––––––––––––––––––––––––––––––––––––––––––––––")
    print("\n              SUCCESSFULLY ADDED NEW DEVICE")
    print("\n. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ")
    return new_device

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 06:15:01