__init__.py 1.44 KB
Newer Older
wanli's avatar
wanli committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
#!/usr/bin/env python
# -*- coding: utf_8 -*-


class PySignal(object):
    """
    Simple event class used to provide hooks for different types of events in Locust.

    Here's how to use the EventHook class::

        my_event = PySignal()
        def on_my_event(a, b, **kw):
            print "Event was fired with arguments: %s, %s" % (a, b)
        my_event += on_my_event
        my_event.fire(a="foo", b="bar")
        my_event.emit(a="foo", b="bar")

    """

    def __init__(self):
        self._handlers = []

    def __iadd__(self, handler):
        return self.connect(handler)

    def __isub__(self, handler):
        return self.disconnect(handler)

    def connect(self, handler):
        self._handlers.append(handler)
        return self

    def disconnect(self, handler):
        self._handlers.remove(handler)
        return self

    def fire(self, *args, **kwargs):
        return self.emit(*args, **kwargs)

    def emit(self, *args, **kwargs):
        rets = {}
        for handler in self._handlers:
            ret = handler(*args, **kwargs)
            rets[handler.__name__] = ret
        if len(rets) == 1:
            return list(rets.values())[0]  # list()用来兼容python3
        return rets


if __name__ == '__main__':
    my_event = PySignal()

    def on_my_event(a, b, **kw):
        print(a, b)
        print(kw)
    my_event.connect(on_my_event)
    my_event.fire(1, 2, c="foo", d="bar")
    my_event.emit(3, 4, e="foo", f="bar")