On Tue, 2007-02-27 at 17:46 +1100, Edward d'Auvergne wrote:
> If you'd like to see some functional code, I've tied a number of ideas
> into the 'error_import' branch.  I've renamed 'error.py' to
> 'relax_error.py' and spun off the RelaxWarnings into
> 'relax_warnings.py'.  This is to avoid a clash with the python warning
> module 'warnings'.  Also I think that for our sanity rather than
> importing individual errors and warnings we should use the lines:
> 
> from relax_errors import *
> from relax_warnings import *
> 
> This can be placed at the start of each relax module.  The test branch
> is still missing many of these import statements and the Debug flag is
> not yet accessible to all the necessary functions.  For the unit tests
> which catch and test the triggering of RelaxErrors, we will need to
> import the RelaxErrors into the unit test module as well.  What do you
> think of this 'error_import' implementation?  Chris, have you been
> working on an alternative implementation?
> 
> Edward

This looks like a clean solution to the problem.

Chris


> 
> 
> On 2/27/07, Edward d'Auvergne <[EMAIL PROTECTED]> wrote:
> > On 2/27/07, Chris MacRaild <[EMAIL PROTECTED]> wrote:
> > > On Mon, 2007-02-26 at 23:32 +1100, Edward d'Auvergne wrote:
> > > > I've been spending some time thinking about the problem and all the
> > > > required changes.  Gary, what do you think about the following
> > > > proposal?  The debug, warn, and pedantic flags could be stored in
> > > > self.relax rather than __builtin__ (or could be passed the relevant
> > > > functions, methods, or classes).  The RelaxErrors could be changed so
> > > > that they are not nested and individual RelaxErrors could be imported
> > > > by the module requiring the error class (rather than importing *).
> > > > The RelaxWarnings could be similarly modified and shifted into the new
> > > > module 'warnings.py'.
> > >
> > > I agree that this looks like the best approach to the problem.
> > >
> > > > The issue with this approach is that the debug
> > > > flag is used by the individual RelaxErrors.  These objects are normal
> > > > python error objects (subclassed from the Exception class) which are
> > > > called with the following syntax:
> > > >
> > > > if bad:
> > > >     raise RelaxError, "This is a bad error."
> > > >
> > > > This instantiates the class, executing the self.__init__() function.
> > > > To get access to the debug flag in this function we could set a global
> > > > 'Debug' flag within the 'error.py' module (which defaults to 0 or
> > > > False).  This flag can then be set by the 'Relax' class within the
> > > > file 'relax' when parsing the command line arguments.
> > >
> > > We need to do more than just make the debug flag availible, because the
> > > relax exceptions need access to the interpreter in order to save state.
> > > The solution is a simple function in errors.py that drops the Relax
> > > instance into BaseError, then each relax exception will inherit from
> > > there. Something like:
> > >
> > > def setupErrors(relax):
> > >     mod = sys.modules[__name__]
> > >     setattr(mod.BaseError, '_relax', relax)
> > >
> > >
> > > Alternatively relax could be stored in a variable of the module:
> > >
> > > _relax
> > > def setupErrors(relax):
> > >     global relax
> > >     _relax = relax
> >
> > The problem for the unit tests is that there will be no relax instance
> > in the first place.    We could take the second approach but set the
> > global 'relax' variable to None.  Then we can use if statements to set
> > up a dummy self.save_state() function in BaseError.  I would try a
> > different approach which utilises much of the current code.  I don't
> > think a setup function, similar to my kludgy self.__init__() code of
> > the RelaxErrors class in which all other RelaxErrors are nested, is
> > necessary and detracts from the simplicity of importing a specific
> > RelaxError.  My suggestion would be:
> >
> > -----
> >
> > relax = None
> > Debug = False
> >
> >
> > # Base class for all errors.
> > ############################
> >
> > class BaseError(Exception):
> >     def __str__(self):
> >         return ("RelaxError: " + self.text + "\n")
> >
> >
> >     def save_state(self):
> >         """Function for saving the program state."""
> >
> >         # Dummy function.
> >         if not relax:
> >             return
> >
> >         # Append the date and time to the save file.
> >         now = time.localtime()
> >         file_name = "relax_state_%i%02i%02i_%02i%02i%02i" % (now[0],
> > now[2], now[1], now[3], now[4], now[5])
> >
> >         # Save the program state.
> >         relax.interpreter._State.save(file_name)
> >
> >
> > # Standard errors.
> > ##################
> >
> > class RelaxError(BaseError):
> > ...
> >
> > -----
> >
> > I'll make a branch from the 1.3 line to test this code.
> >
> >
> > > The much bigger issue is the question of whether it is appropriate to be
> > > passing the Relax instance about as we do. That, I suspect, is a debate
> > > for another day ...
> >
> > It isn't the Relax instance which is passed as a copy but rather a
> > pointer to it.  Having 'self.relax' as a pointer to the Relax instance
> > within most of relax allows access to the methods and data storage
> > structures from anywhere within relax.  I don't know if this is an
> > anti-pattern (http://en.wikipedia.org/wiki/Anti-pattern or
> > https://mail.gna.org/public/relax-devel/2007-01/msg00015.html,
> > Message-id: <[EMAIL PROTECTED]>),
> > but it does work well.  It allows the code in 'generic_fns' and
> > 'specific_fns' to access or modify the relax data structures.
> >
> > We could change this behaviour so that only the data currently in
> > 'self.relax.data' is passed to all the necessary relax classes and
> > then we could use import statements for all the cross talk.  I would
> > however suggest we sit on the idea until the redesign
> > (https://mail.gna.org/public/relax-devel/2006-10/msg00053.html,
> > Message-id: <[EMAIL PROTECTED]>)
> > has been completed.  The breakages that this would incur would be
> > significant and core parts of the program would need to be redesigned.
> >  Any changes will require significant planning.
> >
> > Cheers,
> >
> > Edward
> >
> 


_______________________________________________
relax (http://nmr-relax.com)

This is the relax-devel mailing list
[email protected]

To unsubscribe from this list, get a password
reminder, or change your subscription options,
visit the list information page at
https://mail.gna.org/listinfo/relax-devel

Reply via email to