Question

J'ai beaucoup d'objets appelables et ils ont tous rempli correctement la chaîne de __doc__, mais en cours d'exécution de l'aide sur les produit l'aide pour leur classe au lieu de l'aide basée sur __doc__.

Je veux changer afin que l'exécution de l'aide sur les produit une aide personnalisée qui ressemble essentiellement comme ce que je recevrais si elles étaient réelles fonctions au lieu des instances d'une classe qui implémente __call__.

Dans le code, je voudrais faire la sortie de celle-ci:

class myCallable:
    def __init__(self, doc):
        self.__doc__ = doc

    def __call__(self):
        # do some stuff
        pass

myFunc = myCallable("some doco text")
help(myFunc)

ressemble plus à la sortie de celle-ci:

def myFunc():
    "some doco text"
    # do some stuff
    pass

help(myFunc)
Était-ce utile?

La solution

La fonction help (mis en oeuvre dans le module de pydoc) ne sont pas disposés à trouver docstrings par-exemple. Je pris un coup d'oeil rapide à travers le module pour voir s'il y avait un moyen de fournir une aide explicite, mais il ne semble pas être. Il utilise le module inspect pour déterminer quel genre de chose qu'il est, et votre myFunc ne ressemble pas à une fonction, il ressemble à une instance. Alors imprime pydoc aide sur la classe de l'instance à la place.

Ce serait bien si semblable à vous __doc__ pouvez ajouter un attribut __help__, mais il n'y a pas de soutien pour cela.

Je hésite à le suggérer, mais votre meilleur pari peut-être définir une nouvelle fonction help:

old_help = help
def help(thing):
    if hasattr(thing, '__help__'):
        print thing.__help__
    else:
        old_help(thing)

et puis mettre un attribut __help__ sur vos instances:

class myCallable:
    def __init__(self, doc):
        self.__doc__ = doc
        self.__help__ = doc

Autres conseils

Je ne suis pas très clair sur ce que votre question est exactement. Je crois comprendre que vous avez une classe et une fonction définie dans et vous voulez savoir où Python obtient le texte d'aide pour cette fonction de.

Python obtient le texte d'aide des chaînes de doc fournies dans cette classe / méthode.

Si vous avez une classe « A » et une méthode « f » dans cette classe et il y a docstrings dans la fonction « f », puis la décharge terminale suivante devrait aider à clarifier votre question:

>>> class A:
        def __init__(self):
            self.c = 0   # some class variable
        def f(self, x):
            """this is the documentation/help text for the function "f" """
            return x+1

>>> help(A.f)
Help on method f in module __main__:

f(self, x) unbound __main__.A method
this is the documentation/help text for the function "f" 

>>> A.f.__doc__
'this is the documentation/help text for the function "f" '

Hope this helps

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top