2012-08-09 16 views
10

मैं matplotlib का एक मॉक बनाने की कोशिश कर रहा हूं ताकि मैं ReadDDocs का उपयोग करके अपने दस्तावेज़ों को संकलित कर सकूं, लेकिन किसी समस्या में भाग ले सकूं।'x आयात * से काम करता है'

मेरे कोड में, मैं from matplotlib.pyplot import * का उपयोग करके matplotlib आयात करता हूं। हो

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:

मैं अपने Mocks के लिए निम्न कोड का उपयोग कर रहा है (जैसा कि ReadTheDocs FAQ ने सुझाव दिया)।

क्या कोई तरीका है कि मैं अपना मॉक बदल सकता हूं ताकि यह मुझे from x import * शैली का उपयोग करके matplotlib आयात करने की अनुमति दे? मुझे उपलब्ध कराए जाने वाले किसी भी विशेष कार्यों की आवश्यकता नहीं है, मुझे बस इसे आयात करने में सक्षम होने की आवश्यकता है ताकि ReadTheDocs कोड को सही तरीके से आयात कर सके।

+3

साइड ध्यान दें: अपनी खुद की सामान्य प्रयोजन नकली रोल न करें। 3.3 में उत्कृष्ट 'मॉक' लाइब्रेरी का प्रयोग करें। यह मानक पुस्तकालय में भी है। – delnan

+0

टिप्पणी के लिए धन्यवाद - मैंने पाया कि 'मॉक' लाइब्रेरी आयात करना और फिर ReadTheDocs द्वारा सुझाए गए एक के बजाय 'mock.Mock' class का उपयोग करके यह सब ठीक काम करता है। – robintw

उत्तर

7

* के माध्यम से आयात करने के मामले में आपको मॉड्यूल में __all__ सूची को परिभाषित करने की आवश्यकता है। एक ही अपनी कक्षा के साथ चला जाता है: सिर्फ वर्ग के लिए __all__ विशेषता जोड़ सकते हैं और यह ठीक काम करना चाहिए:

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

ReadTheDocs पूछे जाने वाले प्रश्न MagicMock सुझाव है: unittest.mock आयात MagicMock से वर्ग नकली (MagicMock): __all__ = [] @classmethod डीईएफ़ __getattr __ (सीएलएस, नाम): नकली वापसी() MOCK_MODULES = [ 'tkinter', 'tkinter.ttk'] sys.modules.update ((mod_name, mock()) mOCK_MODULES में mod_name के लिए) लेकिन यह tkinter.ttk के लिए काम नहीं करता है ... – LRMAAX