import os
import pickle
class FileDescr(object):
saved=[]
def __init__(self,name=None):
self.name=name
def __get__(self,obj,typ=None):
if self.name not in FileDescr.saved:
raise AttributeError,\
"%r used before assignment" % self.name
try:
f=open(self.name,'r')
val=pickle.load(f)
f.close()
return val
except(pickle.UnpicklingError,IOError,
EOFError,AttributeError,ImportError,IndexError),e:
raise AttributeError,\
"could not read %r:%s" % self.name
def __set__(self,obj,val):
f=open(self.name,'w')
try:
#try:
pickle.dump(val,f)
FileDescr.saved.append(self.name)
except (TypeError,pickle.PicklingError),e:
raise AttributeError,\
"could not pickle %r" %self.name
finally:
f.close
def __delete__(self,obj):
try:
os.unlink(self.name)
FileDescr.saved.remove(self.name)
except (OSError,ValueError),e:
pass
>>> class MyFileVarClass(object):
... foo=FileDescr('foo')
... bar=FileDescr('bar')
...
>>> fvc=MyFileVarClass()
>>> print fvc.foo
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "D:\Debugpython\descr.py", line 13, in __get__
"%r used before assignment" % self.name
AttributeError: 'foo' used before assignment
>>> fvc.foo=42
>>> fvc.bar='lianna'
>>>
>>> print fvc.foo,fvc.bar
42 lianna
>>> del fvc.foo
>>> print fvc.foo,fvc.bar
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "D:\Debugpython\descr.py", line 13, in __get__
"%r used before assignment" % self.name
AttributeError: 'foo' used before assignment
>>> fvc.foo=__builtins__
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "D:\Debugpython\descr.py", line 32, in __set__
"could not pickle %r" %self.name
AttributeError: could not pickle 'foo'
>>>