Pergunta

Eu comecei recentemente para aprender python, e eu alcancei o com comunicado. Eu tentei usá-lo com uma instância de classe, mas eu acho que eu estou fazendo algo errado. Aqui está o código:


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

A coisa é que, quando o intérprete atinge o OK método dentro do com a declaração, a seguinte exceção é gerada:


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

Por que o objeto g ter o tipo NoneType? Como posso usar uma instância com o com declaração?

Foi útil?

Solução

Seu método __enter__ precisa retornar o objeto que deve ser usado para a parte "as g" do com a declaração. Veja a documentação, onde ele afirma:

  • Se um alvo foi incluído no com a declaração, o valor de retorno de __enter__() é atribuído a ele.

Atualmente, não tem instrução de retorno, então g fica obrigado a None (o valor de retorno padrão)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top