views:

181

answers:

1

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 ?

+7  A: 

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:

  • If a target was included in the with statement, the return value from __enter__() is assigned to it.

Currently, it has no return statement, so g gets bound to None (the default return value)

Brian
+1: referencing the documentation
S.Lott