Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在dict库存中搜索项目时出现关键错误_Python_Class_Dictionary - Fatal编程技术网

Python 在dict库存中搜索项目时出现关键错误

Python 在dict库存中搜索项目时出现关键错误,python,class,dictionary,Python,Class,Dictionary,在过去的几个月里,我一直在尝试创建一个基于文本的Zork风格的游戏,作为一个自学Python的项目 感谢stackoverflow这里的优秀员工和大量youtube视频,我取得了不错的进步。我目前处理的问题是代码的底部,在Bag类中。 正如你们将在我的bag类中看到的,我有一个名为Take的方法。此方法最初不在bag类中,而是在底部读取用户命令的部分中 class Bag: def __init__(self, inventory): self.inventory =

在过去的几个月里,我一直在尝试创建一个基于文本的Zork风格的游戏,作为一个自学Python的项目

感谢stackoverflow这里的优秀员工和大量youtube视频,我取得了不错的进步。我目前处理的问题是代码的底部,在Bag类中。 正如你们将在我的bag类中看到的,我有一个名为Take的方法。此方法最初不在bag类中,而是在底部读取用户命令的部分中

class Bag:

    def __init__(self, inventory):
        self.inventory = inventory

    def addToInventory(self, item):
        for key in list(Location.room.roominv.keys()):
            self.inventory.append(Location.room.roominv[key])
            del Location.room.roominv[key]

    def SearchRoom(self):
        if Location.room.roominv:
            for item in list(Location.room.roominv.keys()):
                print("you find a", item)
        else:
            print("You don't find anything")

    def NoneHere(self, command):
        print("You can't find a", command)

    def Take(self, command):
        for key in list(Location.room.roominv.keys()):
            if Location.room.roominv[key].name == command.split()[1]:
                bag.addToInventory(key)
                print('you take the', key)

    def CheckTake(self):
        if Location.room.roominv and command.split()[1] in Location.room.roominv:
            self.Take(command)
        else:
            self.NoneHere(command.split()[1])

    def CheckInv(self):
        for item in list(bag.inventory):
            print("Your bag contains:", item.name)


player = Player("Jeff", 100)
bag = Bag([])
Location = Location('introd')

command = '  '
while command != "":
    command = input('>>> ')
    if command in Location.room.exits:
        Location.travel(command)
    elif command == 'look':
        Location.RoomDesc()
    elif command == '':
        print('You have to say what it is you want to do!')
        command = '#'
    elif command == 'search':
        bag.SearchRoom()
    elif command.split()[0] == 'Take':
        bag.CheckTake()
    elif command == 'Inventory':
        bag.CheckInv()
    else:
        print('Invalid command')
我被建议将用户命令的逻辑与游戏的其他部分分开,因此我将其移动到指定的类中

然而,在我这么做之前,游戏只从房间清单中挑选特定的物品是没有问题的。现在它把所有的东西都捡起来了

(定义每个房间的代码将张贴在底部,我一直在从一个单独的.py文件导入它)

目前,只有一个房间包含多个项目。“小屋内部”房间,里面有“华丽的钥匙”和“刀”

奇怪的是。如果我试着拿那把华丽的钥匙,它会很好地把它捡起来(不过也会把刀捡起来)

然而,如果我试图拿刀,我会收到一个错误的回溯

Traceback (most recent call last):
  File "C:/Users/Daniel/Python 3.6/Scripts/PythonPR/Flubbo'sModuleTest.py", line 156, in <module>
    bag.CheckTake()
  File "C:/Users/Daniel/Python 3.6/Scripts/PythonPR/Flubbo'sModuleTest.py", line 130, in CheckTake
    self.Take(command)
  File "C:/Users/Daniel/Python 3.6/Scripts/PythonPR/Flubbo'sModuleTest.py", line 122, in Take
    if Location.room.roominv[key].name == command.split()[1]:
KeyError: 'Ornate_Key'

您为什么在
包中有
Take
方法?这似乎是完全多余的,考虑到所有你想做的就是添加该项目,如果它存在于字典中。试试这个:

def CheckTake(self):
    key = command.split()[1]
    if Location.room.roominv and key in Location.room.roominv:
        bag.addToInventory(key)
        print('you take the', key)
    else:
        self.NoneHere(key)

而且,您的代码不一致。在某些地方,您可以直接访问全局变量,而在其他地方,您可以冗余地将全局变量传递给函数。我强烈建议你把这件事带到办公室,一旦你把它做好,你就要行动起来

对不起,这太长了。你能把它归结为一个简单的例子来说明这个问题吗?例如,这是一个基于Zork的游戏,这一事实与python类的功能无关。此外,如果您正在尝试python中的新构造,那么在应用于您的问题之前,将更容易对基本功能进行原型化。如果你的方法存在根本性的缺陷,但在你意识到它不起作用之前,它贯穿了你的整个项目,那么需要修复/撤销的东西太多了。我现在将尝试对它进行长时间的编辑。至于基本功能的原型设计,正如我所说,这在我的代码的早期版本中是可行的。我不知道为什么这个功能现在已经改变了,因为它包含在一个类中。实际上,我在CodeReview中发布了这段代码的早期版本,并被建议进一步拆分我的函数,我可能有点过火了。还有,谢谢!我知道它是多余的,但不知道如何摆脱它。key=command.split()[1]是答案。你能举一个例子,我有时直接访问全局变量,而其他人则将其传递给函数吗?“我真的是在白手起家地自学,而这类事情正是我被绊倒的地方。”薛定谔说,“是的。”。你肯定有代码的味道。没有什么不可出售的,但您的代码可能会使用一些TLC。。。那是肯定的。不管怎样,你可以试试这个。如果有效,请随意^vote/mark accepted。@Schrodinger的stat例如
CheckTake
command
视为全局命令,但
Take
将其作为参数接收。解决了问题!从我的addToInventory函数中删除了“输入列表(Location.room.roominv.keys()):”。现在开始代码审查,以澄清类似的进一步问题。@Schrodinger的陈述,一切顺利。
def CheckTake(self):
    key = command.split()[1]
    if Location.room.roominv and key in Location.room.roominv:
        bag.addToInventory(key)
        print('you take the', key)
    else:
        self.NoneHere(key)