如何模拟以使`from x import *`有效

时间:2012-08-09 06:02:51

标签: python mocking matplotlib

我正在尝试生成一个mattlotlib的模拟,以便我可以使用ReadTheDocs编译我的文档,但遇到了问题。

在我的代码中,我使用from matplotlib.pyplot import *导入matplotlib。

我正在使用以下代码进行模拟(由ReadTheDocs FAQ建议):

class Mock(object):
    def __init__(self, *args, **kwargs):
        pass

    def __call__(self, *args, **kwargs):
        return Mock()

    @classmethod
    def __getattr__(cls, name):
        if name in ('__file__', '__path__'):
            return '/dev/null'
        elif name[0] == name[0].upper():
            return type(name, (), {})
        else:
            return Mock()

MOCK_MODULES = ['numpy', 'scipy', 'matplotlib', 'matplotlib.pyplot']
for mod_name in MOCK_MODULES:
    sys.modules[mod_name] = Mock()

但是,在运行from matplotlib.pyplot import *时,我收到错误消息TypeError: 'type' object does not support indexing

有没有办法可以更改我的Mock,以便它允许我使用from x import *样式导入matplotlib?我不需要任何特定的功能可用,我只需要它就可以导入,以便ReadTheDocs可以正确导入代码。

1 个答案:

答案 0 :(得分:7)

如果通过*导入,则需要在模块中定义__all__列表。您的课程也是如此:只需将__all__属性添加到课程中,它就可以正常工作:

class Mock(object):
    __all__ = []