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.

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

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

Uploaded Source

Built Distributions

psygnal-0.3.5-cp310-cp310-win_amd64.whl (644.1 kB view details)

Uploaded CPython 3.10 Windows x86-64

psygnal-0.3.5-cp310-cp310-musllinux_1_1_x86_64.whl (4.0 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

psygnal-0.3.5-cp310-cp310-musllinux_1_1_i686.whl (3.8 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

psygnal-0.3.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.0 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

psygnal-0.3.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (3.8 MB view details)

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

psygnal-0.3.5-cp310-cp310-macosx_11_0_arm64.whl (710.8 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

psygnal-0.3.5-cp310-cp310-macosx_10_9_x86_64.whl (806.4 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

psygnal-0.3.5-cp39-cp39-win_amd64.whl (644.8 kB view details)

Uploaded CPython 3.9 Windows x86-64

psygnal-0.3.5-cp39-cp39-musllinux_1_1_x86_64.whl (4.0 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

psygnal-0.3.5-cp39-cp39-musllinux_1_1_i686.whl (3.8 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

psygnal-0.3.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

psygnal-0.3.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (3.8 MB view details)

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

psygnal-0.3.5-cp39-cp39-macosx_11_0_arm64.whl (713.7 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

psygnal-0.3.5-cp39-cp39-macosx_10_9_x86_64.whl (809.5 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

psygnal-0.3.5-cp38-cp38-win_amd64.whl (649.1 kB view details)

Uploaded CPython 3.8 Windows x86-64

psygnal-0.3.5-cp38-cp38-musllinux_1_1_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

psygnal-0.3.5-cp38-cp38-musllinux_1_1_i686.whl (4.1 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

psygnal-0.3.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.1 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

psygnal-0.3.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (3.9 MB view details)

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

psygnal-0.3.5-cp38-cp38-macosx_11_0_arm64.whl (721.7 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

psygnal-0.3.5-cp38-cp38-macosx_10_9_x86_64.whl (811.1 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

psygnal-0.3.5-cp37-cp37m-win_amd64.whl (638.5 kB view details)

Uploaded CPython 3.7m Windows x86-64

psygnal-0.3.5-cp37-cp37m-musllinux_1_1_x86_64.whl (3.6 MB view details)

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

psygnal-0.3.5-cp37-cp37m-musllinux_1_1_i686.whl (3.5 MB view details)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

psygnal-0.3.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.6 MB view details)

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

psygnal-0.3.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (3.4 MB view details)

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

psygnal-0.3.5-cp37-cp37m-macosx_10_9_x86_64.whl (792.5 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: psygnal-0.3.5.tar.gz
  • Upload date:
  • Size: 74.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.13

File hashes

Hashes for psygnal-0.3.5.tar.gz
Algorithm Hash digest
SHA256 5abf84f0da9f487be68299854c4eb39de0765236407736d201f97ef39913a548
MD5 6b8fba8783640244ae3f274f12c96a44
BLAKE2b-256 e2594406d8d536cc4a7a9c64a08d7499193cdaa59453eafd7921c4bae26829e7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: psygnal-0.3.5-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 644.1 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.13

File hashes

Hashes for psygnal-0.3.5-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 bd46a7ee01c7b1a9bbf3d41b1ad41d657194b5460dc69aa0f7b2959805474002
MD5 c385238877cf3c2885d790c8c037d46a
BLAKE2b-256 796805817f07a3be1d6170e51b9456ac3c0a5c230218aa5fb6fb31fb0641567b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 71ca002b19eab610e46378f73878b7597218d21310ad5e8364a006064fc2b693
MD5 fee9b52ff5ee866f48e83681bebd5e0e
BLAKE2b-256 766acbde9481c3334c8b2e3f48e9ea47b51c6510b8a03135fe22dc8e56be1ca8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp310-cp310-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 1070ec041fa0c382d127d8f42852e41af34697358c42b3af06e524c1960c7afd
MD5 7b16979016ee509f016ce9af17782f57
BLAKE2b-256 73b04512e1ee510b3b04640914c1c400135a1cb825a3d7de088e2220e4ff458f

See more details on using hashes here.

File details

Details for the file psygnal-0.3.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for psygnal-0.3.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8ffdf3a91febe45a68e2706448a78e31e6c7a002fc9f0725b4e8e2e733f7744c
MD5 6ff76bacf63260b577d86ed92a156cb7
BLAKE2b-256 3c717f6fc72e87e5cbbbc73af97f4f0ec5f61cd323a1d6156a924d0d25c353b0

See more details on using hashes here.

File details

Details for the file psygnal-0.3.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for psygnal-0.3.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 0e14c6e151008f4f73f31b05923d8deed5adebd56a330b27c54060787dacfc02
MD5 5848d260fc2cb35fa9153ac5cd74bd92
BLAKE2b-256 666b35b4c22511a8d518771ac07e079f6223e5514a1652e467a06e230d0032f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d325a199efd4c273ca21cb36f80ba85ed788ab3f42ebd9308b4c70680e1a186f
MD5 50472377e056c6158fe974e9af45d1c5
BLAKE2b-256 af1f48c56434a476664c393777e2e8f600b0c792f547f464711c1e309c0ac7ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 93404f3628b0cb896d19f3c0ca4b8f53c7c0737d63b8dd8bcf8cf4ef2803e0e4
MD5 333e263a2610457045737e45c6fb2869
BLAKE2b-256 7cb395e8e575c3275d94f21658d48059f50513d9049f15900658e90be93ecf32

See more details on using hashes here.

File details

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

File metadata

  • Download URL: psygnal-0.3.5-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 644.8 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.13

File hashes

Hashes for psygnal-0.3.5-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 8c54e42b8a785e9b3b591e74b8942061a9392606f24e402b8e4d80560a257bff
MD5 46b76b09fb1c5c62d4c5de730c79571a
BLAKE2b-256 b4cc068d37e66090ae413af7e4f41e808698965bcc97a54273f894d94ee4f1ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 bd1d93f3d18d0321bac9f85056db6e537ddcaf1d5ba40452221d89aabc6f29f1
MD5 9e9a0c1d0f11dc412baf154f1f089455
BLAKE2b-256 c133f6898446048bf36cde82db2be9cb7037965390e0e91791c783cc58483c10

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp39-cp39-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 d70a675e64629b932fea0390844562900b7b08f6bd9a840b0abf2ad2e4352a18
MD5 9613221e9f557bf6825327a761e82d35
BLAKE2b-256 8cdfc3191846c920df3a752f18bb5bcbb942fa5285fd3fa30af26280f65abe01

See more details on using hashes here.

File details

Details for the file psygnal-0.3.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for psygnal-0.3.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2bb469b1250d876f80a16c34a60629f5a553791bdec158325e95865c14b29f5e
MD5 50e0d1079f0ad765aba2337e7d6d50ed
BLAKE2b-256 1d2e89b3716cf26b7cc3623d389fdad1077717ec45de7ddbeacb5adf518cbb6b

See more details on using hashes here.

File details

Details for the file psygnal-0.3.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for psygnal-0.3.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 4aac9d081dea0f10aae6fc965725f4b63adb6246aeb1943f0a2fd5eb75bc8a36
MD5 f50d17aba07e64828b660cbecc1ab851
BLAKE2b-256 29b0c28fc911fadd1f7939c7040c68676c8d9f27a67b5e07ddf5d8bd3c058dfa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1e8d99be895aa7a443395a782602428c903aa2af79729a92786e15f46d6464c0
MD5 4a4ea2ef2b564f2d065943b94940961c
BLAKE2b-256 fe3986fc042e8c84b61f99117a25e74df93915040f556547d54e9e8c40e19ef1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ebf532f4d0135a3109ec7b0da5c46203f7c9c840ea681172d9f791aca8d23a75
MD5 7ae788674819674953fe8727f59a46a3
BLAKE2b-256 8528e77c6c3e577ee52a3324d54b4dfcf1ad167a625bce16799abd272fee00db

See more details on using hashes here.

File details

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

File metadata

  • Download URL: psygnal-0.3.5-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 649.1 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.13

File hashes

Hashes for psygnal-0.3.5-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 fc3eb16dbf6c9b51936adc582e48808fcf977f63abab03707163652a1ee5134b
MD5 ec340ad89650bbc7ef50cdd83ff24994
BLAKE2b-256 e239675be086b5ae48d05dafc8b9802da1b59503bd21be22e87b6793496212aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 cdb692d38ca46091dbf469a4e567c0606d5352678d655984e9e88d0296cbaa40
MD5 a411bfb2a5395a0e6abf796e42f6fcd0
BLAKE2b-256 16c892ec94ba043dc7b78e269efad019df6c9a28e1b674636a449da0ee5297df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp38-cp38-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 73a0c99f9a2eee8fca0d721e1db60ae09a554541c9e3602271d07ea567da90b1
MD5 37b550372b5bfcd2af4bde168a4364a7
BLAKE2b-256 dc3936e417fbead0bbdbbc19d125b4db5c381a60b0a61d3805d6065d02399c3f

See more details on using hashes here.

File details

Details for the file psygnal-0.3.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for psygnal-0.3.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6adab11b7280a79d4badd7ce9f40171bf1f66038d668d756cc630f81b665ddf1
MD5 b66b7d94c96045fbb8bbc5759f18d655
BLAKE2b-256 c3e7ca703ccc52d7cea58a3e578b9884a2e23d9f54242e2bb2340231cf1fa581

See more details on using hashes here.

File details

Details for the file psygnal-0.3.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for psygnal-0.3.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 9850027f4f21db089cdb7c47b6101be626d14f412f508f8d4da1184c0323f4e8
MD5 e1812b88d2f96cb129b44aa6c8a48b2e
BLAKE2b-256 6021961c9194efc2a68c905a0be297b1ebb294d81f6e33b7c2270bdf3482b4f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bfbe10306e86eb67b04f9798439c348a8bf51566a378a34cac49db6d4f7e8467
MD5 9ec4396051e8124811d493e1ab868ea5
BLAKE2b-256 1eabd8a9432d7a8011164991f437b3c8752add43251a23ae0686880654916d50

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 21b719f2e1c46b93f9f7c9e4bb4fa05ef256ae42dfdc87a79b1ef56186f5a286
MD5 c6ef9e7861382c41aec730fe84220b62
BLAKE2b-256 96fd3b47a5f8b33592392ed6477499a824beee59def3feff6d63e86cf947e1da

See more details on using hashes here.

File details

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

File metadata

  • Download URL: psygnal-0.3.5-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 638.5 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.13

File hashes

Hashes for psygnal-0.3.5-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 832cfaebd6b83f002e806d041be2f264f68da89f4ad181a40676d29240c81689
MD5 e8f26891c5faf9c8f81a69e370b9ed7a
BLAKE2b-256 047f78a6581b9786911f3acc4893fa83608ebb3011ce26837c10366772ddea49

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 f2021a67d6e3ff87d5c489cfa4de908c5ccdc7b70dce4d1856d7521029235070
MD5 723194b5f2bf7de9d10267a55de3cdce
BLAKE2b-256 d96b8c52c2868edb3301fb8aa6f182fce36a6dd3ded47bbf45498599132fe881

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 6fc7de33556f1e2f9efa40c892b1587e08e8a9817d02f4b894e0c5299a78d8a8
MD5 27a56c4c101bb05c698a01575a09ff96
BLAKE2b-256 89037f6012ab9b7038027174758d52d94f92258b60dd4c739ff94768767f50c2

See more details on using hashes here.

File details

Details for the file psygnal-0.3.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for psygnal-0.3.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 61af8a1247596adb94512948310b99aec01df0ca78ff12b1deafcf8f259e4e93
MD5 441e64f31cbc15e997c03c5c0ebd624c
BLAKE2b-256 c2e464798e247f01444256bdc534936931964cf92b3e16088b41d46be9b758b8

See more details on using hashes here.

File details

Details for the file psygnal-0.3.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for psygnal-0.3.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 0233d39391a7cb1970f5d9ca88f40fbf8301715a31508fa8c0f65ebb089f21fd
MD5 cdc95969b3f5cfb77e2d2abe6e3c6348
BLAKE2b-256 152627e33a6b5bc9fcfce7472bd0991bbb442d6a98e2a91ab56335476876a8ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for psygnal-0.3.5-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 763556b6687a8a024ff2395fbf4eb9fa064eab1d2875f4d0b3ca8a3d52a764d7
MD5 a55d85db9ec44bc5d5e4b781a0f8b484
BLAKE2b-256 92831bfb8f8b6f7b1733b6d5f319ebd9d22e4734108d32f30060f41eb8c9fbaa

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