85 votes

Comment imprimer la Docstring de la fonction python depuis l'intérieur de la fonction elle-même ?

Je veux imprimer la docstring d'une fonction python depuis l'intérieur de la fonction elle-même. par ex.

 def my_function(self):
  """Doc string for my function."""
  # print the Docstring here.

Pour le moment, je le fais directement après que my_function a été défini.

 print my_function.__doc__

Mais je préfère laisser la fonction le faire elle-même.

J'ai essayé d'appeler print self.__doc__ print self.my_function.__doc__ et print this.__doc__ dans my_function mais cela n'a pas fonctionné.

10voto

Tehnix Points 659

Cela devrait fonctionner (dans mes tests, c'est le cas, également inclus la sortie). Vous pouvez probablement utiliser __doc__ au lieu de getdoc, mais je l'aime bien, c'est donc exactement ce que j'ai utilisé. De plus, cela ne nécessite pas que vous connaissiez les noms de la classe/méthode/fonction.

Exemples à la fois pour une classe, une méthode et une fonction. Dis moi si ce n'est pas ce que tu cherchais :)

 from inspect import *

class MySelfExplaningClass:
    """This is my class document string"""

    def __init__(self):
        print getdoc(self)

    def my_selfexplaining_method(self):
        """This is my method document string"""
        print getdoc(getattr(self, getframeinfo(currentframe()).function))


explain = MySelfExplaningClass()

# Output: This is my class document string

explain.my_selfexplaining_method()

# Output: This is my method document string

def my_selfexplaining_function():
    """This is my function document string"""
    print getdoc(globals()[getframeinfo(currentframe()).function])

my_selfexplaining_function()

# Output: This is my function document string

6voto

jgritty Points 4179

Cela marche:

 def my_function():
  """Docstring for my function"""
  #print the Docstring here.
  print my_function.__doc__

my_function()

en Python 2.7.1

Cela fonctionne aussi :

 class MyClass(object):
    def my_function(self):
        """Docstring for my function"""
        #print the Docstring here, either way works.
        print MyClass.my_function.__doc__
        print self.my_function.__doc__


foo = MyClass()

foo.my_function()

Cependant, cela ne fonctionnera pas tout seul :

 class MyClass(object):
    def my_function(self):
        """Docstring for my function"""
        #print the Docstring here.
        print my_function.__doc__


foo = MyClass()

foo.my_function()

NameError : le nom global 'my_function' n'est pas défini

6voto

Keith Gaughan Points 5314

Il existe une méthode assez simple pour le faire que personne n'a encore mentionnée :

 import inspect

def func():
    """Doc string"""
    print inspect.getdoc(func)

Et cela fait ce que vous voulez.

Il n'y a rien d'extraordinaire ici. Tout ce qui se passe, c'est qu'en faisant func.__doc__ dans une fonction, la résolution des attributs est différée suffisamment longtemps pour que la recherche de __doc__ dessus fonctionne comme vous vous en doutez.

Je l'utilise avec docopt pour les points d'entrée de script de console.

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