2012-08-09 35 views
10

我正在嘗試生成一個matplotlib模擬器,以便可以使用ReadTheDocs編譯我的文檔,但遇到了問題。如何模擬,以便`從x導入*`工作

在我的代碼中,我使用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

有沒有一種方法可以改變我的模擬,以便它允許我使用from x import *樣式導入matplotlib?我不需要任何特定的功能可用,我只需要它就可以導入,以便ReadTheDocs可以正確導入代碼。

+3

邊注:不要推出自己的通用模擬。使用3.3中出色的'mock'庫。它甚至在標準庫中。 – delnan 2012-08-09 06:08:26

+0

感謝您的評論 - 我發現導入'mock'庫,然後使用'mock.Mock'類而不是ReadTheDocs建議的類,這一切都很好。 – robintw 2012-08-10 14:16:34

回答

7

如果通過*導入,則需要在模塊中定義__all__列表。這同樣與你的類:只需添加__all__屬性的類,它應該很好地工作:

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

ReadTheDocs FAQ被提示MagicMock: 從unittest.mock進口MagicMock 類素(MagicMock): __all__ = [] @classmethod DEF __getattr __(CLS,名稱): 返回莫克() MOCK_MODULES = [ 'tkinter','tkinter.ttk'] sys.modules.update((mod_name,Mock())for mod_name in MOCK_MODULES) 但它不適用於tkinter.ttk ... – LRMAAX 2015-02-26 03:06:44