Valid position in array相关代码如何在索引越界时返回False
棋盘位置合法性校验修复方案
问题原因
原代码没有对入参pos的索引范围做前置校验,直接使用pos[0]、pos[1]访问numbers、letters列表,当索引值超出列表长度范围时,会直接抛出IndexError异常,无法返回预期的布尔值。
修改思路
- 增加入参前置校验:先确认
pos为长度为2的序列,且两个索引值都落在[0, n)的合法区间内,不满足条件直接返回False - 对后续逻辑增加异常捕获兜底,处理其他可能的格式错误,出现异常时统一返回False
修改后代码
def extract_pos(n, str_pos): # 补充extract_pos自身的边界校验,避免非法字符报错 letters = [chr(x + ord('a')) for x in range(n)] numbers = [str(x) for x in range(1, n + 1)] numbers.reverse() if len(str_pos) < 2 or str_pos[0] not in letters or str_pos[1:] not in numbers: return None res = (numbers.index(str_pos[1:]), letters.index(str_pos[0])) return res def is_in_board(n, pos): # 前置校验:过滤索引越界的非法输入 if not (isinstance(pos, (tuple, list)) and len(pos) == 2): return False row, col = pos if row < 0 or row >= n or col < 0 or col >= n: return False # 异常兜底,处理其他意外情况 try: letters = [chr(x + ord('a')) for x in range(n)] numbers = [str(x) for x in range(1, n + 1)] numbers.reverse() pos_str = ''.join([letters[col], numbers[row]]) return extract_pos(n, pos_str) is not None except Exception: return False
效果说明
前置校验环节会直接拦截所有索引越界的输入,不会执行后续的列表元素访问操作,从根源避免越界异常。额外增加的异常捕获逻辑可以兜底处理其他未预见的输入问题,保证函数始终返回布尔类型的结果。
内容的提问来源于stack exchange,提问作者john200
相关产品推荐
相关产品推荐

