Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

string to keyword args

4 réponses
Avatar
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

4 réponses

Avatar
Méta-MCI \(MVP\)
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

Avatar
Bruno Desthuilliers
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
<__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()



Avatar
jean-marc pouchoulon

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

Avatar
bruno.desthuilliers
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)