2012-08-09 38 views
10

çalışmasını nasıl yapmalıyım? Matplotlib'in bir Mock'ını üretmeye çalışıyorum, böylece Docum'ları ReadTheDocs kullanarak derleyebilirim, ancak bir soruna girdim.`x içe aktarma *` işlevi,

Kodumda, matplotlib dosyasını from matplotlib.pyplot import * kullanarak içe aktarıyorum. (ReadTheDocs FAQ önerdiği gibi)

benim Mocks için aşağıdaki kodu kullanıyorum:

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() 

Ancak from matplotlib.pyplot import * çalıştırırken ben olsun bir hata TypeError: 'type' object does not support indexing söyleyerek.

Mock'umu değiştirebilmem için bir yol var mı? Böylece from x import * stilini kullanarak matplotlib dosyasını içe aktarmama izin veriyor? Kullanılabilecek herhangi bir özel fonksiyona ihtiyacım yok, sadece ReadTheDocs'un kodu doğru şekilde içe aktarabilmesi için içe aktarılabilmek için ihtiyacım var.

+3

Yan not: Kendi genel amaçlı alay rulo etmeyin. Mükemmel 'mock 'kütüphanesini 3.3'te kullanın. Standart kütüphanede bile. – delnan

+0

Yorum için teşekkürler - Ben 'mock' kütüphane ithal ve sonra ReadTheDocs tarafından önerilen bir yerine 'mock.Mock' sınıfını kullanarak her şeyin iyi çalıştığını buldum. – robintw

cevap

7

* aracılığıyla içe aktarma durumunda, modülde __all__ listesini tanımlamanız gerekir. Aynı Sınıfınızla gider: sadece sınıfa __all__ öznitelik eklemek ve sorun çıkmaması gerekir:

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

ReadTheDocs SSS MagicMock öne sürmektedir: unittest.mock içe MagicMock gelen sınıf Taklit (MagicMock): __all__ = [] @classmethod def __getattr __ (cls ad): Mock geri () MOCK_MODULES = [ 'tkinter', 'tkinter.ttk'] sys.modules.update (MOCK_MODULES içinde mod_adı için mod_name, Mock()) Ancak tkinter.ttk için çalışmıyor ... – LRMAAX