艰苦地学习Python示例43

艰苦地学习Python示例43,python,Python,我正在努力学习Zed Shaw的《每件事》,我被难住了 我得到了一个错误: [属性错误:'NoneType'对象没有属性'enter'] 在以下行:next_scene_name=current_scene.enter在Engine类下输入 之所以会发生这种情况,是因为当前_场景是无的,所以当您尝试enter函数时,它会给出该错误 一种方法是提供一个if语句: while current_scene != last_scene: if current_scene != None:

我正在努力学习Zed Shaw的《每件事》,我被难住了

我得到了一个错误:

[属性错误:'NoneType'对象没有属性'enter']

在以下行:next_scene_name=current_scene.enter在Engine类下输入

之所以会发生这种情况,是因为当前_场景是无的,所以当您尝试enter函数时,它会给出该错误

一种方法是提供一个if语句:

while current_scene != last_scene:
    if current_scene != None:
        next_scene_name = current_scene.enter()
        current_scene = self.scene_map.next_scene(next_scene_name)
    else:
        break 

问题是,当前的场景实际上没有。这是由调用self.scene\u map.next\u scene调用dict.get引起的。使用dict.get的问题是,如果该键不在字典中,那么它只会返回None,而不会像您预期的那样抛出异常。因此,您的程序继续运行,认为一切正常,直到代码中出现问题。

似乎您的代码不完整

出现此问题的原因是,第一次,您当前的\u场景具有一个值,该值为空的\u场景,然后您尝试调用current\u scene.enter以获取下一个场景,但EmptyScene类的enter方法没有返回任何内容,因此您没有返回任何内容,然后您将当前的\u场景更改为下一个\u场景,即无,然后再次尝试在其中调用enter函数,从而导致问题

您可以将while条件更改为-

while current_scene != last_scene and current_scene is not None:
    next_scene_name = current_scene.enter()
    current_scene = self.scene_map.next_scene(next_scene_name)
如果您希望finished成为empty_scene之后的下一个场景,那么需要将EmptyScene类更改为返回finished,而不是传递函数。范例-

class EmptyScene(Scene):

    def enter(self):
        return 'finished'

@dimo414的可能重复我不同意,从最初的标题来看,它似乎是重复的,但问题比您建议的问题更广泛。如果“finished”是它搜索的下一个键,为什么它会返回none?它应该返回下一个场景,对吗?@StevenMyers不,你看错线了。在while循环体中调用函数时会发生错误。因为它搜索的键是当前_scene.enter返回的值。但请注意,如果函数没有返回值,比如以pass结尾的函数将返回None。所以它用None作为查找的键。啊,我发现我做错了什么,我明白你现在说的话。如果我在场景结束时执行某些操作,例如返回已完成或返回空的场景,这将起作用
class EmptyScene(Scene):

    def enter(self):
        return 'finished'