Salome HOME
PN : pour les complexes, le retour arrière sur les listes et l historique des fichiers
[tools/eficas.git] / Utilites / scrute.py
1 # -*- coding: utf-8 -*-
2 """
3 Module scrute
4 -------------
5     Le module scrute propose la fonction SCRUTE qui affiche sur
6     la stderr, la valeur de l'objet (passé en argument)
7     précédée le nom de l'objet.
8     Il propose également la fonction EXAMINE qui détaille sur
9     la stderr le contenu d'un objet
10     
11     N.B. : les fonctions SCRUTE e EXAMINE ne sont opérantes que pour les développeurs
12            (la variable DEVELOPPEUR doit être définie)
13 """
14
15 try :
16         from developpeur import DEVELOPPEUR
17 except :
18         DEVELOPPEUR=None
19
20 def NULL( *l_args, **d_args  ) : pass
21
22 if DEVELOPPEUR :
23
24     import developpeur
25     developpeur.sortie.write( "import de "+__name__+" : $Id: scrute.py,v 1.2 2003/03/06 14:36:12 eficas Exp $" )
26     developpeur.sortie.write( "\n" )
27     import re
28     import linecache
29     import ici
30     import sys
31
32     def SCRUTE( valeur ) :
33
34         """
35         Fonction SCRUTE
36         ---------------
37         La fonction SCRUTE affiche sur la stderr, la valeur (passée en argument)
38         d'une variable précédée de son nom.
39         L'affichage précise également le nom du fichier et le numéro
40         de la ligne où la fonction SCRUTE a été appelée.
41
42         N.B. : le type de la variable doit posséder de préférence une méthode __str__
43
44         Usage :
45         from scrute import SCRUTE
46         r=1.0
47         SCRUTE(r)
48         SCRUTE(r+1)
49         SCRUTE(f(r))
50         Erreur :
51         SCRUTE(r) ; SCRUTE(f(r)) # ==> ERREUR
52         """
53
54
55         filename,lineno=ici.ICI()
56
57         line = linecache.getline( filename, lineno )
58
59         ll=re.sub( "\s*#.*$" , '' ,line)
60
61         l_occurrences=[]
62         l_occurrences=re.findall( "SCRUTE" , ll )
63         assert(len(l_occurrences)>0),__name__+" : pas de SCRUTE trouvé !"
64         assert(len(l_occurrences)<=1),\
65         __name__+" : "+str(len(l_occurrences))+" SCRUTE sur la même ligne ; c'est LIMITE à 1 !"
66
67         ll=re.sub( "\s*;.*$" , '' ,line)
68         regex='^.*SCRUTE[^(]*\('
69         l=re.sub( regex , '' ,ll)
70         regex='\)[^)]*$'
71         nom_objet=re.sub( regex , '' ,l)
72
73         try :
74             developpeur.sortie.write( nom_objet+'=' )
75             s=str(valeur)
76             developpeur.sortie.write( s )
77             developpeur.sortie.write( " ("+str(type(valeur))+")" )
78         except : pass
79         developpeur.sortie.write( '\n' )
80         developpeur.sortie.flush()
81
82         return
83
84     def makeClassName( ob ) :
85         import types
86         if type(ob) == types.InstanceType :
87             return str(ob.__class__)
88         else :
89             return str(type(ob))
90         
91
92     def EXAMINE( ob ) :
93         """
94         Affiche sur la developpeur.sortie le contenu d'un objet
95
96         Usage :
97             class KLASS : pass
98             import Utilites
99             object=KLASS()
100             Utilites.EXAMINE(object)
101         """
102
103         appel_EXAMINE=1
104         f = sys._getframe( appel_EXAMINE )
105         context=f.f_locals
106
107         filename,lineno=ici.ICI()
108         line = linecache.getline( filename, lineno )
109         nom=re.sub( "^.*EXAMINE *\(", "" , line )
110         nom=re.sub( " *[,\)].*$", "" , nom )
111         nom=re.sub( "\n", "" , nom )
112         developpeur.sortie.write( "Examen de "+nom+" de type "+makeClassName(ob)+"\n" )
113
114         for att in dir(ob) :
115             st=nom+'.'+att
116             developpeur.sortie.write( '\t'+st+' = ' )
117             developpeur.sortie.flush()
118             commande="import developpeur;developpeur.sortie.write( str("+st+")+'\\n' )"
119             try :
120                 exec commande in context
121             except :
122                 commande="import sys; sys.stderr.write( str("+st+")+'\\n' )"
123                 exec commande in context
124             
125         return
126
127
128 else :
129
130     SCRUTE = NULL
131     EXAMINE = NULL