Python 如何重新定义MagicMock\uuu str\uuu方法?
我正在尝试为Readthedocs自动生成文档。我将一些依赖项模拟为,但从函数的类型注释中,我得到了文档的某些部分 返回类型: 这当然是不能接受的。所以我重写了mock如下:Python 如何重新定义MagicMock\uuu str\uuu方法?,python,python-sphinx,python-mock,read-the-docs,Python,Python Sphinx,Python Mock,Read The Docs,我正在尝试为Readthedocs自动生成文档。我将一些依赖项模拟为,但从函数的类型注释中,我得到了文档的某些部分 返回类型: 这当然是不能接受的。所以我重写了mock如下: from unittest.mock import Mock class ModuleMock(Mock): def __init__(self, path='', *args, **kwargs): super().__init__(*args, *kwargs) self.pa
from unittest.mock import Mock
class ModuleMock(Mock):
def __init__(self, path='', *args, **kwargs):
super().__init__(*args, *kwargs)
self.path = path
def __getattr__(self, name):
return ModuleMock(path=self.path + '.' + name)
def __repr__(self):
return self.path
所以我可以
>>> x = ModuleMock('x')
>>> x
x
>>> x.y.z
x.y.z
但我有个例外
...
File "<frozen importlib._bootstrap>", line 906, in _find_spec
File "<frozen importlib._bootstrap_external>", line 1280, in find_spec
File "<frozen importlib._bootstrap_external>", line 1246, in _get_spec
TypeError: 'ModuleMock' object is not iterable
。。。
文件“”,第906行,在“查找”规范中
文件“”,第1280行,在查找规范中
文件“”,第1246行,在规格中
TypeError:“ModuleMock”对象不可编辑
当我尝试从MagicMock
继承时,我得到了RecursionError
我应该怎样做才能正确地隔离文档生成的依赖关系,并使文档可读 这是因为MagicMock使用了
\u mock\u方法
和\u mock\u不安全的属性,但是mock没有(看起来)。
我使用Python2.7
正确实施:
from mock import MagicMock
class ModuleMock(MagicMock):
def __init__(self, path='', *args, **kwargs):
super(ModuleMock, self).__init__(*args, **kwargs)
self.path = path
def __repr__(self):
return self.path
def __getattr__(self, name):
#print(name)
if name in ('_mock_methods', '_mock_unsafe'):
return super(ModuleMock, self).__getattr__(name)
return ModuleMock(self.path + "." + name)
if __name__ == '__main__':
x = ModuleMock('x')
print(x)
print(x.y.z)
因此,如果在\uu getattr\uuu
中打印属性名,您可以看到MagicMock有几个调用
结果:
_mock_methods
_mock_methods
x
y
_mock_methods
z
_mock_methods
_mock_methods
x.y.z
在此上下文中,mock是一个假装为模块的对象,因此可以导入它,但它实际上什么都不做,并且不能像“真实”模块那样记录。另外请注意,最好将mock添加到conf.py中,另请参见@ElToro1966我不希望它被记录,我希望对它的引用看起来不像
我发现Sphinx的未完成PR修复了这个问题,但还不能弄清楚它是如何工作的。是的!在我将\uuuu mro\u条目添加到\uuu getattr\uuuu
重新定义的异常列表后,它开始工作了!(斯芬克斯想从那里得到一些数据,并希望它是一个元组)