2009-11-24 1 views
10

J'ai beaucoup d'objets appelables et ils ont tous la chaîne __doc__ correctement remplie, mais l'aide courante sur eux produit l'aide pour leur classe au lieu de l'aide basée sur __doc__.Où la fonction d'aide pydoc de Python obtient-elle son contenu?

Je veux le modifier afin que l'aide en cours d'exécution produit une aide personnalisée qui ressemble essentiellement à ce que j'obtiendrais si elles étaient des fonctions réelles 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) 
+2

Je pense que le problème ici est que myFunc basé sur la classe a une instance de type, alors que l'autre a une fonction de type. Je ne suis pas sûr s'il y a un moyen de contourner cela. (essayez le type d'impression (myFunc) sur chacun de voir) – Suppressingfire

+0

vous avez raison sur les types, cette information est-elle utilisée dans pydoc? –

Répondre

5

La fonction help (implémentée dans le module pydoc) n'est pas préparée pour trouver des docstrings par instance. J'ai jeté un rapide coup d'œil sur le module pour voir s'il y avait un moyen de fournir une aide explicite, mais il semble que ce ne soit pas le cas. Il utilise le module inspect pour déterminer quel genre de chose il est, et votre myFunc ne ressemble pas à une fonction, elle ressemble à une instance. Les gravures pydoc aident donc à la place de la classe de l'instance.

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

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

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

puis mettre un attribut __help__ sur vos instances:

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

Je n'avais pas considéré cette approche, c'est une suggestion intéressante. Le programme particulier pour lequel je m'intéresse à l'aide dispose déjà d'une console personnalisée et complète, de sorte que l'aide personnalisée n'est pas si surprenante et peut être effectuée dans le cadre du code de la console personnalisée. –

2

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

Python récupère le texte d'aide des chaînes de documentation 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" ' 

Espérons que cela vous aide

Questions connexes