Python 原始输入、字典和类

Python 原始输入、字典和类,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,在Python2.7中,我尝试这样做:当用户输入一个名称时,它搜索该名称是否在预定义的字典中,如果在预定义的字典中,它使用类和字典的值创建一个对象。以下是我目前的代码: import os weaponList = { 'axe': {'Name': 'axe', 'Mass': 1500, 'Strike': 'Chop'}, 'knife': {'Name': 'knife', 'Mass': 300, 'Strike': 'Cut'}, 'club': {'Name': 'club',

在Python2.7中,我尝试这样做:当用户输入一个名称时,它搜索该名称是否在预定义的字典中,如果在预定义的字典中,它使用类和字典的值创建一个对象。以下是我目前的代码:

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 . . .
使用刀、棍棒、斧头、扔石、吊石或火器?
>斧头
回溯(最近一次呼叫最后一次):
文件“C:\Python\dict.py”,第30行,在
武器任务
文件“C:\Python\dict.py”,第23行,在武器任务中
当前武器=近战武器(wepn['Name'],wepn['Mass'],wepn['Strike']))
TypeError:字符串索引必须是整数,而不是str
按任意键继续。

知道我做错了什么吗?TIA是用户输入的字符串。在您的情况下,可能是“刀”、“棍棒”、“斧头”或“石头”。您需要使用
武器列表

例如,
weaponList[“刀”]
会给你
{'Name':'刀子','Mass':300,'Strike':'Cut'}

替换此项:

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

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

你可以按照jonrsharpe在评论中的建议去做(看起来也更干净!)


将当前武器更改为:

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

因为wepn是武器列表的关键,也是访问wepn数据的关键,所以首先你应该访问wepn(武器列表[wepn])。

尝试将
wepn['Name']
更改为
weponList['Name']
武器列表对于不是列表的结构来说是一个糟糕的名称。此外,您可以将
meleebreal
实例直接放入字典,而不是属性的子字典。或者,将字典直接解压缩到类
currentbreal=meleebreal(**wepn])
,或者只将
meleebreal
实例存储在字典中。
currentWeapon = meleeWeapon(weaponList[wepn]['Name'],weaponList[wepn]['Mass'],weaponList[wepn]['Strike'])