|
Prev: VNC capture in python
Next: Validation in plone
From: Rotlaus on 7 Jul 2008 02:01 2 weeks ago i asked for a etended getattr() which worked really fine, but now i would love to have a extended setattr() as well. Lets assume i have some classes: class A(object): def __init__(self): self.B = B() class B(object): def __init__(self): self.C = C() class C(object): def __init__(self, foo='', bar=''): self.foo = foo self.bar = bar and now i wanna do something like this: a=A() ext_setattr(a, 'B.C', ('a', 'b')) Is this possible? It would also be nice if the attributes would be created if they not exist, always implying that objectname==objecttype. Kind regards, Andre
From: Rotlaus on 8 Jul 2008 02:27 On 7 Jul., 08:01, Rotlaus <rotl...(a)gmail.com> wrote: > 2 weeks ago i asked for a etended getattr() which worked really fine, > but now i would love to have a extendedsetattr() as well. I've tried the following, but it doesn't work: class A(object): def __init__(self): self.B = B() class B(object): def __init__(self): self.C = C('foo') class C(object): def __init__(self, txt=''): self.txt = txt def ext_setattr(obj, attr, val): for subattr in attr.split("."): obj = getattr(obj, subattr) obj = val >>> import test >>> a = A() Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'A' is not defined >>> a = test.A() >>> a.B.C.txt 'foo' >>> ext_setattr(a, 'B.C.txt', 'bar') >>> a.B.C.txt 'foo' What am i doing wrong?
From: Diez B. Roggisch on 8 Jul 2008 02:29 Rotlaus schrieb: > On 7 Jul., 08:01, Rotlaus <rotl...(a)gmail.com> wrote: >> 2 weeks ago i asked for a etended getattr() which worked really fine, >> but now i would love to have a extendedsetattr() as well. > > I've tried the following, but it doesn't work: > > class A(object): > def __init__(self): > self.B = B() > > class B(object): > def __init__(self): > self.C = C('foo') > > class C(object): > def __init__(self, txt=''): > self.txt = txt > > def ext_setattr(obj, attr, val): > for subattr in attr.split("."): > obj = getattr(obj, subattr) > obj = val > >>>> import test >>>> a = A() > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > NameError: name 'A' is not defined >>>> a = test.A() >>>> a.B.C.txt > 'foo' >>>> ext_setattr(a, 'B.C.txt', 'bar') >>>> a.B.C.txt > 'foo' > > What am i doing wrong? obj = val won't work. You need to use a setattr(obj, name, val) on the last attribute-name. Diez
From: Andre Adrian on 8 Jul 2008 06:59 Diez B. Roggisch <deets <at> nospam.web.de> writes: > > def ext_setattr(obj, attr, val): > > for subattr in attr.split("."): > > obj = getattr(obj, subattr) > > obj = val > > > >>>> import test > >>>> a = A() > > Traceback (most recent call last): > > File "<stdin>", line 1, in <module> > > NameError: name 'A' is not defined > >>>> a = test.A() > >>>> a.B.C.txt > > 'foo' > >>>> ext_setattr(a, 'B.C.txt', 'bar') > >>>> a.B.C.txt > > 'foo' > > > > What am i doing wrong? > > obj = val won't work. Why is this so? Shouldn't it be the same? > You need to use a setattr(obj, name, val) > on the last attribute-name. Ok, so this works: def ext_setattr(obj, attr, val): attributes = attr.split('.') for subattr in attributes[:-1]: obj = getattr(obj, subattr) setattr(obj, attributes[-1], val)
From: Diez B. Roggisch on 8 Jul 2008 13:25 Andre Adrian wrote: > Diez B. Roggisch <deets <at> nospam.web.de> writes: > >> > def ext_setattr(obj, attr, val): >> > for subattr in attr.split("."): >> > obj = getattr(obj, subattr) >> > obj = val >> > >> >>>> import test >> >>>> a = A() >> > Traceback (most recent call last): >> > File "<stdin>", line 1, in <module> >> > NameError: name 'A' is not defined >> >>>> a = test.A() >> >>>> a.B.C.txt >> > 'foo' >> >>>> ext_setattr(a, 'B.C.txt', 'bar') >> >>>> a.B.C.txt >> > 'foo' >> > >> > What am i doing wrong? >> >> obj = val won't work. > > Why is this so? Shouldn't it be the same? No, of course not! obj = val binds the object reffered to by val to the LOCAL name obj. That's python 101, make sure you get variables/names and scopes proper. >> You need to use a setattr(obj, name, val) >> on the last attribute-name. > > Ok, so this works: > > def ext_setattr(obj, attr, val): > attributes = attr.split('.') > for subattr in attributes[:-1]: > obj = getattr(obj, subattr) > setattr(obj, attributes[-1], val) Yep. Diez
|
Pages: 1 Prev: VNC capture in python Next: Validation in plone |