pyevento
Python evento package, making the Observer pattern estúpida sencillo.
Install
pip install evento
Basic Usage
from evento import Event
# observers are simply methods
def observer(value: str):
print("Received: " + value)
# we need to create an instance for every event we want to fire
demo_event: Event[str] = Event()
# subscribe observer to the event
demo_event += observer
# trigger notifications for the event (run all observers)
demo_event('Hello') # => "Received: Hello"
demo_event('World') # => "Received: World"
Typical usage
This is how Events are typically used to decouple code into separate classes;
from evento import Event
class Action:
def __init__(self, name) -> None:
self.name = name
self.run_event = Event[Action]()
def run(self) -> None:
self.run_event(self)
class ActionCounter:
def __init__(self, action: Action) -> None:
self.count = 0
# Event.add returns an unsubscribe method
self._disconnect = action.run_event.add(self._on_action)
def __del__(self) -> None:
# observers should make sure to unsubscribe from events when they are done
self._disconnect()
def _on_action(self, action: Action) -> None:
self.count += 1
print(f"'{action.name}' ran {self.count} times")
action = Action('Foo action')
counter = ActionCounter(action)
action.run() # => "'Foo action' ran 1 times"
action.run() # => "'Foo action' ran 2 times"
Unsubscribe
# setup
event = Event()
def handler(value) -> None:
print(value)
def setup() -> Callable[[], None]:
unsubscribe = event.add(handler)
return unsubscribe
cleanup = setup()
# ... do stuff ...
# cleanup; all the following lines do the same
event -= handler
event.remove(handler)
cleanup()
Async Event
Works the same as Event but takes async subscribers and has to be awaited;
from evento import AsyncEvent
event = AsyncEvent[float]()
async def echo_double(value: float) -> None:
print(f"double: {value * 2}")
event.append(echo_double)
# ...
await event(5.0) # using __call__
await event.fire(10.0) # using fire (same as __call__)
# ...
event.remove(echo_double)
Signature Event
Since version 2.0.0 evento is typed and Event and SyncEvent are generic classes with a single type; they are 'fired' using a single argument, and all subscribers are expected to take one argument of that type.
To support more complex method signatures, the event and async_event decorator can be used to turn a method into an event;
Sync
from evento import event
@event
def multi_arg_event(id: int, message: str, price: float, **opts: Any) -> None:
...
def observer(id: int, message: str, price: float, **opts: Any) -> None:
print(f"observer: id={id}, message={message}, price={price}, opts={opts}")
multi_arg_event += observer
multi_arg_event(0, "Hello World!", 9.99, demo=True)
Async
from evento import async_event
async def observer(id: int, message: str, price: float, **opts: Any) -> Any:
print(f"observer: id={id}, message={message}, price={price}, opts={opts}")
@async_event
async def multi_arg_event(id: int, message: str, price: float, **opts: Any) -> str:
return "Done"
# the original method is still invoked after all event subscribers have executed
result = await multi_arg_event(1, "Test-12", 9.99, feature=True)
print(f"Result: {result}") # => Done
Metadata
Release files for evento 2.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| evento-2.0.1.tar.gz | 6.7 kB | Without provenance | Details for evento-2.0.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| evento-2.0.1-py3-none-any.whl | Python 3 | none | any | Details for evento-2.0.1-py3-none-any.whl |
Total release size: 13.8 kB
Release files / evento-2.0.1.tar.gz
| Download URL | evento-2.0.1.tar.gz |
|---|---|
| Size | 6.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7bb73ab5ce228ad72f1e1a0c8b3371eeca694908fa8acc0e03d1ea0018ab8cf5
|
|
BLAKE2b-256 checksum How to use checksums |
99490f94616ffb5229107db9a69a20a900090a9941abf94608851c6733c03acf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.1.11 CPython/3.10.4 Darwin/21.4.0
|
Release files / evento-2.0.1-py3-none-any.whl
| Download URL | evento-2.0.1-py3-none-any.whl |
|---|---|
| Size | 7.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a4913a7c4070fd3812d614e10210ba23f4f18eb4064af4cbd27825f218325b3e
|
|
BLAKE2b-256 checksum How to use checksums |
7eb7fbd5841a3fb61c4ad524d096bed368a511af1104126552dd521475bab1bf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.1.11 CPython/3.10.4 Darwin/21.4.0
|
Security for evento 2.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.