dynamic type changing

andychambers2002 at yahoo.co.uk andychambers2002 at yahoo.co.uk
Sat May 27 10:33:28 EDT 2006


I'm working on a "TempFile" class that stores the data in memory until
it gets larger than a specified threshold (as per PEP 42).  Whilst
trying to implement it, I've come across some strange behaviour.  Can
anyone explain this?

The test case at the bottom starts a TempFile at size 50 and prints its
type.  It then increases the size to the threshold at which point
"self" is changed to being a TemporaryFile.  It seems that the next
call correctly uses the write() method of TemporaryFile (since we don't
see "changing type" in the output).  However, type(tmp) still equals
TempFile.  Not only that, tmp can still access the method dummy() that
exists only in TempFile.

#!/usr/bin/env python
from StringIO import StringIO
import tempfile

class TempFile(StringIO, object):
    """A temporary file implementation that uses memory unless
       either capacity is breached or fileno is requested, at which
       point a real temporary file will be created and the relevant
       details returned
    """
    def __init__(self, buffer, capacity):
        """Creates a TempFile object containing the specified buffer.
        If capacity is specified, we use a real temporary file once the

        file gets larger than that size.  Otherwise, the data is stored

        in memory.
        """
        self.capacity = capacity
        if len(buffer) > capacity:
            self = tempfile.TemporaryFile()
            self.write(buffer)
        else:
            super(TempFile, self).__init__(buffer)

    def dummy(self):
        pass

    def write(self, str):
        self.seek(0, 2)  # find end of file
        if((self.tell() + len(str)) >= self.capacity):
            print "changing type"
            flo = tempfile.TemporaryFile()
            flo.write(self.getvalue())
            self = flo
            print type(self)
        else:
            super(TempFile, self).write(str)


print "testing tempfile:"
tmp = TempFile("", 100)
ten_chars = "1234567890"
tmp.write(ten_chars * 5)
tmp.dummy()
print "tmp < 100: " + str(type(tmp))
tmp.write(ten_chars * 5)
tmp.dummy()
print "tmp == 100: " + str(type(tmp))
tmp.write("the last straw")
tmp.dummy()
print "tmp > 100: " + str(type(tmp))




More information about the Python-list mailing list