[Tutor] String Encoding problem

Martin Walsh mwalsh at mwalsh.org
Mon Apr 20 23:05:01 CEST 2009


Forwarding to the list. Matt, perhaps you can repost in plain text, my
mail client seems to have mangled your source ...

Strax-Haber, Matthew (LARC-D320) wrote:
>> *From: *Martin Walsh <mwalsh at mwalsh.org>
>>
>> The environment available to __del__ methods during program termination
>> is wonky, and apparently not very consistent either. I can't say that I
>> completely understand it myself, perhaps someone else can provide a
>> better explanation for both of us, but some of the causes are described
>> in the documentation:
>>
>> http://docs.python.org/reference/datamodel.html#object.__del__
>>
>> What is your rationale for using __del__? Are you trying to force a
>> 'commit()' call on Database instances when your program terminates -- in
>> the case of an unhandled exception, for example?
> 
> Perhaps I oversimplified a bit. In my actual code, there is a database
> class and an operator class. The actual structure is this:
> 
> In operator:
>     def __init__(self, path, saveDB=True, cleanUp=True):
>        '''Constructor'''        ## Calculate filesystem paths
>        self.WORK_DIR    = path + '.tmp'        DB_PATH            = path
> + '.xml'        self.SAVE_DB    = saveDB    ## finish(): Delete
> unnecessary files created by run?        self.CLEANUP    = cleanUp    ##
> finish(): Delete database at end of run?                ## Make sure we
> have a working directory (exception on failed write)        if not
> os.path.isdir(self.WORK_DIR):            os.mkdir(self.WORK_DIR)
> 
>        self._db             = DB.Database(DB_PATH)
>         ## SOME OTHER ENVIRONMENT SETUP STUFF
>     def _cleanUpEnvironment(self):          try:            ## Delete
> temp files created for this run            for path,dirs,files in
> os.walk(self.WORK_DIR, topdown=False):                for f in files:
>    os.unlink(os.path.join(path,f))                for d in dirs:
>    os.rmdir(os.path.join(path,d))            os.rmdir(self.WORK_DIR)
>        except:            print >>sys.stderr, 'Could not delete temp
> files; left at:'            print >>sys.stderr, self.WORK_DIR    def
> finish(self):            '''Clean up and finish the run (write out to
> the database)'''            if self.SAVE_DB:        self._db.commit()
>            if self.CLEANUP:        self._cleanUpEnvironment()
>     def __del__(self):        ## FIXME: Known bug:        ##  del t at
> command line works properly        ##  Ctrl-D, when there is no db file
> present, results in a LookupError        self.finish()
> if __name__ == '__main__':
>     printHelp()
>     ## Provide tab completion to the user    import readline,
> rlcompleter    readline.parse_and_bind('tab: complete')
>     t    = OperatorClassName(os.path.splitext(__file__)[0])
> 
> In database:
>     def commit(self):        '''Write the database back to the file'''
>        ## Noticed exceptions: IOError
>        ET.ElementTree(self.root).write(self.__dbpath)
> 
> The operator also has a series of functions that collect data and enter
> it into the database. Here’s the usage pattern I want to have:
> 
> User calls Operator.py. User runs a bunch of functions of the form
> t.<someFunc>(<args>). When the user quits, the database will save or not
> save depending on the status of t.SAVE_DB (which some functions in the
> operator will programmatically change).
> 
>>
>> HTH,
>> Marty
>>
>>>
>>> Thank you very much. Any and all help or pointers are appreciated.
>>>
>>> ~Matt
>>>
>>> #### db.py ###
>>> from xml.etree import ElementTree as ET
>>> import os
>>>
>>> class Database(object):
>>>     def __init__(self, path):
>>>         self.__dbpath = path    ## Path to the database
>>>         self.load()
>>>     def __del__(self):
>>>         ## FIXME: Known bug:
>>>         ##  del db at command line works properly
>>>         ##  Ctrl-D, when there is no db file present, results in a
>>> LookupError
>>>         ##    and empty xml file
>>>         from StringIO import StringIO
>>>         from traceback import print_exc
>>>         trace = StringIO()
>>>         try:
>>>             print 5
>>>             self.commit()
>>>             print 7
>>>         except Exception:
>>>             print_exc(100, trace)
>>>             print trace.getvalue()
>>>     def load(self):
>>>         if os.path.exists(self.__dbpath):
>>>             self.root = ET.parse(self.__dbpath).getroot()
>>>         else:
>>>             self.root = ET.Element("root")
>>>     def commit(self):
>>>         ET.ElementTree(self.root).write(self.__dbpath)
>>> db = Database('db.xml')
>>
>> _______________________________________________
>> Tutor maillist  -  Tutor at python.org
>> http://mail.python.org/mailman/listinfo/tutor
> 
> -- 
> ~Matthew Strax-Haber
> National Aeronautics and Space Administration
> Langley Research Center (LaRC)
> Co-op, Safety-Critical Avionics Systems Branch
> W: 757-864-7378; C: 561-704-0029
> Mail Stop 130
> Matthew.Strax-Haber at nasa.gov



More information about the Tutor mailing list