跳转到主要内容

基于Qt Signals模式的快速Python回调/事件系统

项目描述

psygnal

License PyPI Conda Python Version CI codecov Documentation Status Benchmarks

Psygnal(发音为"signal")是一个纯Python实现的观察者模式,具有类似Qt样式信号的API,带有可选的签名和类型检查,并支持多线程。它没有依赖项。

此库不要求或使用Qt,它仅仅实现了类似的观察者模式API。

文档

https://psygnal.readthedocs.io/

安装

pip install psygnal
conda install -c conda-forge psygnal

用法

观察者模式是一种软件设计模式,其中一个对象维护其依赖项("观察者")的列表,并通知它们任何状态变化——通常是通过调用观察者提供的回调函数

以下是一个使用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!"

更多详细信息请参阅文档

事件驱动的数据类

信号模式的一个特别好的用法是在数据类的字段发生变化时发出信号。Psygnal 提供了一个 @evented 装饰器,当字段变化时会发出信号。它与 dataclasses 标准库中的 数据类 兼容,以及 attrspydantic

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

有关更多详细信息,请参阅 数据类文档

事件驱动的容器

psygnal.containers 提供了可变数据结构(dictlistset)的事件驱动版本,用于需要监视变动的场景

from psygnal.containers import EventedList

my_list = EventedList([1, 2, 3, 4, 5])

my_list.events.inserted.connect(lambda i, val: print(f"Inserted {val} at index {i}"))
my_list.events.removed.connect(lambda i, val: print(f"Removed {val} at index {i}"))

my_list.append(6)  # Output: Inserted 6 at index 5
my_list.pop()  # Output: Removed 6 at index 5

有关更多详细信息,请参阅 事件驱动容器文档

基准历史

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

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

开发者

编译

虽然 psygnal 是一个纯 Python 包,但它是通过 mypyc 编译来提高性能的。要测试本地编译版本,您可以运行

make build

(这只是一个 HATCH_BUILD_HOOKS_ENABLE=1 pip install -e . 的别名)

调试

要禁用所有编译文件并运行纯 Python 版本,您可以运行

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

要返回编译版本,运行

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

psygnal._compiled 变量将告诉您是否正在使用编译版本。

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪一个,请了解有关 安装包 的更多信息。

源代码分发

psygnal-0.11.1.tar.gz (102.1 kB 查看哈希值)

上传时间 源代码

构建分发

psygnal-0.11.1-py3-none-any.whl (77.0 kB 查看哈希值)

上传时间 Python 3

psygnal-0.11.1-cp312-cp312-musllinux_1_1_x86_64.whl (725.1 kB 查看哈希值)

上传于 CPython 3.12 musllinux: musl 1.1+ x86-64

psygnal-0.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (743.8 kB 查看哈希值)

上传于 CPython 3.12 manylinux: glibc 2.17+ x86-64

psygnal-0.11.1-cp312-cp312-macosx_10_16_x86_64.whl (444.7 kB 查看哈希值)

上传于 CPython 3.12 macOS 10.16+ x86-64

psygnal-0.11.1-cp312-cp312-macosx_10_16_arm64.whl (425.2 kB 查看哈希值)

上传于 CPython 3.12 macOS 10.16+ ARM64

psygnal-0.11.1-cp311-cp311-musllinux_1_1_x86_64.whl (695.3 kB 查看哈希值)

上传于 CPython 3.11 musllinux: musl 1.1+ x86-64

psygnal-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (717.6 kB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ x86-64

psygnal-0.11.1-cp311-cp311-macosx_10_16_x86_64.whl (453.4 kB 查看哈希值)

上传于 CPython 3.11 macOS 10.16+ x86-64

psygnal-0.11.1-cp311-cp311-macosx_10_16_arm64.whl (427.5 kB 查看哈希值)

上传于 CPython 3.11 macOS 10.16+ ARM64

psygnal-0.11.1-cp310-cp310-musllinux_1_1_x86_64.whl (706.1 kB 查看哈希值)

上传于 CPython 3.10 musllinux: musl 1.1+ x86-64

psygnal-0.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (727.4 kB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.17+ x86-64

psygnal-0.11.1-cp310-cp310-macosx_10_16_x86_64.whl (462.2 kB 查看哈希值)

上传于 CPython 3.10 macOS 10.16+ x86-64

psygnal-0.11.1-cp310-cp310-macosx_10_16_arm64.whl (433.5 kB 查看哈希值)

上传于 CPython 3.10 macOS 10.16+ ARM64

psygnal-0.11.1-cp39-cp39-musllinux_1_1_x86_64.whl (700.0 kB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.1+ x86-64

psygnal-0.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (722.9 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ x86-64

psygnal-0.11.1-cp39-cp39-macosx_10_16_x86_64.whl (462.2 kB 查看哈希值)

上传于 CPython 3.9 macOS 10.16+ x86-64

psygnal-0.11.1-cp39-cp39-macosx_10_16_arm64.whl (433.8 kB 查看哈希值)

上传于 CPython 3.9 macOS 10.16+ ARM64

psygnal-0.11.1-cp38-cp38-musllinux_1_1_x86_64.whl (696.5 kB 查看哈希值)

上传于 CPython 3.8 musllinux: musl 1.1+ x86-64

psygnal-0.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (699.5 kB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.17+ x86-64

psygnal-0.11.1-cp38-cp38-macosx_10_16_x86_64.whl (453.3 kB 查看哈希值)

上传于 CPython 3.8 macOS 10.16+ x86-64

psygnal-0.11.1-cp38-cp38-macosx_10_16_arm64.whl (428.6 kB 查看哈希值)

上传于 CPython 3.8 macOS 10.16+ ARM64

由以下支持