Как издеваться над тем, чтобы `from x import *` работал

Я пытаюсь создать Mock из matplotlib, чтобы я мог скомпилировать свои документы с помощью ReadTheDocs, но столкнулся с проблемой.

В моем коде я импортирую matplotlib, используя from matplotlib.pyplot import *.

Я использую следующий код для моего Mocks (как предложено 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, чтобы он позволял мне импортировать matplotlib с помощью стиля from x import *? Мне не нужны какие-либо специальные функции, которые нужно сделать доступными, мне просто нужно, чтобы они могли быть импортированы, чтобы ReadTheDocs мог правильно импортировать код.

Ответ 1

В случае импорта через * вам необходимо определить список __all__ в модуле. То же самое касается вашего класса: просто добавьте атрибут __all__ к классу, и он должен работать нормально:

class Mock(object):
    __all__ = []