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

Python实现清单增删功能时买家删除操作失效问题排查

买家删除功能失效排查与修复

核心问题点

  • 买家删除方法remove2逻辑错误:当前实现未执行字典键删除操作,仅对已存在的买家值做字符串转换后重新写回字典,不存在的买家反而会被新增到字典中,完全不符合删除需求
  • 数据持久化逻辑缺陷:连续两次调用json.dump向同一文件写入两个独立字典,会生成不符合JSON规范的文件内容;加载时连续两次json.load会导致车辆、买家数据读取错位
  • 类属性定义不规范:cars、buyers直接定义为类属性,多实例场景下会出现全局数据污染
  • 交互逻辑bug:菜单提示退出选项为exit,但判断条件写为avsluta;选择save选项时未加括号调用方法,实际不会触发保存
  • 买家添加方法add2存在冗余逻辑,无实际增量更新作用

修复后代码

import json
import os.path

class Inventory:
    def __init__ (self):
        # 实例属性初始化,避免类属性污染
        self.cars = {}
        self.buyers = {}
        self.load()

    def add(self,key,qty):
        q = 0
        if key in self.cars:
            v = self.cars[key]
            q = v + qty
        else:
            q = qty
        self.cars[key] = q
        print(f'added {qty} {key}: total = {self.cars[key]}')
    
    def add_buyer(self,buy):
        # 修复冗余逻辑,直接新增买家
        self.buyers[buy] = buy
        print(f'added buyer: {buy}')

    def remove_buyer(self,buy):
        # 正确执行删除逻辑
        if buy in self.buyers:
            del self.buyers[buy]
            print(f'removed buyer: {buy}')
        else:
            print(f'buyer {buy} not exists')

    def remove(self,key,qty):
        q = 0
        if key in self.cars:
            v = self.cars[key]
            q = v - qty
        if q < 0:
            q = 0
        self.cars[key] = q
        print(f'removed {qty} {key}: total = {self.cars[key]}')
    
    def display(self):
        print("=== Car Inventory ===")
        for key, value in self.cars.items():
            print(f'{key} = {value}')
        print("\n=== Buyer List ===")
        for buy_id, buy_name in self.buyers.items():
            print(f'{buy_name}')

    def save(self):
        print('saving information...')
        with open('inventory4.txt', 'w') as f:
            # 合并为单个JSON对象存储,避免格式错误
            json.dump({
                "cars": self.cars,
                "buyers": self.buyers
            },f)
        print('information saved!')

    def load(self):
        print('loading information...')
        if not os.path.exists('inventory4.txt'):
            print('nothing to load!')
            return
        with open('inventory4.txt', 'r') as f:
            # 读取单个JSON对象后拆分赋值
            data = json.load(f)
            self.cars = data.get("cars", {})
            self.buyers = data.get("buyers", {})
        print('Information Loaded!')

def main():
    inv = Inventory()

    while True:
        print('\nWrite your choice...\n')
        action = input('Choice:\nadd car, remove car, add buyer, remove buyer, list, save, exit: ')
        # 修复退出选项匹配
        if action == 'exit':
            break
        if action == 'add car' or action == 'remove car':
                key = input('Add/remove specific car: ')
                qty = int(input('Quantity: '))
                if action == 'add car':
                    inv.add(key,qty)
                if action == 'remove car':
                    inv.remove(key,qty)
        if action == 'add buyer' or action == 'remove buyer':
                buyer_name = input('Add/remove buyer: ')
                if action == 'add buyer':
                    inv.add_buyer(buyer_name)
                if action == 'remove buyer':
                    inv.remove_buyer(buyer_name)
            
        if action == 'list':
            print('____________________________________\n')
            inv.display()
            print('____________________________________\n')
        
        if action == 'save':
            # 修复方法调用,加括号
            inv.save()
    inv.save()


if __name__ == "__main__":
    main()

关键修复说明

  • 重写买家删除方法:使用del关键字从买家字典中移除对应键,删除前做存在性校验,不存在时给出提示
  • 重构持久化逻辑:将车辆、买家数据封装为单个字典做JSON序列化,读取时一次性解析后拆分赋值,避免JSON格式错误
  • 修正交互逻辑:匹配菜单的exit退出选项,修复save操作的方法调用问题
  • 调整属性定义:将车辆、买家字典移到__init__方法内作为实例属性,避免多实例数据共享问题
  • 优化输出格式:列表展示时区分车辆、买家模块,输出更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:39:34