473,386 Members | 1,720 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,386 software developers and data experts.

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
Jul 7 '08 #1
4 1372
On 7 Jul., 08:01, Rotlaus <rotl...@gmail.comwrote:
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?
Jul 8 '08 #2
Rotlaus schrieb:
On 7 Jul., 08:01, Rotlaus <rotl...@gmail.comwrote:
>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
Jul 8 '08 #3
Diez B. Roggisch <deets <atnospam.web.dewrites:
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)
Jul 8 '08 #4
Andre Adrian wrote:
Diez B. Roggisch <deets <atnospam.web.dewrites:
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
Jul 8 '08 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Roman Yakovenko | last post by:
Hi. I have small problem and I don't know solution. The problem: every class imported from some module X should not allow to be modified ( modified == adding or deleting new class attributes ). ...
3
by: Eric | last post by:
Slightly off topic, i know, but here goes: I'm trying to xlate a module of mine to C++. Only problem is, it makes heavy use of "setattr". Anyone know a straightforward way to do "setattr" in C++...
4
by: Gerson Kurz | last post by:
I stumbled across this (while using my homebrewn enum class): class test: pass instance = test() setattr(instance, "THIS :*2+~# IS OBVIOUSLY INVALID", 123) I would've expected some kind of...
5
by: kramb64 | last post by:
I'm trying to use setattr inside a module. From outside a module it's easy: import spam name="hello" value=1 setattr(spam, name, value) But if I want to do this inside the module spam...
4
by: Alex | last post by:
I apologize for asking maybe a very trivial question. I have a new class object A with slots. One of the slots is, for example, object spam. Object spam, in turn, also has slots and one of them...
10
by: Paulo da Silva | last post by:
Hi! In a class C, I may do setattr(C,'x',10). Is it possible to use getattr/setattr for variables not inside classes or something equivalent? I mean with the same result as exec("x=10"). ...
6
by: Donn Ingle | last post by:
Hi, Here's some code, it's broken: class Key( object ): def __init__(self): self.props = KeyProps() def __getattr__(self, v): return getattr( self.props,v ) def __setattr__(self,var,val):
4
by: maestro | last post by:
Why are these functions there? Is it somehow more idiomatic to use than to do obj.field ? Is there something you can with them that you can't by obj.field reference?
5
by: Bojan Mihelac | last post by:
Hi all - when trying to set some dynamic attributes in class, for example: class A: for lang in : exec('title_%s = lang' % lang) #this work but is ugly # setattr(A, "title_%s" % lang, lang) #...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.