python - 如何重新定义 MagicMock __str__ 方法?
问题描述
我正在尝试为 Readthedocs 自动生成文档。我按照他们在 FAQ 中的建议模拟了一些依赖项,但是从函数的类型注释中,我得到了文档的某些部分看起来像
返回类型:<MagicMock id='140517266915680'>
这当然是不可接受的。所以我重写了这样的模拟:
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
当我尝试从 继承时MagicMock
,我得到了RecursionError
.
我应该怎么做才能正确隔离文档生成的依赖项并使该文档可读?
解决方案
这是因为MagicMock使用_mock_methods
和_mock_unsafe
属性,但Mock没有(似乎)。我使用 Python 2.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)
所以如果你在里面打印属性名__getattr__
,你可以看到MagicMock有几个调用。
结果:
_mock_methods
_mock_methods
x
y
_mock_methods
z
_mock_methods
_mock_methods
x.y.z
推荐阅读
- azure - 当我在 Python 中有瀑布步骤上下文对象时,如何集成 LUIS?
- python - 我需要在发布 python 包时上传额外的文件夹
- osmnx - 没有节点路径
- sql - 交易的最短日期
- r - 在 ggplot 中使用 plotly - alpha 参数抛出错误
- arrays - 如何对 Couchbase 数组索引进行聚合查询?
- python - 使用 Python 在 Ursina Engine 中跳跃时如何更改玩家实体的纹理?
- netcobol - Fujitsu Netcobol Cobol 程序删除文件或记录
- angular - 如何使用 Angular DevTools 查找组件名称?
- excel - 循环时附加到数组