Class or Dictionary?

Martin De Kauwe mdekauwe at gmail.com
Fri Feb 11 18:45:16 EST 2011


Hi,

yes I read a .INI file using ConfigParser, just similar sections (in
my opinion) to make one object which i can then pass to different
classes. E.G.

class Dict2Obj:
    """ Turn a dictionary into an object.

    The only purpose of this is that I think it is neater to reference
values
    x.soiltemp rather than x['soiltemp'] ;P
    """
    def __init__(self, dict):

        for k, v in dict.items():
            setattr(self, k, v)


class Parser(object):
    """ Load up all the initialisation data.

    Return the met data as an array, perhaps we should really also
return a
    header as well? Return the ini file as various objects.

    """
    def __init__(self, ini_fname, met_fname):

        self.ini_fname = ini_fname
        self.met_fname = met_fname

    def load_files(self):

        # read the driving data in, this may get more complicated?
        met_data = met_data = np.loadtxt(self.met_fname, comments='#')

        # read the configuration file into a different dicts, break up
        # into model_params, control and state
        config = ConfigParser.RawConfigParser()
        config.read(self.ini_fname)

        # params
        model_params = {}
        sections =
['water','nitra','soilp','carba','litter','envir','prodn']
        for section in sections:
            for option in config.options(section):
                model_params[option] = config.getfloat(section,
option)

        # turn dict into an object
        model_params = Dict2Obj(model_params)

        # control
        control = {}
        for option in config.options('control'):
            control[option] = config.getint('control', option)

        # turn dict into an object
        control = Dict2Obj(control)

        initial_state = {}
        sections = ['cinit','ninit','vinit']
        for section in sections:
            for option in config.options(section):
                initial_state[option] = config.getfloat(section,
option)

        # turn dict into objects
        initial_state = Dict2Obj(initial_state)

        return (initial_state, control, model_params,
met_data)

So I would then pass these objects through my code, for example a
given class would just expect to inherit params perhaps.

class calc_weight(object):

    def __init__(self, params):
        self.params = params

There are also "states" that evolve through the code which various
methods of a given class change. For example lets call it elephants
weight. So the model will do various things to predict changes in our
elephants weight, so there will be a class to calculate his/her food
intake etc. Using this example the other thing I wanted to do was pass
"states" around like self.elephant_weight. However it occurred to me
if I just used self.elephant_weight for example it would make it
harder to call individual components seperately, so better to stick to
the same method and using an object i reasoned. Hence I started with
my emptydict thing, I hope that helps make it clearer?

class EmptyObject:
    pass


# generate some objects to store pools and fluxes...
self.pools = EmptyObject()

# add stuff to it
self.pools.elephant_weight = 12.0

thanks for all of the suggestions it is very insightful



More information about the Python-list mailing list