生成完全图的代码单元测试失败但输出正确,遇TypeError异常求助
嘿,结合你说的情况——单元测试炸错但手动调n=2完全正常,而且问题出在和内置permutations替代函数相关的高亮行,我几乎能肯定是你自己写的permutations函数在某些边界输入下(比如单元测试可能测了n=0或者n=1的情况)返回了单个整数,而不是可迭代的序列,导致后续遍历的时候直接报错。
举个例子,假设你的permutations函数写了类似这样的错误逻辑:
def permutations(items): if len(items) == 1: return items[0] # 这里直接返回了int,不是可迭代对象! # 其他处理多元素的逻辑...
当处理n=1的完全图时,permutations([0])会返回0这个整数,后续你要是写for u, v in permutations(...):,Python就会尝试去遍历一个int,自然就抛出TypeError了。而你测n=2的时候,permutations返回的是像[(0,1), (1,0)]这样的可迭代对儿,所以完全没问题。
怎么修复?
核心就是让你自己实现的permutations函数无论什么输入,都返回可迭代对象。比如把上面的错误行改成下面任意一种:
def permutations(items): if len(items) == 1: yield (items[0],) # 返回生成器,里面是单元素元组 # 或者直接返回列表:return [(items[0],)] # 其他逻辑保持不变
为啥手动测n=2没事?
因为n=2时,你的permutations函数返回的是正常的可迭代序列,遍历的时候不会出问题;但单元测试大概率覆盖了n=0或者n=1的场景,这时候你的permutations函数返回了单个int,直接触发了错误。
快速验证的方法:
你手动跑一下make_complete_graph(1)或者make_complete_graph(0),这时候肯定会复现同样的TypeError,一下子就能确认问题根源了。
另外再检查下你的高亮行代码,比如如果是类似for pair in permutations(range(n)):这样的逻辑,那问题100%出在permutations的返回值上,一定要确保它返回的是每个元素都是可解包的对儿的可迭代对象,绝对不能是单个int。
内容的提问来源于stack exchange,提问作者Ryan

