朝盏487 2022-06-20 23:59 采纳率: 100%
浏览 278
已结题

请帮我完善下列代码,完善内容希望有一些注释。

报错内容Traceback (most recent call last):
File "C:/Users/heliun/PycharmProjects/pythonProject/14.py", line 117, in
supermarket.mainmenu()
File "C:/Users/heliun/PycharmProjects/pythonProject/14.py", line 86, in mainmenu
goods = Goods(id, name, price, num,allprice)
UnboundLocalError: local variable 'allprice' referenced before assignment
具体代码:class Goods:
def init(self,id,name,price,num):
self.id=id
self.name=name
self.price=price
self.num=num

class MySuperMarket:
def init(self,id,name):
self.id=id
self.name=name
self.allingoods=[]
self.alloutgoods=[]
self.allinvent={}

def ingoods(self, goods):
    dict = {}
    dict[goods.id] = goods
    self.allingoods.append(dict)
    if goods.id in self.allinvent.keys():
        object = self.allinvent[goods.id]
        object.price = (object.price * object.num + goods.price * goods.num) / (object.num + goods.num)
        object.num = object.num + goods.num
        self.allinvent[object.id] =object
        return 1
    inventgoods=Goods(goods.id,goods.name,goods.price,goods.num)
    self.allinvent[inventgoods.id] = inventgoods
def outgoods(self,goods):
    dict={}
    dict[goods.id]=goods
    self.alloutgoods.append(dict)
    if goods.id in self.allinvent.keys():

        if goods.num<=object.num:
            object.num=object.num-goods.num
            self.allinvent[object.id]=object
        else :
            print("库存数量不足!清重新输入")
            goods.num=int(input("请重新输入商品的数量:"))
            object.num = object.num - goods.num
def allinventlook(self,goods):
    if goods.id in self.allinvent.keys():
        self.allinvent[object.id] = object
def outlook(self,goods):
    if goods.id in self.allinvent.keys():
        self.allinvent[object.id] = object

def inlook(self, goods):
    if goods.id in self.allinvent.keys():
        self.allinvent[object.id] = object

def mainmenu(self):
    while True:
        print("*"*8+self.name+"*"*8)
        print("1. 购进      2. 销售")
        print("3. 查询      0. 退出")
        print("*"*22)
        sele=int(input("请输入您的选择(0:退出):"))
        if sele==0:
            for k in self.allingoods:
                for v in k.values():
                    print(v.name,v.price,v.num)
            for v in self.allinvent.values():
                print(v.name,v.price,v.num,sep="  ")
            print("谢谢使用...")
            return 1
        elif sele==1:
            id=input("请输入购进的商品ID:")
            name=input("请输入购进的商品名称:")
            price=float(input("请输入商品单价:"))
            num=float(input("请输入商品数量:"))
            goods = Goods(id,name, price,num)
            self.ingoods(goods)
        elif sele==2:
            id=input("请输入销售商品的ID:")
            name=input("请输入销售商品的名称:")
            num= int(input("请输入销售商品的数量:"))
            price= int(input("请输入销售商品的单价:"))
            for a in self.alloutgoods:
                for b in i.values():
                    if b.id == id:
                        allprice = b.price * b.num

            goods = Goods(id, name, price, num,allprice)
            self.outgoods(goods)
        elif sele==3:
            print("*" * 8 + "查找类型"  +  "*" * 8)
            print("A. 查找库存商品      B.查找销售商品      C.查找进货商品")
            print("*" * 22)
            choose =input("请输入您的选择(#:退出):")
            id = input("请输入需要查询的库存商品的ID:")
            if choose=="A":
                goods = Goods(id, name, price, num, allprice)
                for c in self.allinvent:
                    for d in d.values():
                        print("名称:d.name"+"单价:d.price"+"数量:d.num")
            elif choose == "B":
                goods = Goods(id, name, price, num, allprice)
                for e in self.allinvent:
                    for f in b.values():
                        print("名称:f.name" + "单价:f.price" + "数量:f.num"+"总价:f.allprice")
            elif choose == "C":
                goods = Goods(id, name, price, num)
                for c in self.allinvent:
                    for d in d.values():
                        print("名称:d.name" + "单价:d.price" + "数量:d.num")

#主模块
supermarket=MySuperMarket("001","道奇超市")
supermarket.mainmenu()

  • 写回答

3条回答 默认 最新

  • Kiloveyousmile 2022-06-21 02:50
    关注

    报错原因

    首先说一下报错原因,出现 local variable 'xxx' referenced before assignment出现错误,一般会有两个原因:
    情况一:变量没有被赋值直接引用了

    def hello():
        print(a)   # 没有给a赋值,不知道a是什么
    

    情况二:函数引用全局变量的时候没有声明
    在函数内,既包含对全局变量的引用,又包含对其的赋值,且赋值放在了引用之后,就会报错。

    money = 1000
    def work(m):
       # 引用
        h = money + m
        print("h的值为:" + str(h))
        # 赋值
        money = h
        print("内部money的值:" + str(money))
    
    work(200)
    

    项目报错的原因是情况一。你在elseif语句中对变量进行赋值,只有选择了该分支,才会出现变量被赋值的情况;如果没有选择该赋值,则变量没有被赋值,这样直接引用自然会报错了。例如

    # 当走分支 elif sele == 1 和 elif sele == 2时,id, name, num等变量都被赋值了,你使用下面的语句自然不会报错:
    goods = Goods(id, name, price, num)  # 引用
    
    # 当走分支 elif sele == 3时,没有对name, price, num, allprice等变量赋值, 这时候,如果直接走分支 if choose == "A" 就会立马报错了。
    

    代码

    # class,使用单数概念
    class Good:
        # allprice 默认参数,只有出售商品列表需要用到该属性
        def __init__(self, id, name, price, num, allprice=0.0):
            self.id = id
            self.name = name
            self.price = price
            self.num = num
            self.allprice = allprice
    
    
    class MySuperMarket:
        def __init__(self, id, name):
            self.id = id
            self.name = name
            self.allingoods = []  # list类型
            self.alloutgoods = []  # list 类型
            self.allinvent = {}  # dict类型
    
        # 进货
        def ingoods(self, good):
            # 添加商品到进货列表
            # 深拷贝,避免后续修改影响记录
            mgood = Good(good.id, good.name, good.price, good.num)
            self.allingoods.append(mgood)
            # 如果进货的商品有库存,修改库存信息
            if good.id in self.allinvent.keys():
                obj = self.allinvent[good.id]
                obj.price = (obj.price * obj.num + good.price * good.num) / (obj.num + good.num)
                obj.num = obj.num + good.num
                self.allinvent[obj.id] = obj
                return 1
            # 如果进货的商品无库存,直接添加到库存
            self.allinvent[good.id] = good
    
        # 销售
        def outgoods(self, good):
            # 出售商品,则添加商品到出售列表
            # 深拷贝,避免后续修改影响记录
            mgood = Good(good.id, good.name, good.price, good.num, good.allprice)
            self.alloutgoods.append(mgood)
            # 如果进货的商品有库存,且数量足够,则出售
            # 如果进货商品库存不足,则输出错误信息
            if good.id in self.allinvent.keys():
                obj = self.allinvent[good.id]
                if good.num <= obj.num:
                    obj.num = obj.num - good.num
                    self.allinvent[obj.id] = obj
                else:
                    print("库存数量不足!清重新输入")
                    good.num = int(input("请重新输入商品的数量:"))
                    obj.num = obj.num - good.num
    
        # 查找库存商品信息
        def allinventlook(self, goods):
            if goods.id in self.allinvent.keys():
                obj = self.allinvent[goods.id]
                print("名称:%s, 单价:%.2f, 数量:%d" % (obj.name, obj.price, obj.num))
                return
            print("查找的商品无库存")
    
        # 查找销售记录
        # 同一类商品可能存在多条销售记录,所以添加换行
        def outlook(self, good):
            # 增加一个变量,记录是否查找到记录
            isfound = False
            for obj in self.alloutgoods:
                if good.id == obj.id:
                    print("名称:%s, 单价:%.2f, 数量:%d 总价:%.2f"
                          % (obj.name, obj.price, obj.num, obj.allprice))
                    # 找到记录,赋值为True
                    isfound = True
    
            # 没有找到记录,则输出提示信息
            if not isfound:
                print("查找的商品无出售记录")
    
        # 查找进货记录
        # 同一类商品可能存在多条进货记录,所以添加换行
        def inlook(self, good):
            # 增加一个变量,记录是否查找到记录
            isfound = False
            for obj in self.allingoods:
                if obj.id == good.id:
                    print("名称:%s, 单价:%.2f, 数量:%d" % (obj.name, obj.price, obj.num))
                    # 找到记录,赋值为True
                    isfound = True
            if not isfound:
                print("查找的商品无进货记录")
    
        def mainmenu(self):
            global allprice
            while True:
                print("*" * 8 + self.name + "*" * 8)
                print("1. 购进      2. 销售")
                print("3. 查询      0. 退出")
                print("*" * 22)
                sele = int(input("请输入您的选择(0:退出):"))
                if sele == 0:
                    for v in self.allingoods:
                        print(v.name, v.price, v.num)
                    for v in self.allinvent.values():
                        print(v.name, v.price, v.num, sep="  ")
                    print("谢谢使用...")
                    return 1
                # 进货
                elif sele == 1:
                    id = input("请输入购进的商品ID:")
                    name = input("请输入购进的商品名称:")
                    price = float(input("请输入商品单价:"))
                    num = int(input("请输入商品数量:"))
                    goods = Good(id, name, price, num)
                    self.ingoods(goods)
                # 销售
                elif sele == 2:
                    id = input("请输入销售商品的ID:")
                    name = input("请输入销售商品的名称:")
                    num = int(input("请输入销售商品的数量:"))
                    price = float(input("请输入销售商品的单价:"))
                    allprice = 0
                    # 根据仓库的数据,计算总成本
                    for e in self.allinvent:
                        if e.id == id:
                            allprice = e.price * e.num
    
                    goods = Good(id, name, price, num, allprice)
                    self.outgoods(goods)
                # 擦找
                elif sele == 3:
                    print("*" * 8 + "查找类型" + "*" * 8)
                    print("A. 查找库存商品      B.查找销售商品      C.查找进货商品")
                    print("*" * 22)
                    choose = input("请输入您的选择(#:退出):")
                    id = input("请输入需要查询的库存商品的ID:")
                    if choose == "A":
                        goods = Good(id, "", 0, 0)
                        self.allinventlook(goods)
                    elif choose == "B":
                        goods = Good(id, "", 0, 0, 0)
                        self.outlook(goods)
                    elif choose == "C":
                        goods = Good(id, "", 0, 0)
                        self.inlook(goods)
    
    # 按间距中的绿色按钮以运行脚本。
    if __name__ == '__main__':
        supermarket = MySuperMarket("001", "道奇超市")
        supermarket.mainmenu()
    
    # 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助
    

    注释比较全了,如果有看不懂的,请提问。

    有用,请点个采纳吧

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月5日
  • 已采纳回答 6月27日
  • 赞助了问题酬金10元 6月21日
  • 创建了问题 6月20日

悬赏问题

  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测