Python调用Queue的combine方法报缺少source2参数错误排查
问题排查与修正方案
核心报错原因
抛出TypeError: combine() missing 1 required positional argument: 'source2'是因为方法调用逻辑完全错误:
- 你定义的
combine是Queue类的实例方法,第一个参数self是绑定调用该方法的实例本身的隐式参数,不能当作独立全局函数直接传参调用。你写combine(s1, s2)时,Python会把s1赋值给self、s2赋值给source1,缺少source2对应的实参,直接触发参数缺失错误。 - 测试代码的导入逻辑错误:
combine不是独立函数,不应该从functions模块导入,按照方法注释的使用说明target.combine(source1, source2),这个方法必须定义在Queue类内部,通过目标队列实例调用。
隐藏逻辑错误
即使修正调用方式,你当前的combine实现也不符合需求:
你用list.pop()默认弹出列表尾部元素,这是栈的出栈逻辑,而队列是先进先出结构,直接pop()会反转源队列的元素顺序,无法满足“保留源值顺序”的要求。需要用pop(0)弹出列表索引为0的队首元素,才能保证顺序正确。
完整修正步骤
1. 调整combine方法位置与实现逻辑
把combine方法移到Queue_array.py的Queue类内部,修改出队逻辑:
def combine(self, source1, source2): """ ------------------------------------------------------- Combines two source queues into the current target queue. When finished, the contents of source1 and source2 are interlaced into target and source1 and source2 are empty. Order of source values is preserved. (iterative algorithm) Use: target.combine(source1, source2) ------------------------------------------------------- Parameters: source1 - an array-based queue (Queue) source2 - an array-based queue (Queue) Returns: None ------------------------------------------------------- """ while len(source1._values) > 0 and len(source2._values) > 0: self._values.append(source1._values.pop(0)) self._values.append(source2._values.pop(0)) while len(source1._values) > 0: self._values.append(source1._values.pop(0)) while len(source2._values) > 0: self._values.append(source2._values.pop(0)) return None
注:正规队列实现不建议直接操作
_values这类下划线开头的私有属性,建议给Queue类补充is_empty()判空方法、remove()出队方法来完成操作,如果作业要求允许直接访问内部属性可暂时按上述代码编写。
2. 修正测试代码
删除错误的导入语句,调整方法调用方式:combine是原地修改目标队列的方法,没有返回值,不需要把执行结果赋值给target。修正后代码如下:
from Queue_array import Queue data1 = [1, 2, 3] data2 = [4, 5, 6] s1 = Queue() s2 = Queue() target = Queue() # 入队使用Queue自带的insert方法,不要直接操作内部_values for v in data1: s1.insert(v) for w in data2: s2.insert(w) # 通过目标队列实例调用combine方法 target.combine(s1, s2) # 遍历输出合并结果 for i in target._values: print(i)
执行后输出结果为交错排列的顺序:
1 4 2 5 3 6
此时s1和s2的内部_values为空列表,完全符合方法设计要求。
内容的提问来源于stack exchange,提问作者st XA
相关产品推荐
相关产品推荐

