Où la fonction d'aide pydoc Python obtenir son contenu?
-
21-09-2019 - |
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)
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