Skip to main content

Pure python callback/event system modeled after Qt Signals

Project description

psygnal

License PyPI Conda Python Version CI codecov

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

Note: this library does not require Qt. It just implements a similar pattern of inter-object communication with loose coupling.

Documentation

https://psygnal.readthedocs.io/

Install

pip install psygnal
conda install -c conda-forge psygnal

Usage

A very simple example:

from psygnal import Signal

class MyObject:
    value_changed = Signal(str)
    shutting_down = Signal()

my_obj = MyObject()

@my_obj.value_changed.connect
def on_change(new_value: str):
    print(f"The value changed to {new_value}!")

my_obj.value_changed.emit('hi')

Much more detail available in the documentation!

Alternatives

There are other libraries that implement similar event-based signals, they may server your purposes better depending on what you are doing.

PySignal (deprecated)

This package borrows inspiration from – and is most similar to – the now deprecated PySignal project, with a few notable new features in psygnal regarding signature and type checking, sender querying, and threading.

similarities with PySignal

  • still a "Qt-style" signal implementation that doesn't depend on Qt
  • supports class methods, functions, lambdas and partials

differences with PySignal

  • the class attribute pysignal.ClassSignal is called simply Signal in psygnal (to more closely match the PyQt/Pyside syntax). Correspondingly pysignal.Signal is similar to psygnal.SignalInstance.
  • Whereas PySignal refrained from doing any signature and/or type checking either at slot-connection time, or at signal emission time, psygnal offers signature declaration similar to Qt with , for example, Signal(int, int). along with opt-in signature compatibility (with check_nargs=True) and type checking (with check_types=True). .connect(..., check_nargs=True) in particular ensures that any slot to connected to a signal will at least be compatible with the emitted arguments.
  • You can query the sender in psygnal by using the Signal.sender() or Signal.current_emitter() class methods. (The former returns the instance emitting the signal, similar to Qt's QObject.sender() method, whereas the latter returns the currently emitting SignalInstance.)
  • There is basic threading support (calling all slots in another thread), using emit(..., asynchronous=True). This is experimental, and while thread-safety is the goal, it is not guaranteed.
  • There are no SignalFactory classes here.

The following two libraries implement django-inspired signals, they do not attempt to mimic the Qt API.

Blinker

Blinker provides a fast dispatching system that allows any number of interested parties to subscribe to events, or "signals".

SmokeSignal

(This appears to be unmaintained)

Benchmark history

https://www.talleylambert.com/psygnal/

Developers

Debugging

While psygnal is a pure python module, it is compiled with Cython to increase performance. To import psygnal in uncompiled mode, without deleting the shared library files from the psyngal module, set the environment variable PSYGNAL_UNCOMPILED before importing psygnal. The psygnal._compiled variable will tell you if you're running the compiled library 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.4.2.tar.gz (1.1 MB view hashes)

Uploaded Source

Built Distributions

psygnal-0.4.2-cp310-cp310-win_amd64.whl (657.4 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

psygnal-0.4.2-cp310-cp310-musllinux_1_1_x86_64.whl (4.2 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

psygnal-0.4.2-cp310-cp310-musllinux_1_1_i686.whl (3.9 MB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

psygnal-0.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.1 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

psygnal-0.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (3.9 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

psygnal-0.4.2-cp310-cp310-macosx_11_0_arm64.whl (727.4 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

psygnal-0.4.2-cp310-cp310-macosx_10_9_x86_64.whl (828.5 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

psygnal-0.4.2-cp39-cp39-win_amd64.whl (658.3 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

psygnal-0.4.2-cp39-cp39-musllinux_1_1_x86_64.whl (4.2 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

psygnal-0.4.2-cp39-cp39-musllinux_1_1_i686.whl (4.0 MB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

psygnal-0.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.1 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

psygnal-0.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (3.9 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

psygnal-0.4.2-cp39-cp39-macosx_11_0_arm64.whl (730.1 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

psygnal-0.4.2-cp39-cp39-macosx_10_9_x86_64.whl (831.3 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

psygnal-0.4.2-cp38-cp38-win_amd64.whl (662.5 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

psygnal-0.4.2-cp38-cp38-musllinux_1_1_x86_64.whl (4.5 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

psygnal-0.4.2-cp38-cp38-musllinux_1_1_i686.whl (4.2 MB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

psygnal-0.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.2 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

psygnal-0.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (4.0 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

psygnal-0.4.2-cp38-cp38-macosx_11_0_arm64.whl (737.3 kB view hashes)

Uploaded CPython 3.8 macOS 11.0+ ARM64

psygnal-0.4.2-cp38-cp38-macosx_10_9_x86_64.whl (833.4 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

psygnal-0.4.2-cp37-cp37m-win_amd64.whl (649.9 kB view hashes)

Uploaded CPython 3.7m Windows x86-64

psygnal-0.4.2-cp37-cp37m-musllinux_1_1_x86_64.whl (3.7 MB view hashes)

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

psygnal-0.4.2-cp37-cp37m-musllinux_1_1_i686.whl (3.6 MB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

psygnal-0.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.7 MB view hashes)

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

psygnal-0.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (3.5 MB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

psygnal-0.4.2-cp37-cp37m-macosx_10_9_x86_64.whl (810.9 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ 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