【问题标题】:Python NoneType error when attempting to access object functions尝试访问对象函数时出现 Python NoneType 错误
【发布时间】:2017-04-05 12:57:19
【问题描述】:

我正在尝试将玩家添加到 python 中的棋盘,但我正在为实现而苦苦挣扎。

当玩家通过operator 库启动时,玩家对象的属性得到验证。我想在异常发生时显示它们; IE。将每个玩家的启动放在一个 try-except 中。

问题是,当我按照下面的方式进行操作时,我收到一条错误消息:

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

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件“./main.py”,第 161 行,在 main() 文件“./main.py”,第 141 行,在 main move(choice, player) # 在播放器文件“./main.py”,第 91 行,在 move 中执行移动 再试一次!\n>>> ".format(err, r.initial[0], r.initial[1], r.initial[2])) AttributeError: 'NoneType' 对象没有属性 '初始'

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

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

所以基本上我就是这样做的:

  1. 启动板
  2. 在界外(或其他玩家)启动玩家
  3. 启动正确的玩家位置。
  4. 发生错误。

但是,如果我正确添加玩家(即第 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)

【问题讨论】:

标签: python oop


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多