|  | extended setattr() |  | |
| | | Rotlaus |  |
| Posted: 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 |  |
| Posted: 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 |  |
| Posted: 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 |  |
| Posted: 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 |  |
| Posted: 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 |
| |
|
|