2012-08-09 15 views
10

Estoy tratando de producir un simulacro de matplotlib para poder compilar mis documentos usando ReadTheDocs, pero me he encontrado con un problema.Cómo simular para que `from x import *` funcione

En mi código, importo matplotlib usando from matplotlib.pyplot import *.

estoy usando el siguiente código para mis Mocks (como lo sugiere el 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() 

Sin embargo, cuando se ejecuta from matplotlib.pyplot import * me sale un error diciendo que TypeError: 'type' object does not support indexing.

¿Hay alguna manera de poder cambiar mi Mock para que me permita importar matplotlib usando el estilo from x import *? No necesito ninguna función particular para estar disponible, solo necesito que se pueda importar para que ReadTheDocs pueda importar el código correctamente.

+3

lateral: No ruede su propio simulacro de propósito general. Use la excelente biblioteca 'simulada', en 3.3. incluso está en la biblioteca estándar. – delnan

+0

Gracias por el comentario: descubrí que la importación de la biblioteca 'simulacro' y luego el uso de la clase' simulacro.Mock' en lugar de la sugerida por ReadTheDocs hizo que todo funcionara bien. – robintw

Respuesta

7

En caso de importar a través de *, debe definir la lista __all__ en el módulo. Lo mismo ocurre con su clase: sólo tiene que añadir el atributo __all__ a la clase y que debería funcionar bien: Nota

class Mock(object): 
    __all__ = [] 
+0

ReadTheDocs FAQ está sugiriendo MagicMock: de MagicMock importación unittest.mock clase Mock (MagicMock): __all__ = [] @classmethod def __getattr __ (cls, nombre): volver Mock() MOCK_MODULES = [ 'tkinter', 'tkinter.ttk'] sys.modules.update ((mod_name, Mock()) para mod_name en MOCK_MODULES) Pero no funciona para tkinter.ttk ... – LRMAAX

Cuestiones relacionadas