Python 如何重新定义MagicMock\uuu str\uuu方法?

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

我正在尝试为Readthedocs自动生成文档。我将一些依赖项模拟为,但从函数的类型注释中,我得到了文档的某些部分

返回类型:

这当然是不能接受的。所以我重写了mock如下:

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
重新定义的异常列表后,它开始工作了!(斯芬克斯想从那里得到一些数据,并希望它是一个元组)