Enamórate del administrador de contexto python series-python (2): reimplementar el decorador supresor

El administrador de contexto de Python no puede hacer mucho

No, el documento oficial implementa un método de supresión para manejar excepciones.

from contextlib import suppress

with suppress(FileNotFoundError):
    os.remove('somefile.tmp')

with suppress(FileNotFoundError):
    os.remove('someotherfile.tmp')

Luego, el documento establece que el código anterior es equivalente a:

try:
    os.remove('somefile.tmp')
except FileNotFoundError:
    pass

try:
    os.remove('someotherfile.tmp')
except FileNotFoundError:
    pass

Verifiqué el código fuente de suprimir, la implementación es realmente muy simple:

class suppress(ContextDecorator):
    def __init__(self, *exceptions):
        self._exceptions = exceptions
    def __enter__(self):
        pass
    def __exit__(self, exctype, excinst, exctb):
        return exctype is not None and issubclass(exctype, self._exceptions)

Se implementa usando el administrador de contexto, pero no estoy satisfecho de que el decorador no se use, y cada vez que desee usar suprimir, debe agregar con 

Así que realicé una versión con decorador:

import os
from contextlib import ContextDecorator

class suppress(ContextDecorator):
    def __init__(self, *exceptions):
        self._exceptions = exceptions
    def __enter__(self):
        print(1)
    def __exit__(self, exctype, excinst, exctb):
        print(3)
        return exctype is not None and issubclass(exctype, self._exceptions)
    
@suppress(FileNotFoundError)
def test_exception():
    print(2)
    os.remove('data.py')
test_exception()

resultado de la operación:

1
2
3

No hay una ventana emergente anormal y el número se imprime, lo que indica que el efecto es exitoso. 

Si puede reemplazar directamente esta parte del código fuente, la próxima vez que lo use, puede agregar un decorador directamente a la función para manejar la excepción de la función.

Supongo que te gusta

Origin blog.csdn.net/zhou_438/article/details/109293498
Recomendado
Clasificación