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