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

Pour occuper le dimanche

3 réponses
Avatar
Méta-MCI \(MVP\)
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:\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...

Michel Claveau

3 réponses

Avatar
Jonathan Ballet
Bonjour,

Le Sun, 29 Jun 2008 10:03:46 +0200, "Méta-MCI (MVP)" <enleverlesX.Xm 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 :



Il fait très (trop ?) beau à Grenoble en tout cas :)

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 ?



Ça dépend ce que tu appelles "comme souhaitée" : là, tu as ajouté un attribut qui s'appelle "a.b"
à l'objet "c", comme tu as ajouté des attributs nommés "a" e t "b" dans les exemples d'avant.

Effectivement, tu ne peux pas le récupérer en faisant "c.a.b", pu isque Python va essayer d'accéder
à l'attribut b de l'objet a qui est accédé lui comme attribu t de l'objet c.
Imagine, si tu faisais un `setattr(c, "a.b.c.d.e.f.g.h", 333)`, qu'est-ce q ue `getattr(c,
"a.b.c.d")` (par exemple) te retournerais ?

- où est passée la valeur affectée (le 333) ?



Comme je l'ai dis au dessus, elle est stockée dans l'attribut nommà © "a.b" de l'objet "c". Tu peux
donc faire :

getattr(c, "a.b")






333

Plus en détails :

class X(object): pass






...
x = X()
x.__dict__






{}
setattr(x, "a", 1)
x.__dict__






{'a': 1}
setattr(x, "a.b", 2)
x.__dict__






{'a': 1, 'a.b': 2}
x.a






1
x.a.b






Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'b'
getattr(x, "a.b")






2


Bonne journée,

- Jonathan
Avatar
Kobayashi
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...

Michel Claveau






Avatar
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