Bonjour,

je cherche à initialiser un membre statique en fonction d'autres membres statiques définis juste avant, mais je ne trouve pas de solution satisfaisante...
Voici un bout de code pour comprendre :
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
# met a plat un dictionnaire en ne gardant que les elements dont les clefs commencent par <pattern> 
def flat_dict ( dic,pattern ):
    return sum((( value,name ) for name,value in dic.items() if name.startswith( pattern )),())
 
class Spam :
 
    # mes valeurs d'enum auxquelles je veux pouvoir acceder par le nom
    enum1,enum2,enum3 = xrange( 3 )
 
    # liste associative des paires valeur,nom 
    names1  = []
    names2 = flat_dict( self.__class__.__dict__,'enum' )
    names3 = flat_dict( Spam.__class__.__dict__,'enum' )
    names4 = flat_dict( Spam.__dict__,'enum' )
 
    def _build_names (self):
        self.names1 = flat_dict( self.__class__.__dict__,'enum' )
 
    def get_value (self,enum_name):
        return self.names1[ self.names1.index( enum_name )-1 ] 
 
    def __init__(self):
        self._build_names()
 
s = Spam()
print s.names1                # (0, 'enum1', 1, 'enum2', 2, 'enum3')
print s.get_value( 'enum2' )  # 1
J'ai testé 4 possibilités :
names1 : ça marche mais j'ai une initialisation non statique (pas ce que je veux)
names2 : ne compile pas : "NameError: name 'self' is not defined" (ça me paraît logique : pas de self en static)
names3 : ne compile pas : "name 'Spam' is not defined"
names4 : idem names3 (c'est pourtant la version qui me paraissait la plus plausible...)

--> j'en conclus que tant que le compilateur n'a pas atteint la fin de la déclaration de la classe Spam, cette dernière n'est pas accessible, et que du coup, il n'y a pas de solution à mon problème...

Si quelqu'un a une idée...

Merci d'avance !