Brendan wrote: > Hi all > > I'm new to Python (and programming in general), and I can't decide what > is the most 'pythonic' way to approach a problem. Your advice would be > appreciated. > > I have a bunch of 'scans', containing the data measured from one of > several types of 'model'. Each 'model' has different values for a list > of constants I want to create 'analyses' which interpret the data from > the scans, with reference the appropriate model. So far, I have come > up with three strategies to store this information, illustrated below > (I've simplified the constant list to just two): > > 1) Store the model constants as class instances: > > class Model: > def __init__(self, numBumps, sizeOfBumps): > self.__dict__.update(locals()); del self.self > > MODEL1 = Model(1, 2) > MODEL2 = Model(3, 4) > #etc
My vote would go with this one, as it is the closest to a C-style struct or a Pascal record. If you have to change the field list, you only need to change it in one place, the class. > 2) Store the model constants as class variables: > > class MODEL1: > numBumps = 1 > sizeOfBumps = 2 > > class MODEL2: > numBumps = 3 > sizeOfBumps = 4 Duplicated data... yuck. Same with method 3. > There may be more options, but at this point I became paralyzed with > choice. I worry about getting stuck with an unworkable structure since > I don't have the experience to decide the merits of each in advance. I > get way too frustrated about these things :) :-) If all the constants have the same field structure, stick with method 1. In a later post, you wrote: > The reason I'm using that method for assigning > instance attributes is that the argument list for > __init__ is LOOONG. (There are many constants, I only > gave two for the examples). I wanted to avoid typing > them out twice. You could always copy-and-paste... How many is LOOONG? Ten? Twenty? One hundred? If it is closer to 100 than to 10, I would suggest putting your constants into something like an INI file: [MODEL1] # or something more meaningful numBumps: 1 sizeOfBumps: 99 [MODEL2] numBumps: 57 sizeOfBumps: 245 etc. Then sub-class the ConfigParser to create struct-like objects from an ini file. Something vaguely like: # warning: pseudo-code, seriously not tested!!! class Config2Consts(ConfigParser): """Reads an INI file, and creates a struct-like object from each section, storing that object in the local scope with the name of the section. """ class Struct: def __init__(self): pass def make_single_constant_object(self, sectionname): obj = Struct() for field in INI_FILE[sectionname]: obj.__dict__[field.name] = field.value locals().update({sectionname: obj}) If you are likely to be changing the constants (either names, field names, or values) an hour or three developing this code will save you a lot of heart-ache later. -- Steven. -- http://mail.python.org/mailman/listinfo/python-list