[Tutor] dictionary dispatch for object instance attributes question

Brian van den Broek bvande at po-box.mcgill.ca
Wed Feb 16 01:11:03 CET 2005


Liam Clarke said unto the world upon 2005-02-15 18:08:
> Hi Brian, why not take it the next step and 
> 
>>        for key in metadata_dict:
>>            if data.startswith(key):
>>                 exec('''self.%s = """%s"""''' %(metadata_dict[key],
>>                      data[len(key):]))
>>                # triple quotes as there may be quotes in metadata
>>                 # values
>>                break
> 
> 
> self.foo = {}
> 
> for key in metadata_dict.keys():  #? I got confused, so I guessed.
>    if data.startswith(key):
>             self.foo[metadata_dict[key]]=data[len(key):]
> 
> And then instead of self.x (if metadata_dict[key] = x] You just call
> self.foo['x']
> 
> A bit more obfuscated, but it would seem to remove the exec, although
> I'm not sure how else it impacts your class.

<SNIP related Pythoncard example>


> So yeah, hope that helps a wee bit.
> 
> Regards, 
> 
> Liam Clarke

and

Rich Krauter said unto the world upon 2005-02-15 18:09:

 > Brian,
 >
 > You could use setattr(self,metadata_dict[key],data[len(key):]).
 >
 > Rich


Hi Liam, Rich, and all,

thanks for the replies. (And for heroically working through the long 
question -- if there is a tutee verbosity award, I think its mine ;-)

Rich: thanks. setattr, yeah, that's the ticket!

Liam: The reason I didn't want to take it this way is: "Flat is better 
than nested" :-)

The code I am working on is an improved (I hope ;-) ) and expanded 
class-based version of some more primitive code I had done purely 
procedurally. There, I had a dictionary approach for storing the 
metadata (akin to the self.foo dictionary you suggested above). One of 
the benefits of going OOP, in my opinion, is that instead of using 
dictionary access syntax, you can just say things like 
self.document_type. It might be little more than sugar[*], but I've a 
sweet tooth, and I'd want to avoid going back to the dictionary syntax 
if I could.

Though, absent the setattr way that Rich pointed to, I must admit the 
exec in my originally posted version would have me dithering whether 
to opt for sugar or safety. Thankfully, it's all moot.

[*] In that, if I've understood correctly, class namespaces are just 
fancily packaged dictionaries.

Thanks to all,

Brian vdB



More information about the Tutor mailing list