Google
 
Webnews.only-4-geeks.com
Interesting places
news.only-4-geeks.com Forum Index » Python

extended setattr()

 
Jump to:  
 
Rotlaus
PostPosted: Mon Jul 07, 2008 6:01 am    Post subject: extended setattr()
       
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
 

 
Diez B. Roggisch
PostPosted: Tue Jul 08, 2008 4:29 am    Post subject: Re: extended setattr()
       
Rotlaus schrieb:
Quote:
On 7 Jul., 08:01, Rotlaus <rotl...@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
 

 
Rotlaus
PostPosted: Tue Jul 08, 2008 6:27 am    Post subject: Re: extended setattr()
       
On 7 Jul., 08:01, Rotlaus <rotl...@gmail.com> wrote:
Quote:
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

Quote:
import test
a = A()
Traceback (most recent call last):

File "<stdin>", line 1, in <module>
NameError: name 'A' is not defined
Quote:
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?
 

 
Andre Adrian
PostPosted: Tue Jul 08, 2008 10:59 am    Post subject: Re: extended setattr()
       
Diez B. Roggisch <deets <at> nospam.web.de> writes:

Quote:
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?

Quote:
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)
 

 
Diez B. Roggisch
PostPosted: Tue Jul 08, 2008 3:25 pm    Post subject: Re: extended setattr()
       
Andre Adrian wrote:

Quote:
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.

Quote:
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
 

Page 1 of 1 .:.

Google
 
Webnews.only-4-geeks.com

Windows Update | C++ | C | PHP | JavaScript | Photoshop | Programming | Windows 2000 | Python | Windows XP | Object | Flash | Flash - ActionScript | Paint Shop Pro | Excel | PowerPoint | Access | Word | Windows 98 | Internet Explorer 6.0 | CorelDraw12 | Java | XML | asm x86 | Linux Mandrake | Linux RedHat | Outlook |  | news from newsgroups |_ | s

Web Templates

Awesome Website Templates ©

konferencje i szkolenia marmin bay In vitro bmw wrocław koszulki