Skip to main content

Implementation of the observer pattern via a decorator

Project description

Build Status Coverage Latest Version Downloads License

Small python module that implements the observer pattern via a decorator.


This is based on a thread on stackoverflow (the example of C#-like events by Jason Orendorff), so I don’t take any credit for the idea. I merely made a fancy module with documentation and tests out of it, since I needed it in a bigger project. It is quite handy and I’ve been using it in a couple of projects, which require some sort of event handling.

Thus it is licensed as CC0, so basically do-whatever-you-want to the extent legally possible.


obsub is available on PyPI, so you can simply install it using pip install obsub or you do it manually using as with any python package.


The event decorator from the obsub module is used as follows:

from obsub import event

# Define a class with an event
class Subject(object):
    def on_stuff(self, arg):
        print('Stuff {} happens'.format(arg))

# Now define an event handler, the observer
def handler(subject, arg):
    print('Stuff {} is handled'.format(arg))

# Wire everything up...
sub = Subject()
sub.on_stuff += handler

# And try it!

You should now get both print messages from the event itself and the event handler function, like so:

Stuff foo happens
Stuff foo is handled

Continuous integration

For the fun of it, Travis CI is used for continuous integration. As long as everything is fine, the button below should be green and shiny!

Build Status

The continuous integration ensures that our tests run on the following platforms:

  • Python 2.6, 2.7
  • Python 3.2, 3.3
  • pypy

It might also work on Python 2.5, but is not automatically tested with this version.

We also track the coverage of our tests with


Use coverage to generate local coverage reports like this:

coverage run nosetests

Note: on some platforms (e.g. Ubuntu) the executable is called python-coverage.

Contribution and feedback

obsub is developed on github.

If you have any questions about this software or encounter bugs, you’re welcome to open a new issue on github.

In case you do not want to use github for some reason, you can alternatively send an email one of us:

Feel free to contribute patches as pull requests as you see fit. Try to be consistent with PEP 8 guidelines as far as possible and test everything. Otherwise, your commit messages should start with a capitalized verb for consistency. Unless your modification is completely trivial, also add a message body to your commit.


Thanks to Jason Orendorff on for the idea on stackoverflow. I also want to thank @coldfix and @Moredread for contributions and feedback.



From a user perspective the preservation of function signatures and a couple of bug fixes are probably most relevant. Python 2.5 is no longer tested by continuous integration, though we try to avoid unnecessary changes that might break backwards compatibility.

In addition, there are quite a number of changes that mostly concern developers.

  • Function signatures are now preserved correctly by the event decorator. This is true only for python3. On python2 there is no support for default arguments, currently
  • Some fixes to memory handling and tests thereof. This includes a more generic handling of the garbage collection process within the test suite to make it pass on pypy, too.
  • Massive refactoring of test suite from one very long doctest to more focussed unit tests.
  • The documentation has been converted from Markdown to reStructuredText, since it is compatible with both PyPI and GitHub.
  • Various improvements and some streamlining of the documentation.
  • Fix package name in license.
  • Continuous integration now includes support.
  • Support for Python 2.5 is no longer tested using Travis CI, since they have dropped support for this version.


  • Add __all__ attribute to module
  • Fix a couple of documentation issues


Initial release

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

obsub-0.2.tar.gz (11.3 kB view hashes)

Uploaded source

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page