I’ve recently started to learn python , and I reached the with statement . I’ve tried to use it with a class instance , but I think I’m doing something wrong . Here is the code :
from __future__ import with_statement import pdb class Geo: def __init__(self,text): self.text = text def __enter__(self): print 'entering' def __exit__(self,exception_type,exception_value,exception_traceback): print 'exiting' def ok(self): print self.text def __get(self): return self.text with Geo('line') as g : g.ok()
The thing is that when the interpreter reaches the ok method inside the with statement , the following exception is raised :
Traceback (most recent call last): File 'dec.py', line 23, in g.ok() AttributeError: 'NoneType' object has no attribute 'ok'
Why does the g object have the type NoneType ? How can I use an instance with the with statement ?
Your
__enter__method needs to return the object that should be used for the ‘as g‘ part of the with statement. See the documentation, where it states:__enter__()is assigned to it.Currently, it has no return statement, so g gets bound to
None(the default return value)