Skip to main content

Pure python implementation of Qt Signals

Project description

psygnal

License PyPI Conda Python Version CI codecov

Pure python implementation of Qt-style Signals, with (optional) signature and type checking, and support for threading.

Usage

Install

pip install psygnal

Basic usage

If you are familiar with the Qt Signals & Slots API as implemented in PySide and PyQt5, then you should be good to go! psygnal aims to be a superset of those APIs (some functions do accept additional arguments, like check_nargs and check_types).

Note: the name "Signal" is used here instead of pyqtSignal, following the qtpy and PySide convention.

from psygnal import Signal

# create an object with class attribute Signals
class MyObj:

    # this signal will emit a single string
    value_changed = Signal(str)

    def __init__(self, value=0):
        self._value = value

    def set_value(self, value):
        if value != self._value:
            self._value = str(value)
            # emit the signal
            self.value_changed.emit(self._value)

def on_value_changed(new_value):
    print(f"The new value is {new_value!r}")

# instantiate the object with Signals
obj = MyObj()

# connect one or more callbacks with `connect`
obj.value_changed.connect(on_value_changed)

# callbacks are called when value changes
obj.set_value('hello!')  # prints: 'The new value is 'hello!'

# disconnect callbacks with `disconnect`
obj.value_changed.disconnect(on_value_changed)

connect as a decorator

.connect() returns the object that it is passed, and so can be used as a decorator.

@obj.value_changed.connect
def some_other_callback(value):
    print(f"I also received: {value!r}")

obj.set_value('world!')
# prints:
# I also received: 'world!'

Connection safety (number of arguments)

psygnal prevents you from connecting a callback function that is guaranteed to fail due to an incompatible number of positional arguments. For example, the following callback has too many arguments for our Signal (which we declared above as emitting a single argument: Signal(str))

def i_require_two_arguments(first, second):
    print(first, second)

obj.value_changed.connect(i_require_two_arguments)

raises:

ValueError: Cannot connect slot 'i_require_two_arguments' with signature: (first, second):
- Slot requires at least 2 positional arguments, but spec only provides 1

Accepted signature: (p0: str, /)

Note: Positional argument checking can be disabled with connect(..., check_nargs=False)

Extra positional arguments ignored

While a callback may not require more positional arguments than the signature of the Signal to which it is connecting, it may accept less. Extra arguments will be discarded when emitting the signal (so it isn't necessary to create a lambda to swallow unnecessary arguments):

obj = MyObj()

def no_args_please():
    print(locals())

obj.value_changed.connect(no_args_please)

# otherwise one might need
# obj.value_changed.connect(lambda a: no_args_please())

obj.value_changed.emit('hi')  # prints: "{}"

Connection safety (types)

For type safety when connecting slots, use check_types=True when connecting a callback. Recall that our signal was declared as accepting a string Signal(str). The following function has an incompatible type annotation: x: int.

# this would fail because you cannot concatenate a string and int
def i_expect_an_integer(x: int):
    print(f'{x} + 4 = {x + 4}')

# psygnal won't let you connect it
obj.value_changed.connect(i_expect_an_integer, check_types=True)

raises:

ValueError: Cannot connect slot 'i_expect_an_integer' with signature: (x: int):
- Slot types (x: int) do not match types in signal.

Accepted signature: (p0: str, /)

Note: unlike Qt, psygnal does not perform any type coercion when emitting a value.

Connection safety (object references)

psygnal tries very hard not to hold strong references to connected objects. In the simplest case, if you connect a bound method as a callback to a signal instance:

class T:
    def my_method(self):
        ...

obj = T()
signal.connect(t.my_method)

Then there is a risk of signal holding a reference to obj even after obj has been deleted, preventing garbage collection (and possibly causing errors when the signal is emitted next). Psygnal avoids this with weak references. It goes a bit farther, trying to prevent strong references in these cases as well:

  • class methods used as the callable in functools.partial
  • decorated class methods that mangle the name of the callback.

Another common case for leaking strong references is a partial closing on an object, in order to set an attribute:

class T:
    x = 1

obj = T()
signal.connect(partial(setattr, obj, 'x'))  # ref to obj stuck in the connection

Here, psygnal offers the connect_settatr convenience method, which reduces code and helps you avoid leaking strong references to obj:

signal.connect_setatttr(obj, 'x')

Query the sender

Similar to Qt's QObject.sender() method, a callback can query the sender using the Signal.sender() class method. (The implementation is of course different than Qt, since the receiver is not a QObject.)

obj = MyObj()

def curious():
    print("Sent by", Signal.sender())
    assert Signal.sender() == obj

obj.value_changed.connect(curious)
obj.value_changed.emit(10)

# prints (and does not raise):
# Sent by <__main__.MyObj object at 0x1046a30d0>

If you want the actual signal instance that is emitting the signal (obj.value_changed in the above example), use Signal.current_emitter().

Emitting signals asynchronously (threading)

There is experimental support for calling all connected slots in another thread, using emit(..., asynchronous=True)

obj = MyObj()

def slow_callback(arg):
    import time
    time.sleep(0.5)
    print(f"Hi {arg!r}, from another thread")

obj.value_changed.connect(slow_callback)

This one is called synchronously (note the order of print statements):

obj.value_changed.emit('friend')
print("Hi, from main thread.")

# after 0.5 seconds, prints:
# Hi 'friend', from another thread
# Hi, from main thread.

This one is called asynchronously, and immediately returns to the caller. A threading.Thread object is returned.

thread = obj.value_changed.emit('friend', asynchronous=True)
print("Hi, from main thread.")

# immediately prints
# Hi, from main thread.

# then after 0.5 seconds this will print:
# Hi 'friend', from another thread

Note: The user is responsible for joining and managing the threading.Thread instance returned when calling .emit(..., asynchronous=True).

Experimental! While thread-safety is the goal, (RLocks are used during important state mutations) it is not guaranteed. Please use at your own risk. Issues/PRs welcome.

Blocking a signal

To temporarily block a signal, use the signal.blocked() context context manager:

obj = MyObj()

with obj.value_changed.blocked():
    # do stuff without obj.value_changed getting emitted
    ...

To block/unblock permanently (outside of a context manager), use signal.block() and signal.unblock().

Pausing a signal

Sometimes it is useful to temporarily collect/buffer emission events, and then emit them together as a single event. This can be accomplished using the signal.pause()/signal.resume() methods, or the signal.paused() context manager.

If a function is passed to signal.paused(func) (or signal.resume(func)) it will be passed to functools.reduce to combine all of the emitted values collected during the paused period, and a single combined value will be emitted.

obj = MyObj()
obj.value_changed.connect(print)

# note that signal.paused() and signal.resume() accept a reducer function
with obj.value_changed.paused(lambda a,b: (f'{a[0]}_{b[0]}',), ('',)):
    obj.value_changed('a')
    obj.value_changed('b')
    obj.value_changed('c')
# prints '_a_b_c'

NOTE: args passed to emit are collected as tuples, so the two arguments passed to reducer will always be tuples. reducer must handle that and return an args tuple. For example, the three emit() events above would be collected as

[('a',), ('b',), ('c',)]

and would be reduced and re-emitted as follows:

obj.emit(*functools.reduce(reducer, [('a',), ('b',), ('c',)]))

Other similar libraries

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.2.0.tar.gz (33.2 kB view details)

Uploaded Source

Built Distributions

psygnal-0.2.0-cp310-cp310-win_amd64.whl (149.4 kB view details)

Uploaded CPython 3.10 Windows x86-64

psygnal-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl (861.2 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

psygnal-0.2.0-cp310-cp310-musllinux_1_1_i686.whl (822.2 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

psygnal-0.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (780.3 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

psygnal-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (739.2 kB view details)

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

psygnal-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (178.3 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

psygnal-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl (212.2 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

psygnal-0.2.0-cp39-cp39-win_amd64.whl (148.3 kB view details)

Uploaded CPython 3.9 Windows x86-64

psygnal-0.2.0-cp39-cp39-musllinux_1_1_x86_64.whl (857.9 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

psygnal-0.2.0-cp39-cp39-musllinux_1_1_i686.whl (820.3 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

psygnal-0.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (778.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

psygnal-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (738.4 kB view details)

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

psygnal-0.2.0-cp39-cp39-macosx_11_0_arm64.whl (178.3 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

psygnal-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl (212.1 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

psygnal-0.2.0-cp38-cp38-win_amd64.whl (151.1 kB view details)

Uploaded CPython 3.8 Windows x86-64

psygnal-0.2.0-cp38-cp38-musllinux_1_1_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

psygnal-0.2.0-cp38-cp38-musllinux_1_1_i686.whl (984.0 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

psygnal-0.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (982.8 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

psygnal-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (888.9 kB view details)

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

psygnal-0.2.0-cp38-cp38-macosx_11_0_arm64.whl (171.6 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

psygnal-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl (202.0 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

psygnal-0.2.0-cp37-cp37m-win_amd64.whl (143.8 kB view details)

Uploaded CPython 3.7m Windows x86-64

psygnal-0.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl (754.3 kB view details)

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

psygnal-0.2.0-cp37-cp37m-musllinux_1_1_i686.whl (724.9 kB view details)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

psygnal-0.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (674.6 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

psygnal-0.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (639.7 kB view details)

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

psygnal-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl (198.1 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

Details for the file psygnal-0.2.0.tar.gz.

File metadata

  • Download URL: psygnal-0.2.0.tar.gz
  • Upload date:
  • Size: 33.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0.tar.gz
Algorithm Hash digest
SHA256 7339e6bb8784bc10330625239996b200e15ce38d78f67713bdb19479f97d2153
MD5 ad8459dcff00ab8ab28ec9ab85a11984
BLAKE2b-256 8fd5c4f1a87c6e28253370d82c4eb7d23a6f49397bab945d0be85d06d98e184f

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 149.4 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1b72c534a251aedcf320c326d24b7d17470fdf73fe2df5017afccf7c666886fb
MD5 5ea31dce6f4dfcf7ea937c23dd5dbf8b
BLAKE2b-256 0f0a7a2883da8f4af740b0d80c672f6f6d0c297eb870665410348056ef815a20

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl
  • Upload date:
  • Size: 861.2 kB
  • Tags: CPython 3.10, musllinux: musl 1.1+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 d69490e61e51087e78994ff4f2fcd1c7a7480f35ae92aa79fe5105b0be663f1d
MD5 011559cab07b927bb66ac0518fc9deae
BLAKE2b-256 1043043fa9664efcc68766c290ccd054ed8fc8bcc6426a27ba66120170833352

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp310-cp310-musllinux_1_1_i686.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp310-cp310-musllinux_1_1_i686.whl
  • Upload date:
  • Size: 822.2 kB
  • Tags: CPython 3.10, musllinux: musl 1.1+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp310-cp310-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 6d755d80719eadfe43a0d169d29310c28312b86a5575b528ffa54a17fbfb4f18
MD5 8beb007b06df82637730b0d28ea9170c
BLAKE2b-256 3b4b3215d65d511549dfa25f01e9f6bb7aa74375f4effec4f3369ff0facc271c

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for psygnal-0.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 338f339a00b667e72dc2d3a21d7875e206ba1e9de43cb0116d2bbfae098be6fc
MD5 3ef3740d1b5015bd55d779d0c0f83bf2
BLAKE2b-256 a25389a8624ee7a7585d3e40c14c428b939e7d9e5b9f66bec2926d7582ee706c

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for psygnal-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 909abe4609bd2aca3570791028bd340c4edcd3aca0304fca3bca57069748f935
MD5 b08cc9ce0ca2356724427ab0ab7099f8
BLAKE2b-256 69f4af4cffb1c0ebf730389ff5de345116f75e7fbb0494303445e21ba0a8eb71

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 178.3 kB
  • Tags: CPython 3.10, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 115bf73ac46a5306cfca1fb4e49656f2d29a843cc53c2e2ece6138070b101626
MD5 851a67b4edbca4b67bd3edf44524435a
BLAKE2b-256 c6cb3c2ed60a3c972a44ca7e7d709d6e2e166a8e35d00ccfe340a7f9dfa85be0

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 212.2 kB
  • Tags: CPython 3.10, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5eaced83824cb9a63d1a622412fbcd90f02d11d858ab79280bfda6ed35dbf985
MD5 d8971acc8ca4e7b6ade0e32dea9fde29
BLAKE2b-256 7f33f86e9e2a44454083e470e84f7b5cc87e57f46fc935996c8f1617c32543ac

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 148.3 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b048825fa667109e28c7746c12c7a673467231e9cd70cf33a8ff79125b3213ad
MD5 525c10624d8139a437d48feae4b2eba5
BLAKE2b-256 384880f6358f7dfed4f280b2adac919929f8eb7d78baa48e189423c295c0d33d

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp39-cp39-musllinux_1_1_x86_64.whl
  • Upload date:
  • Size: 857.9 kB
  • Tags: CPython 3.9, musllinux: musl 1.1+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 290b1c73157eec06b3db03817b7f2e6d36d03a62046fce7207e537f82d224a4b
MD5 22382cdc273f4bfcaec7a49afc75bcb7
BLAKE2b-256 0ec3a509c3ca14f9e314df72c28bd909261f853dc563b6404843bcaa13f02073

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp39-cp39-musllinux_1_1_i686.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp39-cp39-musllinux_1_1_i686.whl
  • Upload date:
  • Size: 820.3 kB
  • Tags: CPython 3.9, musllinux: musl 1.1+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp39-cp39-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 04d37f8be5506b118ceaac402af365967fce40e28d8e6d34ba26a029e69368a9
MD5 65ed889d02a33ad140e96bb032d2b6d3
BLAKE2b-256 9cf41d36443f67187193b1452ef7e1fd268c7ab3f449148b0169e15fbb1067a4

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for psygnal-0.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 db912c2a46f913fc9bb23e0821b24aa9f935e4d029059fc4cc1b57afb792bd79
MD5 0751ee7efe8a36b91e5b6c12ff5e2b70
BLAKE2b-256 35a75aefb265ed9bde674d667be8824c434a717a0f2e8fd43e4b83731138f3bd

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for psygnal-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 5bae1e9362e69ba0718ca497a3f9e93ea0e9f98917fc8d38c2068ee0af9f96b6
MD5 2afa550248407fe4d4ec2bc29d87c662
BLAKE2b-256 9fb9afd37677b3de7f41a2e70c50ab8c8cf7c680ae8f0cc0ea11ad47316eed11

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 178.3 kB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cae035cb97c71acf15192f78ac62855b1d8e133cd8ac876f91dc41aa78541e18
MD5 2137a8bf80e495f52a9492353d1400ee
BLAKE2b-256 3009f25c1571378a8094dfcbce1da5ac495d83db0011ad4d93404d108c534f94

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 212.1 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d4aabfa78d62f87d1aeb6353fbcb51f51ec59030b385d2dd1aa14fa5653c9642
MD5 e098a21ac3d80eef65deb473cc34df13
BLAKE2b-256 e64f3d6c352105df039ddf9521500f390b6d538b3e4abeb2097801fd03ead62d

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 151.1 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 51a6faa76a91616815428e0ad8d12bb077097deedfeb11041fa65e978d38ac99
MD5 b11acb50a57f6a75d1ba5e6ce1a44a14
BLAKE2b-256 6177f138fcf8cc9c13e8b328fbcd3c1b336a4559ee063eda0fda5e859798c2e7

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp38-cp38-musllinux_1_1_x86_64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp38-cp38-musllinux_1_1_x86_64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.8, musllinux: musl 1.1+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 f3ad52f3555b59ef7c7e8d75a594fec0742ebfdb1d3f98a474a97df6eb0cfb36
MD5 ccbb8fa93224bc273cb0bbe265c1120b
BLAKE2b-256 6d43821c338b0df767d41c5c8cbb7beae45fb5c94192ca2cec6303abce0d3e66

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp38-cp38-musllinux_1_1_i686.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp38-cp38-musllinux_1_1_i686.whl
  • Upload date:
  • Size: 984.0 kB
  • Tags: CPython 3.8, musllinux: musl 1.1+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp38-cp38-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 c04d4aad4540b63c179163fec6264c4b8f239a0b5bbe2434267c444e9400a4c8
MD5 103163f4ba877eb291d3c0cfa92d9619
BLAKE2b-256 7e704b35fd23c07e9fd5c644c169c292631047d7e1d7fdecc34323f8b4e5aa6d

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for psygnal-0.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 3f73cca0655fdbe7cba0f870e3ee71c0bad7e4e3f1fc6529395e80169ec6308b
MD5 a7491f4eb214e9fd43d8da5d99f0b82f
BLAKE2b-256 e5ed85fbdba0d662188eb98ca69b5ec73b55d45fa78cac70fa6e2b660bc84a48

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for psygnal-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 bcbf630a5a2f0db5312d23618a64d8008b3cd948938f8768c07990afeac329f3
MD5 04a5db34ca477ce19cda4b8032da9336
BLAKE2b-256 9cd30e9a63bc575485a2001f1c8d14e99b84f4b558f1dff7b8f0945f2bc73dc5

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp38-cp38-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 171.6 kB
  • Tags: CPython 3.8, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4234770a7c7b54991fda19a69aab0d5cc6040f866df2c3938913284e887df307
MD5 d0599416218ab96ab2fc11aefa59ffa2
BLAKE2b-256 fe505a2917f1970195f1a2b41e3ea01e4e1d5c97a66fc893c8d38e6f9440e5b6

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 202.0 kB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 984d102b1241564b88db364942aae40970c130cd4d3f59951e5aaa3f9f954a40
MD5 ad5361bcca1554a8dd7ecb1b86511619
BLAKE2b-256 170b29daa683452ec2cceb316c303d094c852392cc22131e08591a5268bb4f8c

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 143.8 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 717e752648803847f935d483ee9c703ca46adc562d1588c2cedee63a23a49f12
MD5 291aa503165661df9ac7ad647f91e624
BLAKE2b-256 00795e12f7e8b0bc0161a867d0ccf6d31605184e6187f359893c1538be5c8856

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl
  • Upload date:
  • Size: 754.3 kB
  • Tags: CPython 3.7m, musllinux: musl 1.1+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 19e59634bfde61a05c947ad7465a42c14c6a71917e7fc602788517569e18d69e
MD5 b54eac189c1d89a392c8cf955e2bd77a
BLAKE2b-256 d8d5ee9592996b2d89025e6a81ca9e54f808cbf5562cda1a028573d4ca2aaa4e

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp37-cp37m-musllinux_1_1_i686.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp37-cp37m-musllinux_1_1_i686.whl
  • Upload date:
  • Size: 724.9 kB
  • Tags: CPython 3.7m, musllinux: musl 1.1+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 01036349785b68a9a664d6e8f37fc0fe435f2958356fcd515e0a904c46bfd4ac
MD5 aadcd74326f652e71731526a7a1892e8
BLAKE2b-256 ff642898cb3460f987d66dedb5ceb11091e5e6cebeb2e1f7f1f754e59c92638d

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for psygnal-0.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 61858ce2d050007a2b557995f288a20cec19461a14d55f5ac309538026f35e78
MD5 1b6985923dc7ec1971dca16f16beafdb
BLAKE2b-256 18848abafeb4a0282e3f413c06be2ebb540f61f431eef348cb816b0b832cd097

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for psygnal-0.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 6db92d7a58ff1a6fc32daa65af18e25a01cf0ac49919b0f3acb70e9900995e29
MD5 0b657e39387eb732cf8e7e722a669a1f
BLAKE2b-256 1c825766af249ea5b2156a2a6e8fe194115c44ba5f8dd02454e958d41c99a1bb

See more details on using hashes here.

File details

Details for the file psygnal-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: psygnal-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 198.1 kB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7

File hashes

Hashes for psygnal-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f02e9e40fd2243f1b691dfecbbcc2513f3dc56fbae989151682b5cc5793b39be
MD5 8e2551eb25f3cb34ef389da694bb7b2a
BLAKE2b-256 ef6c3ca993e57f04c0c9ab7a03b51424b6e0e585fc46484df3ca2754a1d4f062

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