signal.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Mon Mar 11 18:39:13 2013
  4. @author Vaclav Petras <wenzeslaus gmail.com>
  5. """
  6. from grass.pydispatch import dispatcher
  7. def _islambda(function):
  8. """Tests if object is a lambda function.
  9. Should work on the most of Python implementations where name of lambda
  10. function is not unique.
  11. """
  12. return isinstance(function, type(lambda: None)) and function.__name__== (lambda: None).__name__
  13. class Signal(object):
  14. def __init__(self, name):
  15. self._name = name
  16. def connect(self, handler, weak=None):
  17. if weak is None:
  18. if _islambda(handler):
  19. weak = False
  20. else:
  21. weak = True
  22. dispatcher.connect(receiver=handler, signal=self, weak=weak)
  23. def disconnect(self, handler):
  24. dispatcher.disconnect(receiver=handler, signal=self, weak=None)
  25. def emit(self, *args, **kwargs):
  26. dispatcher.send(signal=self, *args, **kwargs)
  27. def __call__(self, *arguments, **named):
  28. if 'signal' in named:
  29. del named['signal']
  30. self.emit(*arguments, **named)
  31. if __name__ == '__main__':
  32. def handler1():
  33. print "handler1"
  34. def handler2(text):
  35. print "handler2: %s" % text
  36. class A(object):
  37. def showText(self, text):
  38. print "showing text:", text
  39. def showMessage(self):
  40. print "showing message"
  41. def test():
  42. import sys
  43. signal1 = Signal('signal1')
  44. signal2 = Signal('signal2')
  45. signal3 = Signal('signal3')
  46. signal1.connect(handler1)
  47. signal2.connect(handler2)
  48. signal2.connect(lambda text: sys.stdout.write('lambda handler 1: %s\n' % text))
  49. signal2.connect(signal3)
  50. signal3.connect(handler2)
  51. a = A()
  52. signal2.connect(a.showText)
  53. signal2.connect(a.showMessage)
  54. signal1.emit()
  55. signal2.emit(text="Hello")
  56. test()