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.