string to keyword args

Le
jean-marc pouchoulon
Bonsoir à tous,
comment passer le string "a='toto',b='titi'" comme suite d'arguments
nommés à un initialisateur de classe. C'est surement simple mais je séche.



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)

session.flush()

Merci de vos lumières.

jean-marc
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Méta-MCI \(MVP\)
Le #6885291
Bonsoir !

comment passer le string "a='toto',b='titi'" comme suite d'arguments


Heu... Désolé, je ne comprends pas très bien. A moins que :
def __init__(self, *args, **kw):
ne soit la solution ?

@-salutations

Michel Claveau

Bruno Desthuilliers
Le #6907001
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, b "
class Toto(object):
... def __init__(self, **kw):



... self.__dict__.update(kw)
...
t = eval("Toto(%s)" % s)
t



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()



jean-marc pouchoulon
Le #6933381

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.

yep. J'avais fait un effort avec écrivant initialiseur au lieu de

contructeur.


Heu... t'es candidat pour le daily WTF, camarade ???



mmm par principe je refuse les honneurs. Mais je vais faire passer
l'url (http://thedailywtf.com/Articles/Avoiding-Development-Disasters.aspx)
à mes camarades du bureau à côté.

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.


Merci bruno c'est bien ce que je cherchais.


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()



Merci de vos deux réponses

jean-marc

bruno.desthuilliers
Le #6933361
On 11 juin, 18:10, jean-marc pouchoulon
montpellier.fr> wrote:
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 fonct ion.


yep. J'avais fait un effort avec écrivant initialiseur au lieu de
contructeur.


Dont j'ai très injustement oublié de tenir compte, mea culpa. Bon, ok,
je suis un chieur pédant et pontifiant, voilà, désolé. Mais merci po ur
la piqure de rappel, j'en ai besoin de temps en temps !-)


Heu... t'es candidat pour le daily WTF, camarade ???


mmm par principe je refuse les honneurs.


C'est vrai que dans certains cas, on est pris d'une soudaine crise
d'humilité. Allez savoir pourquoi...

Mais je vais faire passer
l'url (http://thedailywtf.com/Articles/Avoiding-Development-Disasters.aspx )
à mes camarades du bureau à côté.


Une saine lecture en tout état de cause.

(snip)


Publicité
Poster une réponse
Anonyme