Explicação detalhada do gerenciador de contexto de python

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:
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
open () -> gerenciador de contexto - > entrar (self) -> recursos

函数open
上下文管理器
__enter__
资源

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:
Insira a descrição da imagem aqui

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

Acho que você gosta

Origin blog.csdn.net/weixin_43495262/article/details/106535318
Recomendado
Clasificación