Domanda

Di recente ho iniziato a studiare Python e ho raggiunto l'istruzione con . Ho provato a usarlo con un'istanza di classe, ma penso che sto facendo qualcosa di sbagliato. Ecco il codice:


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

Il fatto è che quando l'interprete raggiunge il metodo ok all'interno dell'istruzione with, viene sollevata la seguente eccezione:


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

Perché l'oggetto g ha il tipo NoneType? Come posso utilizzare un'istanza con l'istruzione with ?

È stato utile?

Soluzione

Il tuo metodo __enter__ deve restituire l'oggetto che dovrebbe essere usato per " come g " parte della dichiarazione with. Consulta la documentazione , dove afferma:

  • Se una destinazione è stata inclusa nell'istruzione with, viene assegnato il valore restituito da __enter __ () .

Attualmente non ha alcuna dichiarazione di ritorno, quindi g viene associato a None (il valore di ritorno predefinito)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top