Skip to main content

Fast python callback/event system modeled after Qt Signals

Project description

psygnal

License PyPI Conda Python Version CI codecov Documentation Status Benchmarks

Psygnal (pronounced "signal") is a pure python implementation of the observer pattern, with the API of Qt-style Signals with (optional) signature and type checking, and support for threading.

This library does not require or use Qt in any way, It simply implements a similar observer pattern API.

Documentation

https://psygnal.readthedocs.io/

Install

pip install psygnal
conda install -c conda-forge psygnal

Usage

The observer pattern is a software design pattern in which an object maintains a list of its dependents ("observers"), and notifies them of any state changes – usually by calling a callback function provided by the observer.

Here is a simple example of using psygnal:

from psygnal import Signal

class MyObject:
    # define one or more signals as class attributes
    value_changed = Signal(str)

# create an instance
my_obj = MyObject()

# You (or others) can connect callbacks to your signals
@my_obj.value_changed.connect
def on_change(new_value: str):
    print(f"The value changed to {new_value}!")

# The object may now emit signals when appropriate,
# (for example in a setter method)
my_obj.value_changed.emit('hi')  # prints "The value changed to hi!"

Much more detail available in the documentation!

Evented Dataclasses

A particularly nice usage of the signal pattern is to emit signals whenever a field of a dataclass changes. Psygnal provides an @evented decorator that will emit a signal whenever a field changes. It is compatible with dataclasses from the standard library, as well as attrs, and pydantic:

from psygnal import evented
from dataclasses import dataclass

@evented
@dataclass
class Person:
    name: str
    age: int = 0

person = Person('John', age=30)

# connect callbacks
@person.events.age.connect
def _on_age_change(new_age: str):
    print(f"Age changed to {new_age}")

person.age = 31  # prints: Age changed to 31

See the dataclass documentation for more details.

Benchmark history

https://pyapp-kit.github.io/psygnal/

and

https://codspeed.io/pyapp-kit/psygnal

Developers

Debugging

While psygnal is a pure python module, it is compiled with mypyc to increase performance. To disable all compiled files and run the pure python version, you may run:

python -c "import psygnal.utils; psygnal.utils.decompile()"

To return the compiled version, run:

python -c "import psygnal.utils; psygnal.utils.recompile()"

The psygnal._compiled variable will tell you if you're using the compiled version or not.

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

psygnal-0.9.5.tar.gz (84.7 kB view hashes)

Uploaded Source

Built Distributions

psygnal-0.9.5-py3-none-any.whl (72.0 kB view hashes)

Uploaded Python 3

psygnal-0.9.5-cp311-cp311-win_amd64.whl (319.5 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

psygnal-0.9.5-cp311-cp311-musllinux_1_1_x86_64.whl (592.2 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

psygnal-0.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (614.2 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

psygnal-0.9.5-cp311-cp311-macosx_10_16_x86_64.whl (388.9 kB view hashes)

Uploaded CPython 3.11 macOS 10.16+ x86-64

psygnal-0.9.5-cp311-cp311-macosx_10_16_arm64.whl (366.2 kB view hashes)

Uploaded CPython 3.11 macOS 10.16+ ARM64

psygnal-0.9.5-cp310-cp310-win_amd64.whl (314.9 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

psygnal-0.9.5-cp310-cp310-musllinux_1_1_x86_64.whl (601.3 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

psygnal-0.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (621.3 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

psygnal-0.9.5-cp310-cp310-macosx_10_16_x86_64.whl (395.4 kB view hashes)

Uploaded CPython 3.10 macOS 10.16+ x86-64

psygnal-0.9.5-cp310-cp310-macosx_10_16_arm64.whl (371.7 kB view hashes)

Uploaded CPython 3.10 macOS 10.16+ ARM64

psygnal-0.9.5-cp39-cp39-win_amd64.whl (314.4 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

psygnal-0.9.5-cp39-cp39-musllinux_1_1_x86_64.whl (596.8 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

psygnal-0.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (618.7 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

psygnal-0.9.5-cp39-cp39-macosx_10_16_x86_64.whl (394.7 kB view hashes)

Uploaded CPython 3.9 macOS 10.16+ x86-64

psygnal-0.9.5-cp39-cp39-macosx_10_16_arm64.whl (371.1 kB view hashes)

Uploaded CPython 3.9 macOS 10.16+ ARM64

psygnal-0.9.5-cp38-cp38-win_amd64.whl (309.7 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

psygnal-0.9.5-cp38-cp38-musllinux_1_1_x86_64.whl (593.3 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

psygnal-0.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (598.1 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

psygnal-0.9.5-cp38-cp38-macosx_10_16_x86_64.whl (390.0 kB view hashes)

Uploaded CPython 3.8 macOS 10.16+ x86-64

psygnal-0.9.5-cp38-cp38-macosx_10_16_arm64.whl (366.9 kB view hashes)

Uploaded CPython 3.8 macOS 10.16+ ARM64

psygnal-0.9.5-cp37-cp37m-win_amd64.whl (302.4 kB view hashes)

Uploaded CPython 3.7m Windows x86-64

psygnal-0.9.5-cp37-cp37m-musllinux_1_1_x86_64.whl (473.2 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

psygnal-0.9.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (477.3 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

psygnal-0.9.5-cp37-cp37m-macosx_10_16_x86_64.whl (377.7 kB view hashes)

Uploaded CPython 3.7m macOS 10.16+ x86-64

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