3 votes

Comment préserver la docstring d'une classe décorée pour la documentation sphinx ?

J'ai un décorateur qui a une définition imbriquée de la classe enveloppante. Le wrapper maintient comme attribut la classe originale qu'il enveloppe. Un exemple de jouet ressemble à ceci :

def decorator(cls):
    class Wrapper(object):
        original = cls

        def __init__(self):
            self.__doc__ = self.original.__doc__
            self.__name__ = self.original.__name__

        def do_something_with_cls(cls):
            pass

    return Wrapper

Maintenant, je veux décorer le Foo avec ce décorateur dans l'autre module et générer la documentation sphinx pour la classe Foo avant qu'elle ne soit décorée. Cela ressemble à ceci :

from .bar import decorator

@decorator
class Foo(object):
    """The docstring I want to preserve."""
    def __init__(self):
        pass

J'ai essayé d'atteindre cet objectif en utilisant la fonction autoclass la fonctionnalité mais ça n'a pas marché. Ce que je voulais faire était de créer une instance de classe et de prendre sa docstring :

.. autoclass:: package.baz.Foo()
   :members:

mais il a renvoyé ceci dans la documentation html de l'application package.baz.Foo classe : alias of package.bar.decorator.<locals>.Wrapper

C'est ce que je veux faire lorsque je documente le baz je suis capable de générer une documentation de la classe Foo avant sa décoration. Est-ce possible ?

EDITAR:

Ce site ressemble à un problème similaire, mais ici, ce que j'aimerais réaliser, c'est passer à la fonction Wrapper l'instance de la docstring que Sphinx verra et générera une documentation basée sur l'original. Foo ou je serai en mesure d'appeler une Wrapper.original et en faire une documentation, mais ce qui suit n'a pas fonctionné :

.. autoclass package.baz.Foo.original
   :members:

3voto

Rajan Points 1010

Si @wraps ne fonctionne pas, vous pouvez mettre à jour __doc__ manuellement.

Fais quelque chose comme :

def decorator(cls):
    class Wrapper(object):
        original = cls

        def __init__(self):
            self.__doc__ = self.original.__doc__
            self.__name__ = self.original.__name__

        def do_something_with_cls(cls):
            pass

    Wrapper.__doc__ = cls.__doc__
    return Wrapper

@decorator
class Foo(object):
    """The docstring I want to preserve."""
    def __init__(self):
        pass

print(Foo.__doc__)

La chaîne de documents que je veux préserver.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X