From: Rotlaus on
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
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
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
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
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