当 doctest 报错 “got nothing”,意味着被测函数未产生任何可显示的输出(如返回值为 none 或未显式打印),而预期却有明确输出(如 private: 80),导致断言失败。
当 doctest 报错 “got nothing”,意味着被测函数未产生任何可显示的输出(如返回值为 none 或未显式打印),而预期却有明确输出(如 private: 80),导致断言失败。
在你的 best_apartment 方法中,doctest 期望看到类似 PRIVATE: 80 的输出,但实际运行后却提示 Expected: PRIVATE: 80\nGot nothing —— 这并非表示程序崩溃或静默退出,而是 Python 交互式环境(以及 doctest)默认不显示 None 的返回值。
例如:
>>> def f(): return None >>> f() # 无任何输出 >>> >>> def g(): return "hello" >>> g() 'hello'
你的方法当前存在两个关键问题:
-
类型签名与行为矛盾:函数声明为 -> None,但 docstring 却要求“Return (one of) the apartment(s)...”,且 doctest 明确期望返回字符串(如 PRIVATE: 80)。这会导致类型检查工具(如 mypy)警告,更重要的是,doctest 会严格比对 print() 输出或表达式求值结果 —— 而 None 不会被打印。
-
空树逻辑未匹配预期:当 self.is_empty() 为真时,你 return None,但 doctest 示例中 bst 是通过 build_tree(apartments) 构建的(含 300 个公寓),理论上不应为空;然而若 build_tree 实现有缺陷(如未正确插入节点、根节点为 None),或 is_empty() 判断逻辑错误(如未覆盖边界情况),就可能意外触发 return None,最终导致 “Got nothing”。
✅ 正确修复方式如下:
- 修正返回类型与实现一致性:将签名改为 -> Optional[str](需 from typing import Optional),并确保所有路径都返回有效字符串或明确处理空树;
- 避免依赖 None 的隐式不输出行为:doctest 中的 >>> bst.best_apartment() 行测试的是表达式求值结果,不是 print() 输出。因此必须 return 预期字符串(如 f"{self.apartment.type}: {self.apartment.score}"),而非调用 print()(后者虽有输出,但返回值仍是 None,仍报 “Got nothing”);
- 增强健壮性:即使非空树,也要防止 current_node.apartment 为 None(例如节点初始化不完整)。
改进后的参考实现:
from typing import Optional
def best_apartment(self) -> Optional[str]:
"""Return (one of) the apartment(s) with the best evaluation
score in the BSTTree.
>>> apartments = read_apartment_data("apartments.csv")[0:300]
>>> bst = BSTTree()
>>> bst.build_tree(apartments)
>>> bst.best_apartment()
'PRIVATE: 80'
"""
if self.is_empty():
return None # 或 raise ValueError("Cannot find best apartment in empty tree")
current_node = self
while current_node.right is not None:
current_node = current_node.right
# 确保 apartment 属性存在且格式合法
if not hasattr(current_node, 'apartment') or current_node.apartment is None:
return None
return f"{current_node.apartment.type}: {current_node.apartment.score}"
? 调试建议:
- 在 doctest 失败时,直接在 Python 交互式终端中逐行执行示例代码,观察真实返回值:
>>> bst.best_apartment() # 查看是否真返回 None >>> type(bst.best_apartment())
- 检查 BSTTree.build_tree() 和 is_empty() 实现,确认树结构正确构建;
- 使用 # doctest: +ELLIPSIS 或 # doctest: +NORMALIZE_WHITESPACE 等指令处理不确定输出(非本例所需,但值得了解)。
总之,“Got nothing” 是 doctest 的精准提示:它没收到任何可比对的返回值。解决核心在于让函数稳定返回预期类型的非 None 值,并保持文档、签名与实现三者一致。
就爱读