2012-08-09 17 views
10

Sto provando a produrre un Mock di matplotlib in modo che possa compilare i miei documenti usando ReadTheDocs, ma ho incontrato un problema.Come scherzare in modo che `da x import *` funzioni

Nel mio codice, importare matplotlib utilizzando from matplotlib.pyplot import *.

Sto usando il seguente codice per i miei Mocks (come suggerito dal 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() 

Tuttavia, durante l'esecuzione from matplotlib.pyplot import * ottengo un errore dicendo che TypeError: 'type' object does not support indexing.

C'è un modo per cambiare il mio Mock in modo che possa importare matplotlib usando lo stile from x import *? Non ho bisogno di alcuna funzione particolare da rendere disponibile, ho solo bisogno che sia in grado di essere importato in modo che ReadTheDocs possa importare correttamente il codice.

+3

laterale: non rotolare il proprio finto general-purpose. Usa l'eccellente libreria 'mock', in 3.3. è anche nella libreria standard. – delnan

+0

Grazie per il commento: ho scoperto che importare la libreria 'mock' e poi usare la classe' mock.Mock' invece di quella suggerita da ReadTheDocs ha reso tutto funzionante. – robintw

risposta

7

In caso di importazione tramite * è necessario definire l'elenco __all__ nel modulo. Lo stesso vale con la classe: basta aggiungere l'attributo __all__ alla classe e dovrebbe funzionare bene: nota

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

ReadTheDocs FAQ sta suggerendo MagicMock: da unittest.mock importazione MagicMock classe Mock (MagicMock): __all__ = [] @classmethod def __getattr __ (cls, nome): tornare Mock() MOCK_MODULES = [ 'tkinter', 'tkinter.ttk'] sys.modules.update ((mod_name, Mock()) per nome_mod in MOCK_MODULES) Ma non funziona per tkinter.ttk ... – LRMAAX

Problemi correlati