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. I came across something similar when using Pythoncard, because Pythoncard stores widgets as a dictionary. To crate a widget via a method in your card, you'd use - self.components.myButton = {'properties'} But to generate widgets based on data input, I'd use a dictionary generated by the data - a = raw_input('name? ') widgDict = {a: {dict of properties}} for (key, val) in widgDict.items(): self.components[key]=val (Which incidentally is why Pythoncard rocks) So yeah, hope that helps a wee bit. Regards, Liam Clarke On Tue, 15 Feb 2005 17:19:37 -0500, Brian van den Broek <[EMAIL PROTECTED]> wrote: > Hi all, > > I'm still plugging away at my project of writing code to process > treepad files. (This was the task which I posted about in the recent > "help with refactoring needed -- which approach is more Pythonic?" > thread.) > > My present problem is how best to reorganize a long (20 elements) elif > chain. The file format I am dealing with organizes itself with a file > header, and then a series of nodes. Each node has a header filled with > up to 20 different metadata elements, followed by the node content > proper. These metadata elements can be in arbitrary order, and need > not all be present. > > My Node class defines a _parse method which separates out the node > header, and sends those lines to a _parse_metadata method. This is > where the elif chain occurs -- each line of the metadata starts with a > tag like "dt=" and I need to recognize each tag and set the > appropriate Node object attribute, such as .document_type. (I do not > want to rely on the unhelpful names for the tags in the file format, > preferring more self-documenting attribute names.) > > I've come up with *a* way to use a dictionary dispatch, but I'll wager > a great deal it isn't the *best* way. > > Here is a minimal illustration of what I have come up with: > > <code> > class A: > > def __init__(self): > > self.something = None > self.something_else = None > self.still_another_thing = None > > def update(self, data): > > > metadata_dict = {'something_tag=': 'something', > '2nd_tag=': 'something_else', > 'last=': 'still_another_thing'} > > a = A() > print a.still_another_thing > a.update('last=the metadata value for the "last=" metadata tag') > print a.still_another_thing > </code> > > <output> > >>> > None > the metadata value for the "last=" metadata tag > </output> > > So, it works. Yay :-) > > But, should I be doing it another way? > > Also, I know the general security concerns about things like exec. > They make me nervous in using it, even though I am (as yet) the sole > user. Am I right in thinking that the constrained way I am using it > here protects me? My code uses most of the attributes as a simple > storage container for later rewriting of the file, but in a few cases > they enter into (safe seeming) conditionals like: > > if 'text' == self.document_type: > self.do_text_stuff() > if 'RTF' == self.document_type: > self.do_RTF_stuff() > > Thanks and best to all, > > Brian vdB > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > -- 'There is only one basic human right, and that is to do as you damn well please. And with it comes the only basic human duty, to take the consequences. _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor