5

numpy の MaskedArrays を大量に (継承して) 使用するライブラリを作成しました。make doctestしかし、numpy から継承されたメソッドをテストせずにsphinx を実行したいと考えています。これは、約 100 回の失敗が発生するためです。

これは次のようになります。

class _frommethod:
    """
    Adapted from numpy.ma._frommethod
    """

    def __init__(self, func_name):
        self.__name__ = func_name
        self.__doc__ = getattr(MaskedArray, func_name).__doc__
        self.obj = None

    def __get__(self, obj, objtype=None):
        self.obj = obj
        return self

    def __call__(self, a, *args, **params):
        # Get the method from the array (if possible)
        method_name = self.__name__
        method = getattr(a, method_name, None)
        if method is not None:
            return method(*args, **params)
        # Still here ? Then a is not a MaskedArray
        method = getattr(MaskedTimeData, method_name, None)
        if method is not None:
            return method(MaskedTimeData(a), *args, **params)
        # Still here ? OK, let's call the corresponding np function
        method = getattr(np, method_name)

そして、ライブラリが numpy の関数もサポートするようになったので、以下を使用します。

min = _frommethod('min')
max = _frommethod('max')
...

を無効にするself.__doc__ = getattr(MaskedArray, func_name).__doc__と、の失敗がmake doctestなくなります。しかし、継承されたドキュメントを保持したいと思います。ユーザーが引き続きmylibrary.min?ipythonで使用できるようにします。

スフィンクスがこの「継承された」ドキュメントテストを実行するのを防ぐ方法を知っている人はいますか?

4

1 に答える 1

2

私は今このソリューションを使用しています:

def _dont_doctest_inherited_docstrings(docstring):
    docstring_disabled = ""
    for line in docstring.splitlines():
        docstring_disabled += line + "#doctest: +DISABLE"
    return docstring_disabled

class _frommethod:
    """
    Adapted from numpy.ma._frommethod
    """

    def __init__(self, func_name):
        self.__name__ = func_name
        docstring = getattr(MaskedArray, func_name).__doc__
        self.__doc__ = _dont_doctest_inherited_docstrings(docstring)
        self.obj = None

たぶん誰かがより賢い方法を持っています!

于 2012-06-01T16:06:51.163 に答える