【问题标题】:Sphinx-doc :automodule: with Mock importsSphinx-doc :automodule: 带有 Mock 导入
【发布时间】:2014-09-21 14:36:25
【问题描述】:

我正在尝试根据this 的答案将 sphinx-doc :automodule: 与模拟模块结合使用。具体来说,我将 Mock 用于 ReadTheDocs 上不可用的 PyQt5 模块导入。

奇怪的是,我发现任何从 Mock-ed 模块的类继承的类都不包含在生成的文档中。似乎 sphinx-doc 出于某种原因无法看到它们。

我的稍微定制的 Mock 如下:

from mock import Mock as MagicMock


class Mock(MagicMock):
    __all__ = ['QApplication','pyqtSignal','pyqtSlot','QObject','QAbstractItemModel','QModelIndex','QTabWidget',
        'QWebPage','QTableView','QWebView','QAbstractTableModel','Qt','QWidget','QPushButton','QDoubleSpinBox',
        'QListWidget','QDialog','QSize','QTableWidget','QMainWindow','QTreeWidget',
        'QAbstractItemDelegate','QColor','QGraphicsItemGroup','QGraphicsItem','QGraphicsPathItem',
        'QGraphicsTextItem','QGraphicsRectItem','QGraphicsScene','QGraphicsView',]

    def __init__(self, *args, **kwargs):
        super(Mock, self).__init__()


    @classmethod
    def __getattr__(cls, name):
        if name in ('__file__', '__path__'):
            return os.devnull
        else:
            return Mock

    @classmethod
    def __setattr__(*args, **kwargs):
        pass

    def __setitem__(self, *args, **kwargs):
        return

    def __getitem__(self, *args, **kwargs):
        return Mock

__all__ 是允许 PyQt5 类导入 from x import * 样式所必需的。

我可以确认将超类更改为 object 会导致正确记录类,删除 Mock(在本地生成)也是如此。使用 :autoclass: 强制文档生成单行说明该类继承自 Mock

【问题讨论】:

    标签: python python-sphinx


    【解决方案1】:

    我最终通过不将Mock 用于Qt 对象解决了这个问题。在我的应用程序中有一个 qt.py 包装文件,它处理 PyQt4PyQt5 之间的差异,并允许随后导入它们以供使用(同时忽略 Qt 命名空间重新排列)。

    在这个文件中,我将实际导入代码包装在 ReadTheDocs 的测试中,然后如果检测到,则返回一系列直接从 object 继承的虚拟类。在对象具有属性的情况下需要添加,但这仅在代码库中使用一次。它需要保持最新,但它解决了问题。

    # ReadTheDocs
    ON_RTD = os.environ.get('READTHEDOCS', None) == 'True'
    if not ON_RTD:
    
        #... do the normal import here ...
    
    else:
    
        class QMockObject(object):
            def __init__(self, *args, **kwargs):
                super(QMockObject, self).__init__()
    
            def __call__(self, *args, **kwargs):
                return None
    
        class QApplication(QMockObject):
            pass
    
        class pyqtSignal(QMockObject):
            pass
    
        class pyqtSlot(QMockObject):
            pass
    
        class QObject(QMockObject):
            pass
    
        class QAbstractItemModel(QMockObject):
            pass
    
        class QModelIndex(QMockObject):
            pass
    
        class QTabWidget(QMockObject):
            pass
    
        class QWebPage(QMockObject):
            pass
    
        class QTableView(QMockObject):
            pass
    
        class QWebView(QMockObject):
            pass
    
        class QAbstractTableModel(QMockObject):
            pass
    
        class Qt(QMockObject):
            DisplayRole = None
    
        class QWidget(QMockObject):
            pass
    
        class QPushButton(QMockObject):
            pass
    
        class QDoubleSpinBox(QMockObject):
            pass
    
        class QListWidget(QMockObject):
            pass
    
        class QDialog(QMockObject):
            pass
    
        class QSize(QMockObject):
            pass
    
        class QTableWidget(QMockObject):
            pass
    
        class QMainWindow(QMockObject):
            pass
    
        class QTreeWidget(QMockObject):
            pass
    
        class QAbstractItemDelegate(QMockObject):
            pass
    
        class QColor(QMockObject):
            pass
    
        class QGraphicsItemGroup(QMockObject):
            pass
    
        class QGraphicsItem(QMockObject):
            pass
    
        class QGraphicsPathItem(QMockObject):
            pass
    
        class QGraphicsTextItem(QMockObject):
            pass
    
        class QGraphicsRectItem(QMockObject):
            pass
    
        class QGraphicsScene(QMockObject):
            pass
    
        class QGraphicsView(QMockObject):
            pass
    
        app = None
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多