You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python doctest中使用带装饰器的函数?

如何在Python doctest中包含带装饰器的函数?

你给出的代码在doctest的Examples块里定义带装饰器的函数时触发了SyntaxError,核心原因是doctest默认逐行解析代码,而装饰器@decorator和后续的def stub(): ...属于同一个多行语句,拆分成单独的>>>行后,解释器会把它们当作独立的代码片段,从而抛出语法错误。

下面是两种可行的解决方法:

方法1:用续行标记...连接完整代码块

doctest支持用...表示代码续行,把装饰器和被装饰函数放在同一个逻辑代码块里:

def decorator(func):
    def wrapper() -> None:
        func()

    return wrapper

def foo() -> None:
    """
    Stub.

    Examples:
        >>> @decorator
        ... def stub():
        ...     pass
        >>> stub()  # 可以直接调用测试装饰后的函数
    """

if __name__ == "__main__":
    import doctest
    doctest.testmod()

这种写法和日常编写带装饰器的函数逻辑一致,>>>开头是代码块的第一行,后续的缩进行用...标记,doctest会将整段当作完整代码执行。

方法2:展开装饰器语法糖为显式赋值

如果不想用续行标记,也可以手动展开装饰器的语法糖,通过显式调用装饰器并赋值的方式实现:

def decorator(func):
    def wrapper() -> None:
        func()

    return wrapper

def foo() -> None:
    """
    Stub.

    Examples:
        >>> def stub():
        ...     pass
        >>> stub = decorator(stub)
        >>> stub()
    """

if __name__ == "__main__":
    import doctest
    doctest.testmod()

这种方式把@decorator的语法糖转换成等价的函数调用和变量赋值,doctest可以逐行解析执行,适合简单的装饰器场景。

内容的提问来源于stack exchange,提问作者Intrastellar Explorer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:24:54