ValueError: wrapper loop when unwrapping
ValueError: wrapper loop when unwrapping
Python3 测试用例 (doctests) 因我的示例代码而失败。但同样在 Python2.
中工作正常
test.py
class Test(object):
def __init__(self, a=0):
self.a = a
def __getattr__(self, attr):
return Test(a=str(self.a) + attr)
tst.py
from test import Test
t = Test()
运行 个测试用例:python3 -m doctest -v tst.py
错误:
Traceback (most recent call last):
File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/usr/lib/python3.6/doctest.py", line 2787, in <module>
sys.exit(_test())
File "/usr/lib/python3.6/doctest.py", line 2777, in _test
failures, _ = testmod(m, verbose=verbose, optionflags=options)
File "/usr/lib/python3.6/doctest.py", line 1950, in testmod
for test in finder.find(m, name, globs=globs, extraglobs=extraglobs):
File "/usr/lib/python3.6/doctest.py", line 933, in find
self._find(tests, obj, name, module, source_lines, globs, {})
File "/usr/lib/python3.6/doctest.py", line 992, in _find
if ((inspect.isroutine(inspect.unwrap(val))
File "/usr/lib/python3.6/inspect.py", line 513, in unwrap
raise ValueError('wrapper loop when unwrapping {!r}'.format(f))
ValueError: wrapper loop when unwrapping <test.Test object at 0x7f6e80028550>
任何人都可以帮助解决这个错误。
谢谢。
这可以说是 doctest 中的一个错误。发生的事情是 doctest 正在使用文档字符串搜索 functions/methods/callables,并且在这样做时它是 unwrapping 它找到的任何装饰器。为什么这样做,我不知道。但无论如何,doctest 最终会调用 inspect.unwrap(t)
(其中 t
是一个 Test
实例),这在本质上等同于这样做:
while True:
try:
t = t.__wrapped__
except AttributeError:
break
因为 t
是一个 Test
实例,访问 t.__wrapped__
调用 __getattr__
和 returns 一个新的 Test
实例。这将永远持续下去,但 inspect.unwrap
足够聪明,可以注意到它没有到达任何地方,并抛出异常而不是进入无限循环。
作为变通方法,您可以重写 __getattr__
方法以在访问 __wrapped__
时抛出 AttributeError
。更好的是,在访问 any dunder-attribute 时抛出 AttributeError:
def __getattr__(self, attr):
if attr.startswith('__') and attr.endswith('__'):
raise AttributeError
return Test(a=str(self.a) + attr)
unittest.mock
尝试将项目导入为
from unittest import mock
而不是
from unittest.mock import patch
这解决了我的错误。
Python3 测试用例 (doctests) 因我的示例代码而失败。但同样在 Python2.
中工作正常test.py
class Test(object):
def __init__(self, a=0):
self.a = a
def __getattr__(self, attr):
return Test(a=str(self.a) + attr)
tst.py
from test import Test
t = Test()
运行 个测试用例:python3 -m doctest -v tst.py
错误:
Traceback (most recent call last):
File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/usr/lib/python3.6/doctest.py", line 2787, in <module>
sys.exit(_test())
File "/usr/lib/python3.6/doctest.py", line 2777, in _test
failures, _ = testmod(m, verbose=verbose, optionflags=options)
File "/usr/lib/python3.6/doctest.py", line 1950, in testmod
for test in finder.find(m, name, globs=globs, extraglobs=extraglobs):
File "/usr/lib/python3.6/doctest.py", line 933, in find
self._find(tests, obj, name, module, source_lines, globs, {})
File "/usr/lib/python3.6/doctest.py", line 992, in _find
if ((inspect.isroutine(inspect.unwrap(val))
File "/usr/lib/python3.6/inspect.py", line 513, in unwrap
raise ValueError('wrapper loop when unwrapping {!r}'.format(f))
ValueError: wrapper loop when unwrapping <test.Test object at 0x7f6e80028550>
任何人都可以帮助解决这个错误。
谢谢。
这可以说是 doctest 中的一个错误。发生的事情是 doctest 正在使用文档字符串搜索 functions/methods/callables,并且在这样做时它是 unwrapping 它找到的任何装饰器。为什么这样做,我不知道。但无论如何,doctest 最终会调用 inspect.unwrap(t)
(其中 t
是一个 Test
实例),这在本质上等同于这样做:
while True:
try:
t = t.__wrapped__
except AttributeError:
break
因为 t
是一个 Test
实例,访问 t.__wrapped__
调用 __getattr__
和 returns 一个新的 Test
实例。这将永远持续下去,但 inspect.unwrap
足够聪明,可以注意到它没有到达任何地方,并抛出异常而不是进入无限循环。
作为变通方法,您可以重写 __getattr__
方法以在访问 __wrapped__
时抛出 AttributeError
。更好的是,在访问 any dunder-attribute 时抛出 AttributeError:
def __getattr__(self, attr):
if attr.startswith('__') and attr.endswith('__'):
raise AttributeError
return Test(a=str(self.a) + attr)
unittest.mock
尝试将项目导入为
from unittest import mock
而不是
from unittest.mock import patch
这解决了我的错误。