2014-09-30 74 views
0

在Python 2.7中,我試圖讓用戶輸入一個名稱,它會搜索以查看該名稱是否在預定義字典中,然後如果是,則創建一個對象使用一個類並使用字典的值。這裏是我到目前爲止的代碼:raw_input,字典和類

import os 

weaponList = { 
'axe': {'Name': 'axe', 'Mass': 1500, 'Strike': 'Chop'}, 
'knife': {'Name': 'knife', 'Mass': 300, 'Strike': 'Cut'}, 
'club': {'Name': 'club', 'Mass': 2000, 'Strike': 'Blunt'}, 
'stone': {'Name': 'stone', 'Mass': 800, 'Strike': 'Blunt'}, 
} 

class meleeWeapon: 
    def __init__(self, name, mass, strike): 
     self.name = name 
     self.mass = mass 
     self.strike = strike 

def weaponask(): 
    wepn = raw_input("Use knife, club, axe, or stone?\n> ").lower() 
    if wepn in weaponList: 
     currentWeapon = meleeWeapon(wepn['Name'], wepn['Mass'], wepn['Strike']) 
     print "success" 
    else: 
     print "item not recognized" 
     weaponask() 
    #return wep 

weaponask() 

os.system('pause') 

然而,當我嘗試運行這段代碼,我得到以下錯誤:

Use knife, club, axe, thrown stone, slung stone, or firearm? 
> axe 
Traceback (most recent call last): 
    File "C:\Python\dict.py", line 30, in <module> 
    weaponask() 
    File "C:\Python\dict.py", line 23, in weaponask 
    currentWeapon = meleeWeapon(wepn['Name'], wepn['Mass'], wepn['Strike']) 
TypeError: string indices must be integers, not str 


Press any key to continue . . . 

任何想法,我做錯了嗎? TIA

+0

嘗試將'wepn ['Name']'更改爲'weponList ['Name']'? – fredtantini 2014-09-30 07:02:26

+0

'weaponList'對於不是列表的結構來說名字很差。而且,你可以將'meleeWeapon'實例直接放入字典中,而不是屬性的子元素。 – jonrsharpe 2014-09-30 07:15:37

回答

1

wepn是用戶輸入的字符串。你的情況可能是"knife", "club", "axe" or "stone"。您需要改用weaponList。例如,weaponList["Knife"]會給你{'Name': 'knife', 'Mass': 300, 'Strike': 'Cut'}

替換此:

currentWeapon = meleeWeapon(wepn['Name'], wepn['Mass'], wepn['Strike']) 

與此:

currentWeapon = meleeWeapon(weaponList[wepn]['Name'], weaponList[wepn]['Mass'], weaponList[wepn]['Strike']) 

UPDATE

你可以做的jonrsharpe的意見建議(看起來比較清爽呢!)

currentWeapon = meleeWeapon(**weaponList[wepn]) 
+2

或者,將字典直接解壓縮到類'currentWeapon = meleeWeapon(** weaponList [wepn])'中,或者將meleeWeapon'實例存儲在字典中。 – jonrsharpe 2014-09-30 07:13:33

+0

@jonrsharpe +1我們每天都會學到新的東西! :) – ComputerFellow 2014-09-30 07:17:45

+0

謝謝,這個伎倆! – honkeytohnk 2014-09-30 07:22:50

0

改變你的currentWeapon到:

currentWeapon = meleeWeapon(weaponList[wepn]['Name'],weaponList[wepn]['Mass'],weaponList[wepn]['Strike']) 

becouse wepn是weaponList的密鑰和用於訪問wepn的數據,因此你首先應該訪問wepn(weaponList [wepn])。