Skip to main content

Simple event system for Python with weak reference support

Project description

pyobservable

PyPI PyPI - Python Version Lines of code GitHub

Description

pyobservable provides a simple event system for Python with weak reference support. This ensures that the event handlers do not stay in memory when they aren't needed anymore.

Installation

pyobservable can be installed using pip:

$ pip install pyobservable

Alternatively, you can download the repository and run the following command from within the source directory:

$ python setup.py install

Usage

For a quick start, a minimal example is:

from pyobservable import Observable


obs = Observable()
obs.add_event('foo')
obs.add_event('bar')

# Event keys can be any object that is hashable
event = object()
obs.add_event(event)


# Binding with decorator usage
@obs.bind('foo')
def foo_handler(foo_number):
    print('foo_handler called:', foo_number)


# Binding with function usage
def bar_handler(bar_list):
    print('bar_handler called:', bar_list)
obs.bind('bar', bar_handler)


obs.notify('foo', 1)
obs.notify('bar', [1, 2, 3])

The rationale behind the requirement to add events before binding to them is to ensure the code is less error-prone from mistyping event names. Also, if a duplicated event key is present, ValueError will be raised.
However, the next example shows that event registration can be simplified using the special _events_ attribute:

from pyobservable import Observable


class EventEmitter(Observable):
    _events_ = ['foo', 2]
    
    def triggers_foo(self):
        self.notify('foo', 1, 2, 3)


event_emitter = EventEmitter()        


@event_emitter.bind('foo')
def foo_handler(*args):
    print(*args)


event_emitter.triggers_foo()

Also note that _events_ can be defined multiple times in an inheritance tree. Observable scans the MRO for this attribute and adds every event it finds. Again, a ValueError will be raised if a duplicate event key is present.

Finally, here's an advanced and clean example using enum:

from enum import Enum, auto
from pyobservable import Observable


class EventType(Enum):
    FOO = auto()
    BAR = auto()

class EventEmitter(Observable):
    _events_ = EventType  # Enums are iterable

    def triggers_foo(self):
        self.notify(EventType.FOO, 'foo happened!')


class EventListener:
    def on_foo(self, message):
        print("Here's a message from foo:", message)


event_emitter = EventEmitter()
event_listener = EventListener()
event_emitter.bind(EventType.FOO, event_listener.on_foo)  # pyobservable also supports bound methods


event_emitter.triggers_foo()

For more information, please refer to the Observable class docstrings.

Tests

The simplest way to run tests:

$ python tests.py

As a more robust alternative, you can install tox (or tox-conda if you use conda) to automatically support testing across the supported python versions, then run:

$ tox

Issue tracker

Please report any bugs and enhancement ideas using the issue tracker.

License

pyobservable is licensed under the terms of the MIT License (see LICENSE.txt for more information).

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

pyobservable-1.0.1.tar.gz (5.1 kB view details)

Uploaded Source

Built Distribution

pyobservable-1.0.1-py3-none-any.whl (5.0 kB view details)

Uploaded Python 3

File details

Details for the file pyobservable-1.0.1.tar.gz.

File metadata

  • Download URL: pyobservable-1.0.1.tar.gz
  • Upload date:
  • Size: 5.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.5

File hashes

Hashes for pyobservable-1.0.1.tar.gz
Algorithm Hash digest
SHA256 3adce42409bf6e1d7382f6c98e2a7c9e7aa094ca98092d1afa863cd1e5fdb5e7
MD5 399d6ee39c3b835f4dc673140f46528b
BLAKE2b-256 56b70231d481a1e720aa5b1875c47ac9819d18072ea311c7cbe1e496f0658233

See more details on using hashes here.

File details

Details for the file pyobservable-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: pyobservable-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 5.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.5

File hashes

Hashes for pyobservable-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 273999b5fee1ad1e18fd638dc6a44064350a7bef6784031c29ec5ad79430b063
MD5 a144e7a7323bb15d35909f2c40b2cf60
BLAKE2b-256 410b222bae9d7dcf6a8622f281769c1139bda8657414548fdf925d844e25fa45

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page