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 :J'ai testé 4 possibilités :
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
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 !
Partager