Newbie Alert: Help me store constants pythonically
Francesco Bochicchio
bockman at virgilio.it
Sun Nov 6 12:49:39 EST 2005
Il Sun, 06 Nov 2005 08:33:17 -0800, Brendan ha scritto:
> 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
>
> class Analysis:
> def __init__(self, scanData, model):
> #do analysis
>
> 2) Store the model constants as class variables:
>
> class MODEL1:
> numBumps = 1
> sizeOfBumps = 2
>
> class MODEL2:
> numBumps = 3
> sizeOfBumps = 4
>
> class Analysis:
> #as with 1
>
> 3) Store the model constants as class variables of the analysis class:
>
> class Model1Analysis:
> numBumps = 1
> sizeOfBumps = 2
>
> def __init__(self, scanData):
> #do analysis
>
> class Model2Analysis(Model1Analysis):
> numBumps = 3
> sizeOfBumps = 4
>
> 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 :)
> Brendan
My vote would go to the first option, but I don't understand why you use
such a complicate way to set instance attributes. I would do simply
class Model:
def __init__(self, numBumps, sizeOfBumps):
self.numBumps = numBumps
self.sizeofBumps = sizeOfBumps
or, if you want to generalize the arguments of the constructor:
class Model:
def __init__(self, **model_attributes):
for attname, attvalue in model_attributes.items():
setattr(self, attname, attvalue)
As for why to choose the first option... is the one that causes you to
avoid useless code repetitions and to keep the Analysis code nicely
generic.
Ciao
-----
FB
More information about the Python-list
mailing list