断言Menu类实例的str方法返回空字符串触发AssertionError原因求解
报错原因分析
- 方法调用逻辑错误:Python中用于自定义实例转字符串逻辑的魔术方法是
__str__,调用时要么使用str(实例对象)的标准写法,要么显式调用实例.__str__()。你代码中写的menu.str()是调用名为str的普通实例方法,你贴出的代码中并没有定义该方法,即使你的Menu类继承了Node类,也匹配不到对应方法。 __str__方法缺少空返回分支:你当前的__str__实现仅在self.a_list存在真值元素时才会返回字符串,其余所有场景(self.a_list为空、所有元素都为假值)都不会走到return分支,Python方法无显式返回时默认返回None,None和空字符串""比较结果为假,自然触发AssertionError。- 代码存在多处基础语法/属性错误:
__init__方法中self.counter = counter的右值counter未提前定义,运行直接抛出NameError__str__中遍历的self.a_list属性不存在,你在__init__中定义的列表属性是self.my_list,运行会抛出AttributeError- 方法中的
print()仅做控制台输出,不会作为方法返回值,无实际作用。
修复方案
首先修复Node类的逻辑:
class Node: def __init__(self): # 移除未定义的counter赋值,按需可后续自行补充定义 self.my_list = [] def __str__(self): # 先筛选有效元素,无有效元素时直接返回空字符串 valid_elements = [element for element in self.my_list if element] if not valid_elements: return "" return "\n".join(f"{counter}. {element}" for counter, element in enumerate(valid_elements, 1))
再修改断言的调用写法(同时确保你的Menu类继承了修复后的Node类):
menu = Menu() assert str(menu) == ""
内容的提问来源于stack exchange,提问作者TreeTree
相关产品推荐
相关产品推荐

