如何理解 doctest 中的 “Got nothing” 错误及其修复方法

2026-06-03 231505 日常编程

doctest 报错 “got nothing” 表示函数实际未产生任何可显示的输出(如返回 none 或无 print),但测试用例却期望看到具体值(如 'private: 80'),本质是返回值与预期不匹配。

doctest 报错 “got nothing” 表示函数实际未产生任何可显示的输出(如返回 none 或无 print),但测试用例却期望看到具体值(如 'private: 80'),本质是返回值与预期不匹配。

在你的 best_apartment 方法中,doctest 明确期望输出字符串 PRIVATE: 80(注意:这是打印效果或返回值的字符串表示),但当前实现存在两个关键问题:

  1. 函数声明为 -> None,却试图返回 current_node.apartment
    类型提示与实际行为矛盾:标注返回 None,但代码末尾有 return current_node.apartment。若 current_node.apartment 是一个对象(如 Apartment 实例),其 __str__ 或 __repr__ 方法需返回类似 'PRIVATE: 80' 的字符串;否则 doctest 将无法匹配。

  2. 空树分支返回 None,而 doctest 未覆盖该情况
    当 self.is_empty() 为 True 时,函数执行 return None —— 而 Python 交互式环境中 None 不会显示任何内容,导致 doctest 观察到 “Got nothing”,与期望的 'PRIVATE: 80' 完全不符。

✅ 正确做法是:确保函数始终返回一个可显示的、符合预期格式的字符串或对象。例如:

def best_apartment(self) -> 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 "No apartment available"  # 避免 None

    current_node = self
    while current_node.right is not None:
        current_node = current_node.right

    # 假设 apartment 对象有 __str__ 返回 'TYPE: SCORE' 格式
    return str(current_node.apartment)

⚠️ 注意事项:

Python 3.14.3

微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。

  • doctest 默认比对 repr() 输出,若期望纯字符串,请在 docstring 中用单引号明确写出(如 'PRIVATE: 80');
  • 确保 current_node.apartment 不为 None,可在返回前加断言:assert current_node.apartment is not None, "Apartment data missing";
  • 运行调试时,直接在 Python 交互终端中执行测试语句(如 bst.best_apartment()),观察真实输出,比依赖 doctest 报错更直观。

总结:“Got nothing” 不是语法错误,而是语义失配——你返回了不可见的 None,而测试期待可见值。修正的核心是统一返回类型、避免隐式 None,并确保所有分支都产出可断言的输出。

如何修复Python aiohttp请求时出现的ClientPayloadError?

ClientPayloadError表明服务端提前关闭连接,非客户端代码错误;常见于服务端超时、拒绝大响应或代理截断,需通过抓包、检查响应头、服务端日志及添加读取超时和异常处理来定位解决。 ClientPayloadError通常意味着服务端提前关闭了连接 这个错误不是客户端代码写错了,而是aiohttp在读取响应体时发现服务端已经断开了连接。常见于服务端超时、主动拒绝大响应、或代理/网关(如Ng...

如何理解 doctest 中的 “Got nothing” 错误提示

当doctest报错“gotnothing”,意味着被测函数未产生任何可显示的输出(如返回值为none或未显式打印),而预期却有明确输出(如private:80),导致断言失败。 当doctest报错“gotnothing”,意味着被测函数未产生任何可显示的输出(如返回值为none或未显式打印),而预期却有明确输出(如private:80),导致断言失败。 在你的best_apartment方法中...

Pandas DataFrame.info() 方法的返回值与正确使用方式详解

DataFrame.info()是一个用于打印数据框结构信息的诊断方法,它不返回任何值(即返回None),因此直接赋值会导致变量为None;若需捕获信息内容,应改用df.info(verbose=True,memory_usage=True)的输出重定向或df.dtypes,df.shape等显式属性。 ```dataframe.info()```是一个用于打印数据框结构信息的诊断方法,它不返回任...

Pandas DataFrame.info() 方法的行为解析与正确使用指南

DataFrame.info()是一个用于打印数据框结构摘要的工具方法,它不返回任何值(即返回None),因此直接赋值会导致变量为None;正确用法是单独调用该方法,而非赋值。 `dataframe.info()`是一个用于打印数据框结构摘要的工具方法,它不返回任何值(即返回`none`),因此直接赋值会导致变量为`none`;正确用法是单独调用该方法,而非赋值。 DataFrame.info()...

如何修复Python Pandas写入CSV时科学计数法的问题?

直接控制to_csv(float_format)可避免CSV科学计数法——float_format仅作用于数值列,强制格式化浮点数输出;display.float_format只影响显示,不影响文件序列化。 直接控制float_format参数或预设pd.options.display.float_format,就能避免Pandas写入CSV时自动转成科学计数法——不是数据变了,是显示格式没锁住。...

如何通过Python sys.path动态添加模块搜索路径以解决导入错误?

直接修改sys.path不推荐长期使用,仅适用于临时调试等场景;其不生效主因是模块已缓存于sys.modules,须在首次import前操作,且路径顺序、有效性及环境隔离需严格注意。 直接改sys.path能解决导入问题,但不推荐作为长期方案;它适合临时调试、打包后路径未知或嵌入式场景,用错位置或顺序会导致模块冲突或静默加载错误。 为什么sys.path.append()有时不生效? 常见现象是执...

如何修复Python类属性被所有实例共享的逻辑Bug?

因为类属性在定义时初始化且所有实例共享同一可变对象,导致修改一个实例影响其他实例;正确做法是将可变对象初始化移至__init__中,确保每个实例拥有独立副本。 为什么list、dict作为类属性会导致实例间数据污染? Python中类属性在类定义时就完成初始化,且只执行一次。如果用可变对象(比如[]或{})直接赋值给类属性,所有实例会共享这个同一对象。不是“每个实例都拿到一份副本”,而是“所有实例...

如何修复Python Django模板引擎中存在的XSS跨站脚本风险?

默认启用的模板自动转义仅防HTML文本节点XSS,对href、onclick等属性上下文无效;必须按上下文选用urlencode、escapejs等过滤器;|safe仅限可控、未读写、经bleach清洗的内容;禁用autoescape极危险;AJAX渲染需前端DOMPurify兜底。 默认启用的模板自动转义能挡住大部分XSS,但只要变量出现在href、onclick、style或script等上下...