Simple event system for Python with weak reference support
Project description
pyobservable
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3adce42409bf6e1d7382f6c98e2a7c9e7aa094ca98092d1afa863cd1e5fdb5e7 |
|
MD5 | 399d6ee39c3b835f4dc673140f46528b |
|
BLAKE2b-256 | 56b70231d481a1e720aa5b1875c47ac9819d18072ea311c7cbe1e496f0658233 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 273999b5fee1ad1e18fd638dc6a44064350a7bef6784031c29ec5ad79430b063 |
|
MD5 | a144e7a7323bb15d35909f2c40b2cf60 |
|
BLAKE2b-256 | 410b222bae9d7dcf6a8622f281769c1139bda8657414548fdf925d844e25fa45 |