Verlieben Sie sich in den Python-Serien-Python-Kontextmanager (2): Implementieren Sie den Suppressor-Dekorator neu

Der Python-Kontextmanager kann nicht zu viel tun

Nein, das amtliche Dokument implementiert ein Verfahren Unterdrückungs zu Griff Ausnahmen

from contextlib import suppress

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

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

Dann besagt das Dokument, dass der obige Code äquivalent ist zu:

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

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

Ich habe den Quellcode der Unterdrückung überprüft, die Implementierung ist eigentlich sehr einfach:

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)

Es wird mithilfe des Kontextmanagers implementiert, aber ich bin nicht zufrieden, dass der Dekorator nicht verwendet wird, und jedes Mal, wenn Sie die Unterdrückung verwenden möchten, müssen Sie mit hinzufügen 

So wird eine Version mit einem Dekorateur realisiert:

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

Betriebsergebnis:

1
2
3

Es gibt kein abnormales Popup und die Nummer wird ausgedruckt, um anzuzeigen, dass der Effekt erfolgreich ist 

Wenn Sie diesen Teil des Quellcodes direkt ersetzen können, können Sie bei der nächsten Verwendung einen Dekorator direkt zur Funktion hinzufügen, um die Ausnahme der Funktion zu behandeln.

Ich denke du magst

Origin blog.csdn.net/zhou_438/article/details/109293498
Empfohlen
Rangfolge