[Tutor] Code structure help

Peter Otten __peter__ at web.de
Fri Mar 11 15:57:20 CET 2011


Martin De Kauwe wrote:

> Note I have cross posted this as I have only just found this mailing list
> and perhaps it is the more appropriate place (I am not sure)?

I think your question is appropriate for both lists, it just wasn't sexy 
enough for anyone on c.l.py to answer ;)
 
> I have been working on re-writing a model in python. However I am not sure
> how easy on the eye my final structure is and would appreciate any
> constructive comments/suggestions. So broadly the model estimates how
> plants grow using a number of related sub functions which I have grouped
> into classes and they all live in separate files. My main issue at the
> moment is I think I have a lot of verbose class instances but I really
> can't see a better way to do it. Is there a better way? How do other
> people do similar things? I am talking largely about the instances in the
> method run_sim

Random remarks:

>         pg = PlantGrowth(self.control, self.params, self.state,
>                                         self.fluxes, self.met_data)

I'd prefer your code to be even more verbose here; no two-letter variables 
for anything that is non-generic. 

>             # plant growth
>             pg.grow(project_day, self.date, leafnc)

With the construction in mind that is actually

>             # plant growth
>             plant_growth.grow(project_day, self.date, leafnc)

but plant_grows.grow() does not make a lot of sense, and the comment is 
superfluous as it just undoes the abbreviation instead of explaining what is 
going on.

>         for i in self.met_data.doy:
>             project_day = i - 1

>             self.increment_date()

I'd iterate over the project_day-s directly if possible

        for project_day in self.project_days():
            ...

>             # calculate model decay rates
>             dc.decay_rates()

A lot of methods don't take any arguments and return nothing. I'm guessing 
that they modify the state that you passed to the initializer. I prefer 
these modifications to be explicit if feasible, e. g.

             state = dc.decay_rates(state)

where of course state is a placeholder for the actual variables that are 
necessary to do the calculations.

The big picture? I'll leave that for someone else.



More information about the Tutor mailing list