尝试访问对象函数时出现Python NoneType错误

时间:2017-04-05 12:57:20

标签: python oop

我正在尝试将一个玩家添加到python中的棋盘上,但我正在努力实现这个目标。

当通过operator库启动播放器时,播放器对象的属性得到验证。我想在出现异常时展示它们;即。把每个玩家的启动放在一个尝试 - 除外。

问题在于,当我这样做时,我发出错误说:

  

回溯(最近一次调用最后一次):文件“./main.py”,第88行,中   移动       r.forward()AttributeError:'NoneType'对象没有属性'forward'

     

在处理上述异常期间,发生了另一个异常:

     

回溯(最近一次呼叫最后一次):文件“./main.py”,第161行,在          main()文件“./main.py”,第141行,在main中       移动(选择,玩家)#在移动中执行播放器文件“./main.py”,第91行上的移动       再试一次!\ n>>> “.format(err,r.initial [0],r.initial [1],r.initial [2]))AttributeError:'NoneType'对象没有属性   '初始'

上面提到的操作是由玩家类(player.py)处理的动作。很明显,我以某种方式返回一个NoneType,但我不确定为什么会这样。

当我在启动期间输入错误的玩家位置然后添加正确的玩家位置时会发生这种情况。

基本上这就是我的工作:

  1. 启动董事会
  2. 在界外(或在其他玩家身上)发起一名球员
  3. 启动正确的玩家位置。
  4. 发生错误。
  5. 但是,如果我正确添加玩家(即步骤3没有发生),则没有错误。

    def add_player(board):
    
        try:
            choice = input("Please enter the current player's initial position.\nRemember to keep inside board's limits!\n>>> ").split()
            if len(choice) == 3 and validate_player(choice[0], choice[1], choice[2]): # Check the length of supplied input and check type-integrity
    
                return Player(int(choice[0]), int(choice[1]), choice[2], board)       # Initiate a player with the supplied input. Each player is assigned to a Board (many-to-one relation).
    
        except Exception as err:
            print(err)
            add_player(board)
    

1 个答案:

答案 0 :(得分:1)

这里有几个可能的问题。首先,如果if语句的计算结果为True,则不会从函数返回任何内容。不会引发异常,因此不会输入except块,但也不会返回任何其他内容;当没有返回任何其他内容时,None是默认返回值。

其次,即使存在异常,也不会将结果从递归调用返回到except块中的add_player。但是你不应该在这里使用递归,你应该循环直到输入正确的值。

不相关,但你永远不应该捕获基础异常;你应该只捕获你可能期望的东西,在这种情况下是ValueError(来自int调用,如果输入了一个数字以外的东西)和IndexError(从索引到列表,如果少于三个项目)进入)。仅捕获这些例外。