python / expert
Snippet
Signal-Trennungs-Test-Utility zur Überprüfung stummgeschalteter Handler
Das Testen von Django-Signalen erfordert oft die Isolierung von Nebeneffekten. Das Erben von `ContextDecorator` ermöglicht die Nutzung sowohl als Kontextmanager (`with MuteSignal(...):`) als auch als Test-Dekorator (`@MuteSignal(...)`).
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from contextlib import ContextDecoratorfrom django.db.models.signals import ModelSignalclass MuteSignal(ContextDecorator):def __init__(self, signal: ModelSignal, receiver):self.signal = signalself.receiver = receiverdef __enter__(self):self.signal.disconnect(self.receiver)return selfdef __exit__(self, exc_type, exc_val, exc_tb):self.signal.connect(self.receiver)return False
django
Erklärung
1
class MuteSignal(ContextDecorator):
Erweitert ContextDecorator der Standardbibliothek für zweifache Nutzung als Kontextmanager und Dekorator.
2
def __init__(self, signal: ModelSignal, receiver):
Nimmt die Ziel-Django-Signalinstanz und die zu steuernde Receiver-Callback-Funktion entgegen.
3
def __enter__(self):
Kontext-Eintritts-Hook, der die Verbindung des Receivers zum Signal trennt.
4
self.signal.disconnect(self.receiver)
Trennt den Receiver-Handler während der Blockausführung aus der Signalregistrierung.
5
def __exit__(self, exc_type, exc_val, exc_tb):
Kontext-Austritts-Hook, der das Signal auch bei Ausnahmen im Block wieder verbindet.
6
self.signal.connect(self.receiver)
Stellt den ursprünglichen Signalverbindungszustand nach Blockende wieder her.