El objeto se convierte en Ninguno cuando se usa un administrador de contexto

¿Por qué no funciona esto?

class X: var1 = 1 def __enter__(self): pass def __exit__(self, type, value, traceback): pass with X() as z: print z.var1 

Yo obtengo:

 print z.var1 AttributeError: 'NoneType' object has no attribute 'var1' 

Cambia la definición de X a

 class X(object): var1 = 1 def __enter__(self): return self def __exit__(self, type, value, traceback): pass 

with asigna el valor de retorno del método __enter__() al nombre después de as . Su __enter__() devolvió None , que fue asignado a z .

También cambié la clase a una clase de nuevo estilo (que no es fundamental para que funcione).

Vea los documentos para los gestores de contexto:

__enter__( ) Ingrese el contexto de tiempo de ejecución y devuelva este objeto u otro objeto relacionado con el contexto de tiempo de ejecución. El valor devuelto por este método está vinculado al identificador en la cláusula as con declaraciones que usan este administrador de contexto. Un ejemplo de un administrador de contexto que se devuelve a sí mismo es un objeto de archivo. Los objetos de archivo se devuelven a sí mismos desde __enter__() para permitir que se use open() como expresión de contexto en una statement with.

Un ejemplo de un administrador de contexto que devuelve un objeto relacionado es el que devuelve decimal.Context.get_manager() . Estos administradores establecen el contexto decimal activo en una copia del contexto decimal original y luego devuelven la copia. Esto permite que se realicen cambios en el contexto decimal actual en el cuerpo de la statement with sin afectar el código fuera de la instrucción with.

Su método __enter__ no devuelve nada, que es lo mismo que devolver None .