проблема с использованием экземпляра в with_statement - PullRequest
4 голосов
/ 22 января 2009

Я недавно начал изучать Python и достиг с оператором . Я пытался использовать его с экземпляром класса, но я думаю, что я делаю что-то не так. Вот код:


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()

Дело в том, что когда интерпретатор достигает метода ok внутри оператора with, возникает следующее исключение:


Traceback (most recent call last):
  File "dec.py", line 23, in 
    g.ok()
AttributeError: 'NoneType' object has no attribute 'ok'

Почему данный объект имеет тип NoneType? Как я могу использовать экземпляр с оператором with ?

1 Ответ

12 голосов
/ 22 января 2009

Ваш метод __enter__ должен вернуть объект, который должен использоваться для части "as g" оператора with. См. документацию , где говорится:

  • Если цель была включена в оператор with, ей присваивается возвращаемое значение из __enter__().

В настоящее время у него нет оператора возврата, поэтому g привязывается к None (возвращаемое значение по умолчанию)

...