Comme je suis persuadé que, au nord de Montélimar, l'été est pourri
(comme d'hab), je vais vous montrer un petit code :
class vdef(object):
pass
#implém._1
c=vdef()
setattr(c,"a",111)
print c.a #==> 111 ; Ok.
#implém._2
c=vdef()
c.a=vdef()
setattr(c.a,"b",222)
print c.a.b #==> 222 ; Ok.
#implém._3
c=vdef()
c.a=vdef()
setattr(c,"a.b",333)
print c.a.b #==> Erreur !
"""
Traceback (most recent call last):
File "D:\Dev\python\PonxUse.py", line 73, in <module>
print c.a.b
AttributeError: 'vdef' object has no attribute 'b'
"""
Deux questions, pour ne rien gagner du tout (sinon un peu de temps ou de
satisfaction) :
- pourquoi la syntaxe setattr(c,"a.b",333) ne passe-t'elle pas
comme souhaitée ?
- où est passée la valeur affectée (le 333) ?
Bon dimanche pluvieux à tous. Moi, je vais me baigner...
Comme je suis persuadé que, au nord de Montélimar, l'été est pourri (comme d'hab), je vais vous montrer un petit code :
class vdef(object): pass
#implém._1 c=vdef() setattr(c,"a",111) print c.a #==> 111 ; Ok.
#implém._2 c=vdef() c.a=vdef() setattr(c.a,"b",222) print c.a.b #==> 222 ; Ok.
#implém._3 c=vdef() c.a=vdef() setattr(c,"a.b",333) print c.a.b #==> Erreur ! """ Traceback (most recent call last): File "D:DevpythonPonxUse.py", line 73, in <module> print c.a.b AttributeError: 'vdef' object has no attribute 'b' """
Bonjour,
# --- begin code
class vdef(object): def __setattr__(self, name, value): res = super(vdef, self).__setattr__(name, value) names = name.split(".") if len(names) >= 2: val = vdef() setattr(self, names[0], val) setattr(val, ".".join(names[1:]), value) pass return pass
a=vdef() setattr(a,"b",111) print 'a.b', a.b #==> 111 ; Ok. setattr(a,"b.c",222) print 'a.b.c', a.b.c #==> 222 ; Ok. print 'getattr(a, "b.c")', getattr(a, "b.c") #==> 222 ; Ok. print 'getattr(a.b, "c")', getattr(a.b, "c") #==> 222 ; Ok. setattr(a,"b.c.d.e",444) print 'a.b.c.d.e', a.b.c.d.e #==> 444 ; Ok. print 'getattr(a,"b.c.d.e")', getattr(a,"b.c.d.e") #==> 444 ; Ok. print 'getattr(a.b,"c.d.e")', getattr(a.b,"c.d.e") #==> 444 ; Ok. print 'getattr(a.b.c,"d.e")', getattr(a.b.c,"d.e") #==> 444 ; Ok.
# --- end code
On s'amuse bien ici ... je crois que j'ai bien fait de venir ! En région parisienne, il fait beau ... je vais me balader.
Bonne fin de dimanche !
K.
Deux questions, pour ne rien gagner du tout (sinon un peu de temps ou de satisfaction) : - pourquoi la syntaxe setattr(c,"a.b",333) ne passe-t'elle pas comme souhaitée ? - où est passée la valeur affectée (le 333) ?
Bon dimanche pluvieux à tous. Moi, je vais me baigner...
Michel Claveau
Méta-MCI (MVP) a écrit :
Bonjour !
Comme je suis persuadé que, au nord de Montélimar, l'été est pourri
(comme d'hab), je vais vous montrer un petit code :
class vdef(object):
pass
#implém._1
c=vdef()
setattr(c,"a",111)
print c.a #==> 111 ; Ok.
#implém._2
c=vdef()
c.a=vdef()
setattr(c.a,"b",222)
print c.a.b #==> 222 ; Ok.
#implém._3
c=vdef()
c.a=vdef()
setattr(c,"a.b",333)
print c.a.b #==> Erreur !
"""
Traceback (most recent call last):
File "D:DevpythonPonxUse.py", line 73, in <module>
print c.a.b
AttributeError: 'vdef' object has no attribute 'b'
"""
Bonjour,
# --- begin code
class vdef(object):
def __setattr__(self, name, value):
res = super(vdef, self).__setattr__(name, value)
names = name.split(".")
if len(names) >= 2:
val = vdef()
setattr(self, names[0], val)
setattr(val, ".".join(names[1:]), value)
pass
return
pass
a=vdef()
setattr(a,"b",111)
print 'a.b', a.b #==> 111 ; Ok.
setattr(a,"b.c",222)
print 'a.b.c', a.b.c #==> 222 ; Ok.
print 'getattr(a, "b.c")', getattr(a, "b.c") #==> 222 ; Ok.
print 'getattr(a.b, "c")', getattr(a.b, "c") #==> 222 ; Ok.
setattr(a,"b.c.d.e",444)
print 'a.b.c.d.e', a.b.c.d.e #==> 444 ; Ok.
print 'getattr(a,"b.c.d.e")', getattr(a,"b.c.d.e") #==> 444 ; Ok.
print 'getattr(a.b,"c.d.e")', getattr(a.b,"c.d.e") #==> 444 ; Ok.
print 'getattr(a.b.c,"d.e")', getattr(a.b.c,"d.e") #==> 444 ; Ok.
# --- end code
On s'amuse bien ici ... je crois que j'ai
bien fait de venir ! En région parisienne,
il fait beau ... je vais me balader.
Bonne fin de dimanche !
K.
Deux questions, pour ne rien gagner du tout (sinon un peu de temps ou de
satisfaction) :
- pourquoi la syntaxe setattr(c,"a.b",333) ne passe-t'elle pas
comme souhaitée ?
- où est passée la valeur affectée (le 333) ?
Bon dimanche pluvieux à tous. Moi, je vais me baigner...
Comme je suis persuadé que, au nord de Montélimar, l'été est pourri (comme d'hab), je vais vous montrer un petit code :
class vdef(object): pass
#implém._1 c=vdef() setattr(c,"a",111) print c.a #==> 111 ; Ok.
#implém._2 c=vdef() c.a=vdef() setattr(c.a,"b",222) print c.a.b #==> 222 ; Ok.
#implém._3 c=vdef() c.a=vdef() setattr(c,"a.b",333) print c.a.b #==> Erreur ! """ Traceback (most recent call last): File "D:DevpythonPonxUse.py", line 73, in <module> print c.a.b AttributeError: 'vdef' object has no attribute 'b' """
Bonjour,
# --- begin code
class vdef(object): def __setattr__(self, name, value): res = super(vdef, self).__setattr__(name, value) names = name.split(".") if len(names) >= 2: val = vdef() setattr(self, names[0], val) setattr(val, ".".join(names[1:]), value) pass return pass
a=vdef() setattr(a,"b",111) print 'a.b', a.b #==> 111 ; Ok. setattr(a,"b.c",222) print 'a.b.c', a.b.c #==> 222 ; Ok. print 'getattr(a, "b.c")', getattr(a, "b.c") #==> 222 ; Ok. print 'getattr(a.b, "c")', getattr(a.b, "c") #==> 222 ; Ok. setattr(a,"b.c.d.e",444) print 'a.b.c.d.e', a.b.c.d.e #==> 444 ; Ok. print 'getattr(a,"b.c.d.e")', getattr(a,"b.c.d.e") #==> 444 ; Ok. print 'getattr(a.b,"c.d.e")', getattr(a.b,"c.d.e") #==> 444 ; Ok. print 'getattr(a.b.c,"d.e")', getattr(a.b.c,"d.e") #==> 444 ; Ok.
# --- end code
On s'amuse bien ici ... je crois que j'ai bien fait de venir ! En région parisienne, il fait beau ... je vais me balader.
Bonne fin de dimanche !
K.
Deux questions, pour ne rien gagner du tout (sinon un peu de temps ou de satisfaction) : - pourquoi la syntaxe setattr(c,"a.b",333) ne passe-t'elle pas comme souhaitée ? - où est passée la valeur affectée (le 333) ?
Bon dimanche pluvieux à tous. Moi, je vais me baigner...
Michel Claveau
Méta-MCI \(MVP\)
Bonsoir !
Bravo à tous les deux. Vous avez correctement repéré le piège. Jonathan a bien vu la différence entre les propriétés "a.b" et a.b ; et K. a proposé une façon de faire qui élimine ce problème, qui devrait plaire à Bruno Desthuilliers et son amour (justifié) du protocole descripteur.
@+
MCI
Bonsoir !
Bravo à tous les deux.
Vous avez correctement repéré le piège. Jonathan a bien vu la différence
entre les propriétés "a.b" et a.b ; et K. a proposé une façon de faire
qui élimine ce problème, qui devrait plaire à Bruno Desthuilliers et son
amour (justifié) du protocole descripteur.
Bravo à tous les deux. Vous avez correctement repéré le piège. Jonathan a bien vu la différence entre les propriétés "a.b" et a.b ; et K. a proposé une façon de faire qui élimine ce problème, qui devrait plaire à Bruno Desthuilliers et son amour (justifié) du protocole descripteur.