CheeseSignal


NameCheeseSignal JSON
Version 1.1.0 PyPI version JSON
download
home_pageNone
Summary一款简约的信号系统。
upload_time2024-04-22 17:38:16
maintainerNone
docs_urlNone
authorNone
requires_pythonNone
licenseNone
keywords api backend
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # **CheeseSignal**

一款简单的信号系统。

## **安装**

系统要求:Linux。

Python要求:目前仅保证支持3.11及以上版本的Python,新版本会优先支持Python的最新稳定版本。

```
pip install CheeseSignal
```

## **使用**

使用方式较为简单,通过函数或装饰件连接至某个信号,随后等待信号发送。

```python
import time

from CheeseSignal import signal

signal = Signal()

def receiver1(*args, **kwargs):
    print(arg, kwargs)
signal.connect(receiver1)

@signal.connect()
def receiver2(*args, **kwargs):
    return args, kwargs

while True:
    print(signal.send('Hello', 'World', {
        'Cheese': 'Signal'
    }))
    time.sleep(1)
```

## **接口文档**

### **`class Signal`**

```python
from CheeseSignal import Signal

signal = Signal()
```

#### **`self.receivers: List[Receiver]`**

【只读】 接收器的列表,按注册顺序排序。

#### **`self.total_send_num: int`**

【只读】 总计信号发送次数。

#### **`def connect(self, fn: Callable, *, expected_receive_num: int = 0, auto_remove: bool = False)`**

通过函数注册响应函数。

- **参数**

    - `expected_receive_num`: 期望接受信号的次数,超过该次数则不再响应信号;0为无限次。

    - `auto_remove`: 是否自动删除响应次数超出期望次数的接收器。

- **报错**

    - `ValueError`: 已有重复的函数接收器。

#### **`def connect(self, *, expected_receive_num: int = 0, auto_remove: bool = False)`**

通过装饰器注册响应函数。

- **参数**

    - `expected_receive_num`: 期望接受信号的次数,超过该次数则不再响应信号;0为无限次。

    - `auto_remove`: 是否自动删除响应次数超出期望次数的接收器。

- **报错**

    - `ValueError`: 已有重复的函数接收器。

#### **`def send(self, *args, **kwargs) -> List[Any]`**

发送信号。

#### **`async def async_send(self, *args, **kwargs) -> List[Any]`**

在协程环境中发送信号,并请保证所有接收函数都是协程函数。

```python
import asyncio

from CheeseSignal import Signal

async def run_asyncio():
    signal = Signal()
    await signal.async_send('data1', 'data2', **{
        'key1': 'value1',
        'key2': 'value2'
    })

asyncio.run(run_asyncio())
```

#### **`def disconnect(self, fn: Callable)`**

断开接收器。

```python
from CheeseSignal import Signal

def receiver(*args, **kwargs):
    ...

signal = Signal()
signal.connect(receiver)
signal.disconnect(receiver)
```

- **报错**

    - `ValueError`: 未找到该函数的接收器。

#### **`def reset(self)`**

重置统计数据;所有的接收器的统计数据也会同步清空。

#### **`def disconnect_all(self)`**

断开所有接收器。

#### **`def get_receiver(self, fn: Callable) -> Receiver`**

获取接收器。

```python
from CheeseSignal import Signal

def receiver(*args, **kwargs):
    ...

signal = Signal()
signal.connect(receiver)

print(signal.get_receiver(receiver))
```

- **报错**

    - `ValueError`: 未找到该函数的接收器。

#### **`def index(self, fn: Callable) -> index`**

获取接收器的顺序位置。

```python
from CheeseSignal import Signal

def receiver(*args, **kwargs):
    ...

signal = Signal()
signal.connect(receiver)

print(signal.index(receiver))
```

- **报错**

    - `ValueError`: 未找到该函数的接收器。

### **`class Receiver`**

正常使用并不需要手动创建该类。

```python
from CheeseSignal import Receiver
```

#### **`def __init__(self, signal: Signal, fn: Callable, *, expected_receive_num: int, auto_remove: bool)`**

- **参数**

    - `expected_receive_num`: 期望接受信号的次数,超过该次数则不再响应信号;0为无限次。

    - `auto_remove`: 是否自动删除响应次数超出期望次数的接收器。

#### **`self.expected_receive_num: int`**

期望接受信号的次数,超过该次数则不再响应信号;0为无限次。

设置值小于`total_receive_num`且`auto_remove is True`,则会立刻删除。

#### **`self.auto_remove: bool`**

是否自动删除响应次数超出期望次数的接收器。

设置为`True`且`is_expired is True`,则会立刻删除。

#### **`self.active: bool`**

是否激活;未激活将忽略信号。

#### **`self.total_receive_num: int`**

【只读】 总计信号接受次数。

#### **`self.remaining_receive_num: int`**

【只读】 剩余的期望信号接受次数;返回为-1代表无期望信号接受次数。

#### **`self.is_expired: bool`**

【只读】 是否过期。

#### **`self.is_unexpired: bool`**

【只读】 是否未过期。

#### **`def reset(self)`**

重统计置数据。

在有期望信号接受次数的情况下,`auto_remove is False`的接收器会重新开始计数并接收信号。

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "CheeseSignal",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": "API, BackEnd",
    "author": null,
    "author_email": "Cheese Unknown <cheese@cheese.ren>",
    "download_url": "https://files.pythonhosted.org/packages/1c/6d/2f088d85b8690715fe5cc8e586d32f5fa90546f0dd77ed2d45758c60d2fb/cheesesignal-1.1.0.tar.gz",
    "platform": null,
    "description": "# **CheeseSignal**\n\n\u4e00\u6b3e\u7b80\u5355\u7684\u4fe1\u53f7\u7cfb\u7edf\u3002\n\n## **\u5b89\u88c5**\n\n\u7cfb\u7edf\u8981\u6c42\uff1aLinux\u3002\n\nPython\u8981\u6c42\uff1a\u76ee\u524d\u4ec5\u4fdd\u8bc1\u652f\u63013.11\u53ca\u4ee5\u4e0a\u7248\u672c\u7684Python\uff0c\u65b0\u7248\u672c\u4f1a\u4f18\u5148\u652f\u6301Python\u7684\u6700\u65b0\u7a33\u5b9a\u7248\u672c\u3002\n\n```\npip install CheeseSignal\n```\n\n## **\u4f7f\u7528**\n\n\u4f7f\u7528\u65b9\u5f0f\u8f83\u4e3a\u7b80\u5355\uff0c\u901a\u8fc7\u51fd\u6570\u6216\u88c5\u9970\u4ef6\u8fde\u63a5\u81f3\u67d0\u4e2a\u4fe1\u53f7\uff0c\u968f\u540e\u7b49\u5f85\u4fe1\u53f7\u53d1\u9001\u3002\n\n```python\nimport time\n\nfrom CheeseSignal import signal\n\nsignal = Signal()\n\ndef receiver1(*args, **kwargs):\n    print(arg, kwargs)\nsignal.connect(receiver1)\n\n@signal.connect()\ndef receiver2(*args, **kwargs):\n    return args, kwargs\n\nwhile True:\n    print(signal.send('Hello', 'World', {\n        'Cheese': 'Signal'\n    }))\n    time.sleep(1)\n```\n\n## **\u63a5\u53e3\u6587\u6863**\n\n### **`class Signal`**\n\n```python\nfrom CheeseSignal import Signal\n\nsignal = Signal()\n```\n\n#### **`self.receivers: List[Receiver]`**\n\n\u3010\u53ea\u8bfb\u3011 \u63a5\u6536\u5668\u7684\u5217\u8868\uff0c\u6309\u6ce8\u518c\u987a\u5e8f\u6392\u5e8f\u3002\n\n#### **`self.total_send_num: int`**\n\n\u3010\u53ea\u8bfb\u3011 \u603b\u8ba1\u4fe1\u53f7\u53d1\u9001\u6b21\u6570\u3002\n\n#### **`def connect(self, fn: Callable, *, expected_receive_num: int = 0, auto_remove: bool = False)`**\n\n\u901a\u8fc7\u51fd\u6570\u6ce8\u518c\u54cd\u5e94\u51fd\u6570\u3002\n\n- **\u53c2\u6570**\n\n    - `expected_receive_num`: \u671f\u671b\u63a5\u53d7\u4fe1\u53f7\u7684\u6b21\u6570\uff0c\u8d85\u8fc7\u8be5\u6b21\u6570\u5219\u4e0d\u518d\u54cd\u5e94\u4fe1\u53f7\uff1b0\u4e3a\u65e0\u9650\u6b21\u3002\n\n    - `auto_remove`: \u662f\u5426\u81ea\u52a8\u5220\u9664\u54cd\u5e94\u6b21\u6570\u8d85\u51fa\u671f\u671b\u6b21\u6570\u7684\u63a5\u6536\u5668\u3002\n\n- **\u62a5\u9519**\n\n    - `ValueError`: \u5df2\u6709\u91cd\u590d\u7684\u51fd\u6570\u63a5\u6536\u5668\u3002\n\n#### **`def connect(self, *, expected_receive_num: int = 0, auto_remove: bool = False)`**\n\n\u901a\u8fc7\u88c5\u9970\u5668\u6ce8\u518c\u54cd\u5e94\u51fd\u6570\u3002\n\n- **\u53c2\u6570**\n\n    - `expected_receive_num`: \u671f\u671b\u63a5\u53d7\u4fe1\u53f7\u7684\u6b21\u6570\uff0c\u8d85\u8fc7\u8be5\u6b21\u6570\u5219\u4e0d\u518d\u54cd\u5e94\u4fe1\u53f7\uff1b0\u4e3a\u65e0\u9650\u6b21\u3002\n\n    - `auto_remove`: \u662f\u5426\u81ea\u52a8\u5220\u9664\u54cd\u5e94\u6b21\u6570\u8d85\u51fa\u671f\u671b\u6b21\u6570\u7684\u63a5\u6536\u5668\u3002\n\n- **\u62a5\u9519**\n\n    - `ValueError`: \u5df2\u6709\u91cd\u590d\u7684\u51fd\u6570\u63a5\u6536\u5668\u3002\n\n#### **`def send(self, *args, **kwargs) -> List[Any]`**\n\n\u53d1\u9001\u4fe1\u53f7\u3002\n\n#### **`async def async_send(self, *args, **kwargs) -> List[Any]`**\n\n\u5728\u534f\u7a0b\u73af\u5883\u4e2d\u53d1\u9001\u4fe1\u53f7\uff0c\u5e76\u8bf7\u4fdd\u8bc1\u6240\u6709\u63a5\u6536\u51fd\u6570\u90fd\u662f\u534f\u7a0b\u51fd\u6570\u3002\n\n```python\nimport asyncio\n\nfrom CheeseSignal import Signal\n\nasync def run_asyncio():\n    signal = Signal()\n    await signal.async_send('data1', 'data2', **{\n        'key1': 'value1',\n        'key2': 'value2'\n    })\n\nasyncio.run(run_asyncio())\n```\n\n#### **`def disconnect(self, fn: Callable)`**\n\n\u65ad\u5f00\u63a5\u6536\u5668\u3002\n\n```python\nfrom CheeseSignal import Signal\n\ndef receiver(*args, **kwargs):\n    ...\n\nsignal = Signal()\nsignal.connect(receiver)\nsignal.disconnect(receiver)\n```\n\n- **\u62a5\u9519**\n\n    - `ValueError`: \u672a\u627e\u5230\u8be5\u51fd\u6570\u7684\u63a5\u6536\u5668\u3002\n\n#### **`def reset(self)`**\n\n\u91cd\u7f6e\u7edf\u8ba1\u6570\u636e\uff1b\u6240\u6709\u7684\u63a5\u6536\u5668\u7684\u7edf\u8ba1\u6570\u636e\u4e5f\u4f1a\u540c\u6b65\u6e05\u7a7a\u3002\n\n#### **`def disconnect_all(self)`**\n\n\u65ad\u5f00\u6240\u6709\u63a5\u6536\u5668\u3002\n\n#### **`def get_receiver(self, fn: Callable) -> Receiver`**\n\n\u83b7\u53d6\u63a5\u6536\u5668\u3002\n\n```python\nfrom CheeseSignal import Signal\n\ndef receiver(*args, **kwargs):\n    ...\n\nsignal = Signal()\nsignal.connect(receiver)\n\nprint(signal.get_receiver(receiver))\n```\n\n- **\u62a5\u9519**\n\n    - `ValueError`: \u672a\u627e\u5230\u8be5\u51fd\u6570\u7684\u63a5\u6536\u5668\u3002\n\n#### **`def index(self, fn: Callable) -> index`**\n\n\u83b7\u53d6\u63a5\u6536\u5668\u7684\u987a\u5e8f\u4f4d\u7f6e\u3002\n\n```python\nfrom CheeseSignal import Signal\n\ndef receiver(*args, **kwargs):\n    ...\n\nsignal = Signal()\nsignal.connect(receiver)\n\nprint(signal.index(receiver))\n```\n\n- **\u62a5\u9519**\n\n    - `ValueError`: \u672a\u627e\u5230\u8be5\u51fd\u6570\u7684\u63a5\u6536\u5668\u3002\n\n### **`class Receiver`**\n\n\u6b63\u5e38\u4f7f\u7528\u5e76\u4e0d\u9700\u8981\u624b\u52a8\u521b\u5efa\u8be5\u7c7b\u3002\n\n```python\nfrom CheeseSignal import Receiver\n```\n\n#### **`def __init__(self, signal: Signal, fn: Callable, *, expected_receive_num: int, auto_remove: bool)`**\n\n- **\u53c2\u6570**\n\n    - `expected_receive_num`: \u671f\u671b\u63a5\u53d7\u4fe1\u53f7\u7684\u6b21\u6570\uff0c\u8d85\u8fc7\u8be5\u6b21\u6570\u5219\u4e0d\u518d\u54cd\u5e94\u4fe1\u53f7\uff1b0\u4e3a\u65e0\u9650\u6b21\u3002\n\n    - `auto_remove`: \u662f\u5426\u81ea\u52a8\u5220\u9664\u54cd\u5e94\u6b21\u6570\u8d85\u51fa\u671f\u671b\u6b21\u6570\u7684\u63a5\u6536\u5668\u3002\n\n#### **`self.expected_receive_num: int`**\n\n\u671f\u671b\u63a5\u53d7\u4fe1\u53f7\u7684\u6b21\u6570\uff0c\u8d85\u8fc7\u8be5\u6b21\u6570\u5219\u4e0d\u518d\u54cd\u5e94\u4fe1\u53f7\uff1b0\u4e3a\u65e0\u9650\u6b21\u3002\n\n\u8bbe\u7f6e\u503c\u5c0f\u4e8e`total_receive_num`\u4e14`auto_remove is True`\uff0c\u5219\u4f1a\u7acb\u523b\u5220\u9664\u3002\n\n#### **`self.auto_remove: bool`**\n\n\u662f\u5426\u81ea\u52a8\u5220\u9664\u54cd\u5e94\u6b21\u6570\u8d85\u51fa\u671f\u671b\u6b21\u6570\u7684\u63a5\u6536\u5668\u3002\n\n\u8bbe\u7f6e\u4e3a`True`\u4e14`is_expired is True`\uff0c\u5219\u4f1a\u7acb\u523b\u5220\u9664\u3002\n\n#### **`self.active: bool`**\n\n\u662f\u5426\u6fc0\u6d3b\uff1b\u672a\u6fc0\u6d3b\u5c06\u5ffd\u7565\u4fe1\u53f7\u3002\n\n#### **`self.total_receive_num: int`**\n\n\u3010\u53ea\u8bfb\u3011 \u603b\u8ba1\u4fe1\u53f7\u63a5\u53d7\u6b21\u6570\u3002\n\n#### **`self.remaining_receive_num: int`**\n\n\u3010\u53ea\u8bfb\u3011 \u5269\u4f59\u7684\u671f\u671b\u4fe1\u53f7\u63a5\u53d7\u6b21\u6570\uff1b\u8fd4\u56de\u4e3a-1\u4ee3\u8868\u65e0\u671f\u671b\u4fe1\u53f7\u63a5\u53d7\u6b21\u6570\u3002\n\n#### **`self.is_expired: bool`**\n\n\u3010\u53ea\u8bfb\u3011 \u662f\u5426\u8fc7\u671f\u3002\n\n#### **`self.is_unexpired: bool`**\n\n\u3010\u53ea\u8bfb\u3011 \u662f\u5426\u672a\u8fc7\u671f\u3002\n\n#### **`def reset(self)`**\n\n\u91cd\u7edf\u8ba1\u7f6e\u6570\u636e\u3002\n\n\u5728\u6709\u671f\u671b\u4fe1\u53f7\u63a5\u53d7\u6b21\u6570\u7684\u60c5\u51b5\u4e0b\uff0c`auto_remove is False`\u7684\u63a5\u6536\u5668\u4f1a\u91cd\u65b0\u5f00\u59cb\u8ba1\u6570\u5e76\u63a5\u6536\u4fe1\u53f7\u3002\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "\u4e00\u6b3e\u7b80\u7ea6\u7684\u4fe1\u53f7\u7cfb\u7edf\u3002",
    "version": "1.1.0",
    "project_urls": {
        "Source": "https://github.com/CheeseUnknown/CheeseSignal"
    },
    "split_keywords": [
        "api",
        " backend"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "182b3a95c49461d8a4308273958bf30001a26f0779f316b4e535bc8cd0528793",
                "md5": "a99174c420e8d68319ea40de295ffec2",
                "sha256": "c2896d5faf25c8d28bcf4f9ec238088ba701fd526f615578fd22947a4b462532"
            },
            "downloads": -1,
            "filename": "cheesesignal-1.1.0-py2.py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "a99174c420e8d68319ea40de295ffec2",
            "packagetype": "bdist_wheel",
            "python_version": "py2.py3",
            "requires_python": null,
            "size": 5301,
            "upload_time": "2024-04-22T17:38:08",
            "upload_time_iso_8601": "2024-04-22T17:38:08.823327Z",
            "url": "https://files.pythonhosted.org/packages/18/2b/3a95c49461d8a4308273958bf30001a26f0779f316b4e535bc8cd0528793/cheesesignal-1.1.0-py2.py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1c6d2f088d85b8690715fe5cc8e586d32f5fa90546f0dd77ed2d45758c60d2fb",
                "md5": "6851047dd4aed35c5f41c6463b75542f",
                "sha256": "37d756c7fc28d5696d8108c0059340b1e1d57d7565329712525428a220bb1401"
            },
            "downloads": -1,
            "filename": "cheesesignal-1.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "6851047dd4aed35c5f41c6463b75542f",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 4075,
            "upload_time": "2024-04-22T17:38:16",
            "upload_time_iso_8601": "2024-04-22T17:38:16.075194Z",
            "url": "https://files.pythonhosted.org/packages/1c/6d/2f088d85b8690715fe5cc8e586d32f5fa90546f0dd77ed2d45758c60d2fb/cheesesignal-1.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-22 17:38:16",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "CheeseUnknown",
    "github_project": "CheeseSignal",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "cheesesignal"
}
        
Elapsed time: 0.25317s