Gerenciador de contexto
Definição : refere-se à
função de objeto que implementa o método de protocolo de gerenciamento de contexto : usado principalmente para liberar recursos (como arquivos abertos, conexões de rede, conexões de banco de dados, bloqueios em objetos, etc.)
Dois métodos do protocolo de gerenciamento de contexto:
** 1__enter __ (self) ** cria e retorna um objeto de recurso que pode ser referenciado para uso pelo programa no bloco de instrução with
** 2__exit __ (self, type, value, tb) ** para sair do contexto Chamado quando, usado principalmente para liberar recursos com segurança
A forma da instrução with usando o gerenciador de contexto é:
with context as val:
pass
val irá obter a referência de recurso retornada pelo método __enter __ () no gerenciador de contexto para uso no bloco de código atrás com
O valor de retorno da função aberta
with open("filename", encoding="utf-8") as fp:
fp.read()
A função open () neste trecho de código retorna um objeto que implementa o método de protocolo de gerenciamento de contexto, não um recurso ( identificador de arquivo) como pensamos , que requer o método __enter__ (self) do gerenciador de contexto para retornar o identificador de arquivo, Para referência à variável fp após as.
Podemos usar as funções integradas do Python para verificar os atributos do objeto retornado por open (): a
saber:
open () -> gerenciador de contexto - > entrar (self) -> recursos
Também podemos implementar nosso próprio gerenciador de contexto. O
código é o seguinte:
class MyFileMgr:
def __init__(self, fp=None, filename):
self.fp = fp
self.filename = filename
def __enter__(self): # 主要用于返回一个可以引用的资源
self.fp = open(self.filename, encoding="utf-8")
return self.fp
def __exit__(self, t, v, tb): # 用于释放资源
if self.fp:
fp.close()
if __name__ == '__main__':
with MyFileMgr as fp:
fp.read()
O módulo relacionado ao gerenciador de contexto na biblioteca padrão Py: Contextlib:
fornece um decorador que converte o gerador em um gerenciador de contexto: contextmanager
import contextlib
@contextlib.contextmanager
def my_mgr(s, e):
print(s)
yield s + ' ' + e
print(e)
if __name__ == "__main__":
with my_mgr('start', 'end') as val:
print(val)
Efeito de corrida: início
início fim
fim
Depuração de código:
Neste exemplo:
como o gerador é convertido em um gerenciador de contexto, a instrução abaixo também irá liberar recursos devido a __exit __ () no gerenciador de contexto, execute next () e execute a saída final