Pregunta

Recientemente comencé a aprender Python, y llegué a la declaración con . Intenté usarlo con una instancia de clase, pero creo que estoy haciendo algo mal. Aquí está el 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()

La cuestión es que cuando el intérprete alcanza el método ok dentro de la declaración with, se genera la siguiente excepción:


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

¿Por qué el objeto g tiene el tipo NoneType? ¿Cómo puedo usar una instancia con la declaración con ?

¿Fue útil?

Solución

Su método __enter__ necesita devolver el objeto que debe usarse para " como g " parte de la declaración con. Consulte la documentación , donde dice:

  • Si se incluyó un objetivo en la instrucción with, se le asigna el valor de retorno de __enter __ () .

Actualmente, no tiene una declaración de retorno, por lo que g se vincula a None (el valor de retorno predeterminado)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top