如何在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
相关产品推荐
相关产品推荐

