调用squareUnderAttack函数触发位置参数错误:传入3个参数仅接受2个
王车易位校验函数的参数错误排查
问题场景
我正在编写国际象棋王车易位的校验逻辑,目标是检查王车易位的条件是否被违反(比如王处于将军状态,或移动路径中的格子被攻击),若违反则移除对应的走法。其中self.squareUnderAttack方法应该接受两个数值参数。
代码片段
if move.moveType == MoveType.Castling: # 后翼易位 if move.initialCol > move.endCol: # 检查王所在格、移动路径中的所有格子是否被攻击 if any(self.squareUnderAttack(move.initialRow,i) for i in range(move.endCol,move.initialCol+1)): moves.remove(move) else: # 王翼易位 if any(self.squareUnderAttack(move.initialRow,i) for i in range(move.initialCol,move.endCol+1)): moves.remove(move)
触发的错误
TypeError: GameState.squareUnderAttack() takes 2 positional arguments but 3 were given
我可以通过多次单独调用函数并用or连接的方式实现需求,但想搞清楚当前代码失效的原因。
错误原因分析
这个错误的核心是你对squareUnderAttack方法的参数定义和调用方式不匹配,具体分三种常见情况:
情况1:实例方法参数定义少一个
如果squareUnderAttack是GameState类的实例方法,Python会自动把self作为第一个参数传入。假设方法定义是这样的:
def squareUnderAttack(self, col): # 仅接收self和列参数col
那你调用self.squareUnderAttack(move.initialRow, i)时,实际传入的参数是self、move.initialRow、i,总共3个,但方法只定义了2个参数,自然触发错误。
情况2:普通函数误用实例调用
如果squareUnderAttack是独立的普通函数(不属于GameState类),定义如下:
def squareUnderAttack(row, col): # 接收行和列两个参数
但你用self.squareUnderAttack(...)调用时,Python会把self当成第一个参数传入,加上你传的move.initialRow和i,总共3个参数,而函数只接受2个,导致报错。
情况3:方法需要元组而非独立参数
如果squareUnderAttack的定义是接收一个包含行和列的元组,比如:
def squareUnderAttack(self, position): # position是(row, col)元组
那你传入两个独立参数move.initialRow和i,加上self就变成了3个参数,同样会触发错误。
修正方向
- 核对方法定义:找到
GameState类中squareUnderAttack的代码,确认参数数量和类型:- 如果是实例方法且需要行、列两个参数,确保定义是
def squareUnderAttack(self, row, col):,此时你的调用代码是正确的,错误可能来自其他地方。 - 如果是实例方法但只需要列参数,修改调用逻辑只传入列参数,或者修改方法定义增加行参数。
- 如果是普通函数,调用时去掉
self.,直接用squareUnderAttack(move.initialRow, i)。 - 如果需要传入元组,修改调用为
self.squareUnderAttack( (move.initialRow, i) )。
- 如果是实例方法且需要行、列两个参数,确保定义是
内容的提问来源于stack exchange,提问作者RandomUser57
相关产品推荐
相关产品推荐

