2016-02-15 2 views
0

В приведенном ниже коде я пытаюсь проверить, является ли значение (b) ключом в kwargs, а если да, то остальное.Использование kwargs in while loop - Python 3

def shop(**kwargs): 
    buy = 1 
    print ("Welcome to the shop!") 
    for i, v in kwargs.items(): 
     print (" ", i, ": ", v) 
    while buy == 1: 
     b = input ("What would you like to buy? ").lower() 
     if b == i.lower(): 
      if v <= Player.gold: 
       Player.gold -= v 
       Player.inv_plus(i) 
       print ("You bought ", i, "for ", v, "gold!") 
       print ("Your gold: ", Player.gold) 
       print (Player.show_inv()) 
       print() 
      else: 
       print ("You don't have enough gold!") 
       print() 
     elif b == "exit": 
      buy = 0 
     else: 
      print ("We don't sell that item!") 
      print() 

shop(Stone=5, Potion=10) 

Однако, когда я пытаюсь запустить код, он всегда позволяет использовать только один вариант. Я нахожу, что трудно объяснить, так что я приведу пример:

Welcome to the shop! 
    Stone : 5 
    Potion : 10 
What would you like to buy? stone 
We don't sell that item! 

What would you like to buy? potion 
You bought Potion for 10 gold! 
Your gold: 0 
Inventory: 
    Potion 6 
    Stone 2 

Он не приемлет камень, даже если он находится в словаре, однако, он будет принимать микстуру. В других случаях это будет наоборот.

Сначала я подумал, что это было из-за цикла, но теперь я не уверен, и я не могу найти ничего, что могло бы помочь мне в этом где-нибудь еще.

Извините, если это довольно специфично, но это дает мне немного неприятностей.

ответ

4

Когда цикл по всем элементам для их печати:

for i, v in kwargs.items(): 
    print (" ", i, ": ", v) 

переменная i заканчивает проведение имя последнего элемента в kwargs. Вот почему он работает для «зелья», но не для «камня».

Как ответил Мохаммед, вам необходимо проверить все предметы в kwargs, а не только на последний.

+0

«' i' переменной заканчивается, содержащее имя последнего элемента в kwargs»- где то, что в конечном итоге приходит последний совершенно произвольно и не обязательно связаны с порядком аргументов в вызове, алфавитном порядке или каким-либо согласным каким-либо образом. – user2357112

0

Это может быть лучше вынесено в try..except пункт:

def shop(**kwargs): 
    buy = 1 
    print ("Welcome to the shop!") 
    for i, v in kwargs.items(): 
     print (" ", i, ": ", v) 
    while True: 
     b = input ("What would you like to buy? ").lower() 
     if b == 'exit': 
      break 
     try: 
      v = kwargs[b.capitalize()] 
     except KeyError: 
      print ("We don't sell that item!") 
      print() 
      continue 
     if v <= Player.gold: 
      Player.gold -= v 
      Player.inv_plus(i) 
      print ("You bought ", b, "for ", v, "gold!") 
      print ("Your gold: ", Player.gold) 
      print (Player.show_inv()) 
      print() 
     else: 
      print ("You don't have enough gold!") 
      print() 
+0

Я пробовал это, но это не сработало. Я не понимаю, почему вы делаете v = kwargs [b.capitalize()]? Разве это не изменит v на b? В любом случае вы получаете KeyError каждый раз. – JoeGeC

+0

Эта строка превращает нижний регистр 'b', например. «камень» в возможный ключ для словаря «kwargs», т. е. «камень». Если ключи не такие, вам может понадобиться другое преобразование. – xnx