gpt4 book ai didi

Python,namedtuple,扩展了基本零件库存系统

转载 作者:太空宇宙 更新时间:2023-11-03 21:21:38 27 4
gpt4 key购买 nike

我一直在使用这个基本代码来构建一个简单的库存系统。我需要扩展它以跟踪离开库存的另一个零件列表。我想我可以通过为数据结构创建另一个命名元组来做到这一点。我遇到一些问题,因为两个命名元组需要存在并同时访问。我怎样才能在Python中做到这一点?

import sys
from collections import namedtuple


class Part(namedtuple("Part", "name part_number quantity")):
def __str__(self):
return ", ".join(self)


class Parts(dict):
def display (self):
if not self:
print('No Parts Found in List')
return
print()
print('Name, Part Number, Quantity')
for part in self.values():
print(part)
print()

def add(self, *args):
try:
name, part_number, quantity = args
except ValueError:
name = input("Enter Name of Part:\n ")
part_number = input("Enter Part Number:\n ")
quantity = input("Enter Quantity:\n ")
self[name] = Part(name, part_number, quantity)

def remove(self, part=""):
if not part:
part = input("Enter Part Name to Remove\n")
try:
del self[part]
except Keyerror:
print("Part {} not found.".format(part))

def edit(self, part=""):
if not part:
part = input("Enter Part Name to Edit\n")
try:
new_name = input("Enter new part name\n")
number = input("Enter new part number\n ")
quantity = input("Enter new quantity\n ")
self[part] = Part(new_name, number, quantity)
except KeyError:
print("No such Part exists: {}".format(part))

def save(self, filename=""):
if not filename:
filename = input("Filename to save: ")
with open(filename, "wt") as out_file:
for part in self.values():
out_file.write("{}\n".format(part))
print("File saved")

def load(self, filename=""):
if not filename:
filename = input("Filename to load: ")
try:
with open(filename, "rt") as in_file:
for line in in_file:
if not line:
break
part, part_number, quantity = line.strip().split(",")
self.add(part, part_number, quantity)
except FileNotFoundError:
print("File Not Found.")


def menu(inventory):
menu_list = [("Parts", inventory.display),
("Add Part", inventory.add),
("Remove Part", inventory.remove),
("Edit Part", inventory.edit),
("Save Part List", inventory.save),
("Load Part List", inventory.load),
("Exit", sys.exit)]
while True:
for i, (name, _) in enumerate(menu_list, 1):
print("{}. {}".format(i, name))
try:
user = int(input("Selection> "))
menu_list[user-1][1]()
except (ValueError, IndexError):
print("Selection Not Valid.")

def main():
print("Welcome to Sticks&Stones Inventory System")
inventory = Parts()
while True:
menu(inventory)

if __name__ == '__main__':
try:
main()
except (KeyboardInterrupt, SystemExit):
print("Exiting Program...")`enter code here

`

最佳答案

您的两个元组(或更多)可以同时存在并被访问,没有问题!

class Parts(namedtuple("Parts", "name part_number quantity")):
def __str__(self):
return ", ".join(self)

class RemovedParts(namedtuple("RemovedParts", "name quantity")):
pass

# etc.

话虽如此,让我提出一些建议:

  1. 正如 @juanpa.arrivilillaga 已经建议的那样,您当前的 Parts 类不应扩展 dict。问问自己,“我的系统字典是因为它方便实现,还是我的系统是因为某些基本属性而有字典?”

    我想你会发现,在这种情况下,has-a/is-a 问题是一个很好的方法,可以看出你应该在设计中使用组合 (has-a) 而不是继承 (is-a) .

  2. 考虑将您的 Parts 类重命名为不同的名称。您正在建模的内容实际上包含有关零件的信息以及您手头有多少零件。也许 PartsInfo 甚至 Inventory 会是更好的类名。

  3. 考虑将实际管理对象与用户界面分开。也许您有一个 Inventory 对象和一个 InventoryUI 对象?将几乎所有与用户交互的功能移至 UI 类中。

  4. 编写一些辅助函数(方法)来执行诸如读取零件编号或零件名称并确认它们有效之类的操作。也许您需要一对字典,一个用于零件编号 -> 零件信息,另一个用于零件名称 -> 零件信息?

  5. 考虑使用 json 库序列化数据以进行加载/保存操作。

关于Python,namedtuple,扩展了基本零件库存系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54190578/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com