jean-marc pouchoulon a écrit :
Bonsoir à tous,
comment passer le string "a='toto',b='titi'" comme suite d'arguments nommés à un initialisateur de classe.
Que ce soit un initialiseur (d'instance, d'ailleurs, en fait) ne change pas grand chose. Le problème est le même avec n'importe quelle fonction.
C'est surement simple mais je séche.
Il y a effectivement une solution simple, mais potentiellement dangereuse:
>>> s = "a=10, b=20"
>>> class Toto(object):
.... def __init__(self, **kw):
.... self.__dict__.update(kw)
....
>>> t = eval("Toto(%s)" % s)
>>> t
<__main__.Toto object at 0xb78c6c4c>
>>> t.a
10
>>> t.b
20
>>>
class LigneLog(object):
def __init__(self,**kw):
print kw
self.__dict__.update(kw)
def __repr__(self):
return "<ligne de log: %r, %r, %r, %r, %r>" % (self.date,self.heure,self.compte,self.ipsrc,self.url1)
colnames=('date','heure','compte','ipsrc','url1','interdit','status')
def vtop(z):
return( z[0] + '=' + '"' + str(z[1]) + '"')
session = create_session()
for t in tuples:
ligne=LigneLog(",".join(([vtop(z) for z in zip(colnames,t)])))
session.save(ligne)
Heu... t'es candidat pour le daily WTF, camarade ???
Bon, comme d'hab quand on est tenté de sortir eval() ou exec(), il y a une bien meilleure solution. Ici, c'est simple : construit un dict au lieu d'une chaine, et passe le dict à ta fonction.
colnames=('date','heure','compte','ipsrc','url1','interdit','status')
session = create_session()
for t in tuples:
ligne = LigneLog(**dict(zip(colnames,t)))
session.save(ligne)
session.flush()