2017-04-18 5 views
0

현재 사용자가 적합하다고 생각하는 사전을 업데이트 할 수있는 인벤토리 시스템을 만들고 있습니다. 나는 그것이 내가 나를 위해 사전을 저장하는 것처럼 보였기 때문에 내가 피클을 사용할 것이라고 생각했다. 유일한 문제는 지금 내가 목록을 참조 할 때마다이며, 목록에 다른 항목을 추가하기 위해 돌아가서 목록에있는 항목을 지 웁니다.파이썬 내 피클 문제

import pickle 
#creates a dictonary 
Inventory = {} 
product_add = "" 
Key = "Key \n+ changes stock, \ni or I shows inventory" 

print(Key) 

def main(): 
    choice = input("What do you want to do today? ") 

    if choice == "+": 
     Change() 
    else: 
     inv() 

def Change(): 
    product = input("What product do you want to add/change? ") 
    value = input("How much of it? ") 

    Inventory.update({product: value})#places into dictonary 
    pickle.dump(Inventory, open("save.p", "wb")) 

    continu = input("Would you like to enter any more products into inventory? y/n ") 

    if continu == "y" or continu == "Y":#allows them to either continue to update inventory or move on 
     Change() 

    else: 
     inv() 

def inv():#prints inventory 
    print() 
    print() 
    print() 
    Inventory = pickle.load(open("save.p", "rb")) 
    for key,val in sorted(Inventory.items()):#prints the dictonary in a column alphabetized 
     print(key, "=>", val) 
    print() 
    print() 
    print() 
    print(Key) 

    Pass = input("What would you like to do? ") 

    if Pass == "+":#keeps the program going, and allows them to change the dictonary later 
     Change() 

    else: 
     main() 

main() 
+0

기대하고있는 행동과 관찰하고있는 행동을 정확히 설명해 주시겠습니까? (나는 그걸 가지고 조금 놀았고 내가 테스트 한 것에 대해서는 잘 작동했다) –

+1

사전에 고유 키를 추가했는지 확인한다. 파이썬 사전의 항목은 키로 참조됩니다. 항목은 기본적으로 키 - 값 쌍입니다. 키는 사전에서 항상 고유합니다. 이미 존재하는 키를 추가하려고하면 파이썬이 불평하지 않을 것입니다. 그냥 무시할 것입니다. 프로그램의 한계는 값 집합 (즉, 특정 제품의 여러 인스턴스)을 처리 할 수 ​​없다는 것입니다. –

+0

또한 파이썬에서는 함수와 변수 이름을 소문자로 쓰고 싶을 것이다. –

답변

3

프로그램이 시작될 때마다, 당신은 당신이 이전에 저장된 목록을로드 할 빈 Inventory

Inventory = {} 

로 만들 수 있습니다. 아무도 이미없는 경우에만 비어있는 새 것을 만들 수 있습니다.

당신은 그런 식으로 그것을 할 수 :

try: 
    Inventory = pickle.load(open("save.p", "rb")) 
except FileNotFoundError: 
    Inventory = {} 

코드에서 몇 가지 다른 문제가 있습니다.

하나는 함수가 서로를 재귀 적으로 호출하여 프로그램을 1000 회 이상 호출 한 후 충돌이 발생하여 논리가 복잡해집니다.
메뉴를 관리하는 main()에 루프가 있어야하며 완료되었을 때 돌아올 수있는 inv 또는 변경 기능이 호출되어야합니다.

+0

저는 아직 프로그래밍을 처음 접했습니다. 나는 당신이 의미하는 것을 혼란스러워합니다. – Linkstus