IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

auto-Doc?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 16
    Par défaut auto-Doc?
    l'autoDoc ayant qq faiblesse (s'arrète dès qu'il ne peut importer un module)

    Je voudrai faire le mien en Python (récupérer le nom des classes et des fonctions utilisées dans mon module)

    Voilà ce que j'ai fait. Le pb c'est qu'il bloque au 2ème niveau d'inclusion des classes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def printDoc(cl, espace = 0):
      try : cl.__dict__
      except : pass
      else :
        print ' '*espace+cl.__name__
        for obj in cl.__dict__:
          printDoc(eval(cl.__name__+'.'+obj), espace+1)

  2. #2
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 16
    Par défaut
    j'ai trouvé mieux si ca intéresse qq1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    def genDoc():
      """Génère la doc du module. (à peu de choses près)
      A été utilisée pour générer ce fichier."""
      file = open("libGenGPdf.txt", "w")
      def printDoc(cl, espace = 0, parent = ''):
        """Ecrit la docString des fonctions et classes. Puis intéroge les sous-fonctions ou sous-classes"""
        if type(cl) == org.python.core.PyModule or type(cl) == org.python.core.PyJavaPackage:
          return
        try : 
          if cl.__module__[:9] != 'libGenPdf' and cl.__module__[:4] != 'main': return
        except : pass
        try :
          if parent: eval(parent[:-1]+'.'+cl.__name__)
          cl.__dict__
        except : return
        file.write( ("\n"+"    "*espace).join(("\n%s  <'%s'>\n%s\n " %(cl.__name__, str(type(cl)), cl.__doc__)).splitlines()) )
        for obj in cl.__dict__:
          if parent :
            printDoc(eval(parent[:-1]+'.'+cl.__name__+'.__dict__["'+obj+'"]'), espace+1, parent = parent+cl.__name__+'.')
          else :
            printDoc(eval(cl.__name__+'.'+obj), espace+1, parent = parent+cl.__name__+'.')
      #fin printDoc
     
      for ent in globals().keys():
        try : printDoc(eval(ent), espace = 0, parent = '')
        except : pass
      file.close()
    3 remarques:
    Mon "__main__" à moi c'est "main"
    Je suis sous Jython
    Le module sur lequel je l'ai appliqué c'est "libGenPdf"

    sinon j'ai encore les 'Built-In' fonctions. Et je n'ai pas accès aux fonctions définies dans une autre (ca je ne suis pas sûr que l'on puisse y accéder).
    Finalement, je ne connais pas le prototype des fonctions ni la classe parente d'une classe.

    Donc si une bonne fée pouvait se pencher sur mon berceau...

  3. #3
    uaz
    uaz est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Par défaut
    Je ne sais pas si ça pourra t'aider, mais moi j'utilise la librairie inspect pour manipuler les prototypes/classes et je génère de l'auto-documentation dynamiquement

  4. #4
    uaz
    uaz est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Par défaut
    Rapidos alors (moi non plus j'ai pas le temps là )
    J'ai une classe Librairie et un attribut lib qui est un tableau de références sur des objets (des librairies). Chaque fonction d'une librairie possède les deux arguments self et test, ceux là je ne veux pas les voir dans ma docstring donc je les ignore.

    getargspec() récupère un tuple représentant les arguments d'une fonction (j'ai bien dit fonction, pas d'une méthode), comme je fais ça dynamiquement, j'évalue le nom de fonction à tester à la volée, surtout ne pas oublier le fameux 'im_func' qui donne l'équivalent d'une "méthode" en "fonction"

    Le formatargspec() te sort une jolie string : nom_fonction(arg1, arg2, arg3=val_par_defaut)

    Tu peux tester l'existance d'une méthode/fonction avec des ismethod() et isfonction() il y'a l'équivalent pour tous les types d'objets (classe, attributs..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
        # Recupere le prototype de la fonction
        # Entree: lib, nom de la librairie de la fonction
        #         fonction, nom de la fonction a rechercher
        # Sortie: chaine de caracteres
        def getPrototypeFonction(self, lib, fonction):
            chaine = lib + fonction + ".im_func"
            chaine = chaine.replace("getLibrairies().", "")
            args = inspect.getargspec(eval(chaine))
            args[0].remove('self')
            args[0].remove('test')
            prototype = fonction + inspect.formatargspec(args[0], args[1], args[2], args[3])
            return (prototype, args[0], args[3])
     
     
        # Retourne la chaine representant la librairie ou se trouve la fonction
        # Entree: fonction, nom de la fonction a rechercher
        # Sortie: chaine, si trouve
        #         None, si non-trouve
        def getLibFonction(self, fonction):
            chaine = "self.lib[i]." + fonction
     
            for i in range(self.NB_LIB):                 
                try:
                    if inspect.ismethod(eval(chaine)) or inspect.isfunction(eval(chaine)):
                        return "self.getLibrairies().lib[" + str(i) + "]."
                except AttributeError:
                    pass
            return ''

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Add-in] Mise en forme auto d'un doc non XML
    Par kileak dans le forum Visual Studio
    Réponses: 1
    Dernier message: 28/11/2008, 18h22
  2. Sauvegarde auto de docs PDF avec RAVE
    Par arkhamon dans le forum Rave
    Réponses: 1
    Dernier message: 19/09/2008, 08h45
  3. génération auto de la doc de la bdd d'access
    Par kenny49 dans le forum Access
    Réponses: 3
    Dernier message: 12/07/2006, 16h27
  4. [VBA-E] Insérer n° page auto dans un doc Word
    Par tarmin dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/05/2006, 09h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo