FunKit


NameFunKit JSON
Version 0.0.3 PyPI version JSON
download
home_pagehttps://github.com/cxfjh/FunKit
Summary一个功能强大的 Python 装饰器工具包 | A powerful Python decorator toolkit
upload_time2025-07-15 14:44:30
maintainerNone
docs_urlNone
authorcxfjh
requires_python>=3.6
licenseMIT
keywords decorator toolkit fun kit funkit funkit 装饰器 工具包 函数 函数式编程 funkit
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # FunKit - 功能强大的装饰器工具包

## 简介
`FunKit` 是一个Python装饰器工具包,提供了多种实用的装饰器,包括定时器、线程管理、耗时统计、异常处理、调用限制、失败重试、缓存和速率限制等功能。这些装饰器可以帮助开发者更方便地实现复杂的功能,提高代码的可读性和可维护性。

## 安装
你可以通过以下命令安装 `FunKit`:
```bash
pip install FunKit
```

## 使用方法

### 1. 单次定时器 (`setTimeout`)
`setTimeout` 装饰器用于在指定的延迟时间后执行函数。

**参数**:
- `sleep`:延迟时间(秒),必须为非负数。

**返回值**:
返回一个 `_ThreadController` 对象,该对象提供以下方法和属性:
- `stop()`:停止定时器。
- `isRun()`:检查定时器是否在运行。
- `value`:获取定时器执行结果。

**示例代码**:
```python
from FunKit import setTimeout

@setTimeout(sleep=2)
def my_function():
    print("这是延迟2秒后执行的函数。")

controller = my_function()
# 如果你想停止定时器,可以调用 controller.stop()
```

### 2. 循环定时器 (`setInterval`)
`setInterval` 装饰器用于按指定的时间间隔循环执行函数。

**参数**:
- `interval`:执行间隔(秒),必须为非负数。
- `end`:最大持续时间(秒),0 表示无限,必须为非负数。

**返回值**:
返回一个 `_ThreadController` 对象,该对象提供以下方法和属性:
- `stop()`:停止定时器。
- `isRun()`:检查定时器是否在运行。
- `value`:获取定时器执行结果,结果存储在列表中。

**示例代码**:
```python
from FunKit import setInterval

@setInterval(interval=1, end=5)
def my_function():
    print("这是每秒执行一次,持续5秒的函数。")

controller = my_function()
# 如果你想提前停止定时器,可以调用 controller.stop()
```

### 3. 创建多线程 (`createThread`)
`createThread` 装饰器用于将函数封装成线程执行。

**参数**:
- `inherit`:是否要随着主线程结束而结束,默认为 `False`。

**返回值**:
返回一个 `_ThreadController` 对象,该对象提供以下方法和属性:
- `isRun()`:检查线程是否在运行。
- `value`:获取线程执行结果。

**示例代码**:
```python
from FunKit import createThread

@createThread(inherit=True)
def my_function():
    print("这是在新线程中执行的函数。")

controller = my_function()
```

### 4. 耗时计算 (`timeIt`)
`timeIt` 装饰器用于统计函数的执行耗时。

**参数**:
- `num`:执行次数,默认为 1。
- `show`:是否直接打印耗时信息,默认为 `True`。
- `info`:是否返回耗时信息,默认为 `False`。
- 
**返回值**:
返回一个元组 `(原函数返回值, 耗时信息)` 或 `原函数返回值`,其中耗时信息是一个字典,包含平均耗时、最小耗时、最大耗时、总耗时等信息。

**示例代码**:
```python
from FunKit import timeIt

@timeIt(num=3)
def my_function():
    # 模拟耗时操作
    import time
    time.sleep(1)
    return "函数执行完成"

result, elapsed = my_function()
print(f"函数返回值: {result}")
print(f"耗时信息: {elapsed}")
```

### 5. 异常处理 (`catch`)
`catch` 装饰器用于捕获函数执行过程中的异常。

**参数**:
- `exc`:要捕获的异常类型,默认为 `Exception`。
- `value`:异常发生时返回的默认值,默认为 `None`。
- `reRaise`:是否重新抛出异常,默认为 `False`。
- `show`:是否显示错误信息,默认为 `True`。

**返回值**:
返回一个元组 `(默认值, 异常对象)`。

**示例代码**:
```python
from FunKit import catch

@catch(exc=ZeroDivisionError, value="发生除零错误")
def my_function():
    return 1 / 0

result, error = my_function()
print(f"结果: {result}")
print(f"异常对象: {error}")
```

### 6. 全局异常捕获 (`catchAll`)
`catchAll` 装饰器用于对指定模块中的所有用户定义函数进行全局异常捕获。

**参数**:
- `name`:需要处理的模块名称。
- `exc`:要捕获的异常类型,默认为 `Exception`。
- `value`:异常发生时返回的默认值,默认为 `None`。
- `reRaise`:是否重新抛出异常,默认为 `False`。
- `show`:是否显示错误信息,默认为 `True`。

**返回值**:
返回一个元组 `(默认值, 异常对象)`。

**示例代码**:
```python
import FunKit
from FunKit import catchAll

def my_function():
    return 1 / 0

catchAll(name=__name__)
try:
    result = my_function()
except Exception as e:
    print(f"捕获到异常: {e}")
```

### 7. 调用限制 (`callLimit`)
`callLimit` 装饰器用于限制函数的调用次数。

**参数**:
- `num`:最大允许调用次数,默认为 1。
- `value`:超限后返回值,默认为 `None`。

**返回值**:
返回默认值或目标函数返回值。

**示例代码**:
```python
from FunKit import callLimit

@callLimit(num=2, value="调用次数已超限")
def my_function():
    return "函数正常执行"

print(my_function())
print(my_function())
print(my_function())
```

### 8. 失败重试 (`retry`)
`retry` 装饰器用于在函数执行失败时进行重试。

**参数**:
- `num`:最大尝试次数,默认为 3。
- `delay`:重试延迟时间(秒),默认为 0。
- `exc`:要捕获的异常类型,默认为 `Exception`。
- `show`:是否显示错误信息,默认为 `True`。

**返回值**:
返回目标函数返回值或异常对象。

**示例代码**:
```python
from FunKit import retry

@retry(num=3, delay=1)
def my_function():
    import random
    if random.random() < 0.5:
        raise ValueError("模拟错误")
    return "函数执行成功"

result = my_function()
print(f"结果: {result}")
```

### 9. 缓存装饰器 (`memoize`)
`memoize` 装饰器用于缓存函数的执行结果,避免重复计算。

**参数**:
- `num`:最大缓存条目数(LRU 淘汰),默认为 128。
- `ttl`:缓存有效期(秒),0 表示永久,默认为 0。

**返回值**:
返回目标函数返回值。

**示例代码**:
```python
from FunKit import memoize

@memoize(num=2, ttl=2)
def my_function(x):
    import time
    time.sleep(1)
    return x * 2

print(my_function(2))  # 第一次调用,会进行计算
print(my_function(2))  # 第二次调用,会使用缓存结果
```

### 10. 速率限制装饰器 (`rateLimit`)
`rateLimit` 装饰器用于限制函数在指定时间周期内的调用次数。

**参数**:
- `num`:周期内最大调用次数,默认为 1。
- `period`:时间周期(秒),默认为 1。
- `value`:超限后返回值,默认为 `None`。

**返回值**:
返回速率限制控制器对象。

**示例代码**:
```python
from FunKit import rateLimit

@rateLimit(num=2, period=1, value="调用速率已超限")
def my_function():
    return "函数正常执行"

print(my_function())
print(my_function())
print(my_function())
```

### 11. 性能分析装饰器 (`analyse`)
`analyse` 装饰器用于分析函数的执行性能,包括 CPU 和内存使用情况。

**参数**:
- `sampling`:采样率,默认为 0.1。
- `cpuSampling`:CPU 采样率,默认为 0.1。
- `show`:是否直接打印分析结果,默认为 `True`。
- `info`:是否返回统计信息,默认为 `False`。

**返回值**:
返回一个`元组(原函数返回值, 统计信息)` 或 `原函数返回值`,统计信息包含 CPU 和内存使用情况的分析结果和函数执行结果。

**示例代码**:
```python
from FunKit import analyse

@analyse(sampling=0.1, cpuSampling=0.1)
def intensiveFunction() -> int:
    import time
    result = 0
    for i in range(10000000):
        result += i * i
    time.sleep(1)  # 为了更好地观察内存变化
    return result
    
result = intensiveFunction()
print(f"\n函数返回结果: {result}")
```    


## 贡献
如果你发现了 bug 或者有新的功能需求,欢迎联系QQ邮箱:2449579731@qq.com

## 许可证
本项目采用 [MIT 许可证](../../Downloads/FunKit-0.1.7/LICENSE)。

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/cxfjh/FunKit",
    "name": "FunKit",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": "decorator, toolkit, fun, kit, funkit, funkit, \u88c5\u9970\u5668, \u5de5\u5177\u5305, \u51fd\u6570, \u51fd\u6570\u5f0f\u7f16\u7a0b, FunKit",
    "author": "cxfjh",
    "author_email": "2449579731@qq.com",
    "download_url": "https://files.pythonhosted.org/packages/c2/71/b1682ae1a6fc90048dadcf97b8f4428fa5443b11abecb4941592dc0490e1/funkit-0.0.3.tar.gz",
    "platform": null,
    "description": "# FunKit - \u529f\u80fd\u5f3a\u5927\u7684\u88c5\u9970\u5668\u5de5\u5177\u5305\r\n\r\n## \u7b80\u4ecb\r\n`FunKit` \u662f\u4e00\u4e2aPython\u88c5\u9970\u5668\u5de5\u5177\u5305\uff0c\u63d0\u4f9b\u4e86\u591a\u79cd\u5b9e\u7528\u7684\u88c5\u9970\u5668\uff0c\u5305\u62ec\u5b9a\u65f6\u5668\u3001\u7ebf\u7a0b\u7ba1\u7406\u3001\u8017\u65f6\u7edf\u8ba1\u3001\u5f02\u5e38\u5904\u7406\u3001\u8c03\u7528\u9650\u5236\u3001\u5931\u8d25\u91cd\u8bd5\u3001\u7f13\u5b58\u548c\u901f\u7387\u9650\u5236\u7b49\u529f\u80fd\u3002\u8fd9\u4e9b\u88c5\u9970\u5668\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u8005\u66f4\u65b9\u4fbf\u5730\u5b9e\u73b0\u590d\u6742\u7684\u529f\u80fd\uff0c\u63d0\u9ad8\u4ee3\u7801\u7684\u53ef\u8bfb\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u3002\r\n\r\n## \u5b89\u88c5\r\n\u4f60\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u5b89\u88c5 `FunKit`\uff1a\r\n```bash\r\npip install FunKit\r\n```\r\n\r\n## \u4f7f\u7528\u65b9\u6cd5\r\n\r\n### 1. \u5355\u6b21\u5b9a\u65f6\u5668 (`setTimeout`)\r\n`setTimeout` \u88c5\u9970\u5668\u7528\u4e8e\u5728\u6307\u5b9a\u7684\u5ef6\u8fdf\u65f6\u95f4\u540e\u6267\u884c\u51fd\u6570\u3002\r\n\r\n**\u53c2\u6570**\uff1a\r\n- `sleep`\uff1a\u5ef6\u8fdf\u65f6\u95f4\uff08\u79d2\uff09\uff0c\u5fc5\u987b\u4e3a\u975e\u8d1f\u6570\u3002\r\n\r\n**\u8fd4\u56de\u503c**\uff1a\r\n\u8fd4\u56de\u4e00\u4e2a `_ThreadController` \u5bf9\u8c61\uff0c\u8be5\u5bf9\u8c61\u63d0\u4f9b\u4ee5\u4e0b\u65b9\u6cd5\u548c\u5c5e\u6027\uff1a\r\n- `stop()`\uff1a\u505c\u6b62\u5b9a\u65f6\u5668\u3002\r\n- `isRun()`\uff1a\u68c0\u67e5\u5b9a\u65f6\u5668\u662f\u5426\u5728\u8fd0\u884c\u3002\r\n- `value`\uff1a\u83b7\u53d6\u5b9a\u65f6\u5668\u6267\u884c\u7ed3\u679c\u3002\r\n\r\n**\u793a\u4f8b\u4ee3\u7801**\uff1a\r\n```python\r\nfrom FunKit import setTimeout\r\n\r\n@setTimeout(sleep=2)\r\ndef my_function():\r\n    print(\"\u8fd9\u662f\u5ef6\u8fdf2\u79d2\u540e\u6267\u884c\u7684\u51fd\u6570\u3002\")\r\n\r\ncontroller = my_function()\r\n# \u5982\u679c\u4f60\u60f3\u505c\u6b62\u5b9a\u65f6\u5668\uff0c\u53ef\u4ee5\u8c03\u7528 controller.stop()\r\n```\r\n\r\n### 2. \u5faa\u73af\u5b9a\u65f6\u5668 (`setInterval`)\r\n`setInterval` \u88c5\u9970\u5668\u7528\u4e8e\u6309\u6307\u5b9a\u7684\u65f6\u95f4\u95f4\u9694\u5faa\u73af\u6267\u884c\u51fd\u6570\u3002\r\n\r\n**\u53c2\u6570**\uff1a\r\n- `interval`\uff1a\u6267\u884c\u95f4\u9694\uff08\u79d2\uff09\uff0c\u5fc5\u987b\u4e3a\u975e\u8d1f\u6570\u3002\r\n- `end`\uff1a\u6700\u5927\u6301\u7eed\u65f6\u95f4\uff08\u79d2\uff09\uff0c0 \u8868\u793a\u65e0\u9650\uff0c\u5fc5\u987b\u4e3a\u975e\u8d1f\u6570\u3002\r\n\r\n**\u8fd4\u56de\u503c**\uff1a\r\n\u8fd4\u56de\u4e00\u4e2a `_ThreadController` \u5bf9\u8c61\uff0c\u8be5\u5bf9\u8c61\u63d0\u4f9b\u4ee5\u4e0b\u65b9\u6cd5\u548c\u5c5e\u6027\uff1a\r\n- `stop()`\uff1a\u505c\u6b62\u5b9a\u65f6\u5668\u3002\r\n- `isRun()`\uff1a\u68c0\u67e5\u5b9a\u65f6\u5668\u662f\u5426\u5728\u8fd0\u884c\u3002\r\n- `value`\uff1a\u83b7\u53d6\u5b9a\u65f6\u5668\u6267\u884c\u7ed3\u679c\uff0c\u7ed3\u679c\u5b58\u50a8\u5728\u5217\u8868\u4e2d\u3002\r\n\r\n**\u793a\u4f8b\u4ee3\u7801**\uff1a\r\n```python\r\nfrom FunKit import setInterval\r\n\r\n@setInterval(interval=1, end=5)\r\ndef my_function():\r\n    print(\"\u8fd9\u662f\u6bcf\u79d2\u6267\u884c\u4e00\u6b21\uff0c\u6301\u7eed5\u79d2\u7684\u51fd\u6570\u3002\")\r\n\r\ncontroller = my_function()\r\n# \u5982\u679c\u4f60\u60f3\u63d0\u524d\u505c\u6b62\u5b9a\u65f6\u5668\uff0c\u53ef\u4ee5\u8c03\u7528 controller.stop()\r\n```\r\n\r\n### 3. \u521b\u5efa\u591a\u7ebf\u7a0b (`createThread`)\r\n`createThread` \u88c5\u9970\u5668\u7528\u4e8e\u5c06\u51fd\u6570\u5c01\u88c5\u6210\u7ebf\u7a0b\u6267\u884c\u3002\r\n\r\n**\u53c2\u6570**\uff1a\r\n- `inherit`\uff1a\u662f\u5426\u8981\u968f\u7740\u4e3b\u7ebf\u7a0b\u7ed3\u675f\u800c\u7ed3\u675f\uff0c\u9ed8\u8ba4\u4e3a `False`\u3002\r\n\r\n**\u8fd4\u56de\u503c**\uff1a\r\n\u8fd4\u56de\u4e00\u4e2a `_ThreadController` \u5bf9\u8c61\uff0c\u8be5\u5bf9\u8c61\u63d0\u4f9b\u4ee5\u4e0b\u65b9\u6cd5\u548c\u5c5e\u6027\uff1a\r\n- `isRun()`\uff1a\u68c0\u67e5\u7ebf\u7a0b\u662f\u5426\u5728\u8fd0\u884c\u3002\r\n- `value`\uff1a\u83b7\u53d6\u7ebf\u7a0b\u6267\u884c\u7ed3\u679c\u3002\r\n\r\n**\u793a\u4f8b\u4ee3\u7801**\uff1a\r\n```python\r\nfrom FunKit import createThread\r\n\r\n@createThread(inherit=True)\r\ndef my_function():\r\n    print(\"\u8fd9\u662f\u5728\u65b0\u7ebf\u7a0b\u4e2d\u6267\u884c\u7684\u51fd\u6570\u3002\")\r\n\r\ncontroller = my_function()\r\n```\r\n\r\n### 4. \u8017\u65f6\u8ba1\u7b97 (`timeIt`)\r\n`timeIt` \u88c5\u9970\u5668\u7528\u4e8e\u7edf\u8ba1\u51fd\u6570\u7684\u6267\u884c\u8017\u65f6\u3002\r\n\r\n**\u53c2\u6570**\uff1a\r\n- `num`\uff1a\u6267\u884c\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e3a 1\u3002\r\n- `show`\uff1a\u662f\u5426\u76f4\u63a5\u6253\u5370\u8017\u65f6\u4fe1\u606f\uff0c\u9ed8\u8ba4\u4e3a `True`\u3002\r\n- `info`\uff1a\u662f\u5426\u8fd4\u56de\u8017\u65f6\u4fe1\u606f\uff0c\u9ed8\u8ba4\u4e3a `False`\u3002\r\n- \r\n**\u8fd4\u56de\u503c**\uff1a\r\n\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4 `(\u539f\u51fd\u6570\u8fd4\u56de\u503c, \u8017\u65f6\u4fe1\u606f)` \u6216 `\u539f\u51fd\u6570\u8fd4\u56de\u503c`\uff0c\u5176\u4e2d\u8017\u65f6\u4fe1\u606f\u662f\u4e00\u4e2a\u5b57\u5178\uff0c\u5305\u542b\u5e73\u5747\u8017\u65f6\u3001\u6700\u5c0f\u8017\u65f6\u3001\u6700\u5927\u8017\u65f6\u3001\u603b\u8017\u65f6\u7b49\u4fe1\u606f\u3002\r\n\r\n**\u793a\u4f8b\u4ee3\u7801**\uff1a\r\n```python\r\nfrom FunKit import timeIt\r\n\r\n@timeIt(num=3)\r\ndef my_function():\r\n    # \u6a21\u62df\u8017\u65f6\u64cd\u4f5c\r\n    import time\r\n    time.sleep(1)\r\n    return \"\u51fd\u6570\u6267\u884c\u5b8c\u6210\"\r\n\r\nresult, elapsed = my_function()\r\nprint(f\"\u51fd\u6570\u8fd4\u56de\u503c: {result}\")\r\nprint(f\"\u8017\u65f6\u4fe1\u606f: {elapsed}\")\r\n```\r\n\r\n### 5. \u5f02\u5e38\u5904\u7406 (`catch`)\r\n`catch` \u88c5\u9970\u5668\u7528\u4e8e\u6355\u83b7\u51fd\u6570\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u5f02\u5e38\u3002\r\n\r\n**\u53c2\u6570**\uff1a\r\n- `exc`\uff1a\u8981\u6355\u83b7\u7684\u5f02\u5e38\u7c7b\u578b\uff0c\u9ed8\u8ba4\u4e3a `Exception`\u3002\r\n- `value`\uff1a\u5f02\u5e38\u53d1\u751f\u65f6\u8fd4\u56de\u7684\u9ed8\u8ba4\u503c\uff0c\u9ed8\u8ba4\u4e3a `None`\u3002\r\n- `reRaise`\uff1a\u662f\u5426\u91cd\u65b0\u629b\u51fa\u5f02\u5e38\uff0c\u9ed8\u8ba4\u4e3a `False`\u3002\r\n- `show`\uff1a\u662f\u5426\u663e\u793a\u9519\u8bef\u4fe1\u606f\uff0c\u9ed8\u8ba4\u4e3a `True`\u3002\r\n\r\n**\u8fd4\u56de\u503c**\uff1a\r\n\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4 `(\u9ed8\u8ba4\u503c, \u5f02\u5e38\u5bf9\u8c61)`\u3002\r\n\r\n**\u793a\u4f8b\u4ee3\u7801**\uff1a\r\n```python\r\nfrom FunKit import catch\r\n\r\n@catch(exc=ZeroDivisionError, value=\"\u53d1\u751f\u9664\u96f6\u9519\u8bef\")\r\ndef my_function():\r\n    return 1 / 0\r\n\r\nresult, error = my_function()\r\nprint(f\"\u7ed3\u679c: {result}\")\r\nprint(f\"\u5f02\u5e38\u5bf9\u8c61: {error}\")\r\n```\r\n\r\n### 6. \u5168\u5c40\u5f02\u5e38\u6355\u83b7 (`catchAll`)\r\n`catchAll` \u88c5\u9970\u5668\u7528\u4e8e\u5bf9\u6307\u5b9a\u6a21\u5757\u4e2d\u7684\u6240\u6709\u7528\u6237\u5b9a\u4e49\u51fd\u6570\u8fdb\u884c\u5168\u5c40\u5f02\u5e38\u6355\u83b7\u3002\r\n\r\n**\u53c2\u6570**\uff1a\r\n- `name`\uff1a\u9700\u8981\u5904\u7406\u7684\u6a21\u5757\u540d\u79f0\u3002\r\n- `exc`\uff1a\u8981\u6355\u83b7\u7684\u5f02\u5e38\u7c7b\u578b\uff0c\u9ed8\u8ba4\u4e3a `Exception`\u3002\r\n- `value`\uff1a\u5f02\u5e38\u53d1\u751f\u65f6\u8fd4\u56de\u7684\u9ed8\u8ba4\u503c\uff0c\u9ed8\u8ba4\u4e3a `None`\u3002\r\n- `reRaise`\uff1a\u662f\u5426\u91cd\u65b0\u629b\u51fa\u5f02\u5e38\uff0c\u9ed8\u8ba4\u4e3a `False`\u3002\r\n- `show`\uff1a\u662f\u5426\u663e\u793a\u9519\u8bef\u4fe1\u606f\uff0c\u9ed8\u8ba4\u4e3a `True`\u3002\r\n\r\n**\u8fd4\u56de\u503c**\uff1a\r\n\u8fd4\u56de\u4e00\u4e2a\u5143\u7ec4 `(\u9ed8\u8ba4\u503c, \u5f02\u5e38\u5bf9\u8c61)`\u3002\r\n\r\n**\u793a\u4f8b\u4ee3\u7801**\uff1a\r\n```python\r\nimport FunKit\r\nfrom FunKit import catchAll\r\n\r\ndef my_function():\r\n    return 1 / 0\r\n\r\ncatchAll(name=__name__)\r\ntry:\r\n    result = my_function()\r\nexcept Exception as e:\r\n    print(f\"\u6355\u83b7\u5230\u5f02\u5e38: {e}\")\r\n```\r\n\r\n### 7. \u8c03\u7528\u9650\u5236 (`callLimit`)\r\n`callLimit` \u88c5\u9970\u5668\u7528\u4e8e\u9650\u5236\u51fd\u6570\u7684\u8c03\u7528\u6b21\u6570\u3002\r\n\r\n**\u53c2\u6570**\uff1a\r\n- `num`\uff1a\u6700\u5927\u5141\u8bb8\u8c03\u7528\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e3a 1\u3002\r\n- `value`\uff1a\u8d85\u9650\u540e\u8fd4\u56de\u503c\uff0c\u9ed8\u8ba4\u4e3a `None`\u3002\r\n\r\n**\u8fd4\u56de\u503c**\uff1a\r\n\u8fd4\u56de\u9ed8\u8ba4\u503c\u6216\u76ee\u6807\u51fd\u6570\u8fd4\u56de\u503c\u3002\r\n\r\n**\u793a\u4f8b\u4ee3\u7801**\uff1a\r\n```python\r\nfrom FunKit import callLimit\r\n\r\n@callLimit(num=2, value=\"\u8c03\u7528\u6b21\u6570\u5df2\u8d85\u9650\")\r\ndef my_function():\r\n    return \"\u51fd\u6570\u6b63\u5e38\u6267\u884c\"\r\n\r\nprint(my_function())\r\nprint(my_function())\r\nprint(my_function())\r\n```\r\n\r\n### 8. \u5931\u8d25\u91cd\u8bd5 (`retry`)\r\n`retry` \u88c5\u9970\u5668\u7528\u4e8e\u5728\u51fd\u6570\u6267\u884c\u5931\u8d25\u65f6\u8fdb\u884c\u91cd\u8bd5\u3002\r\n\r\n**\u53c2\u6570**\uff1a\r\n- `num`\uff1a\u6700\u5927\u5c1d\u8bd5\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e3a 3\u3002\r\n- `delay`\uff1a\u91cd\u8bd5\u5ef6\u8fdf\u65f6\u95f4\uff08\u79d2\uff09\uff0c\u9ed8\u8ba4\u4e3a 0\u3002\r\n- `exc`\uff1a\u8981\u6355\u83b7\u7684\u5f02\u5e38\u7c7b\u578b\uff0c\u9ed8\u8ba4\u4e3a `Exception`\u3002\r\n- `show`\uff1a\u662f\u5426\u663e\u793a\u9519\u8bef\u4fe1\u606f\uff0c\u9ed8\u8ba4\u4e3a `True`\u3002\r\n\r\n**\u8fd4\u56de\u503c**\uff1a\r\n\u8fd4\u56de\u76ee\u6807\u51fd\u6570\u8fd4\u56de\u503c\u6216\u5f02\u5e38\u5bf9\u8c61\u3002\r\n\r\n**\u793a\u4f8b\u4ee3\u7801**\uff1a\r\n```python\r\nfrom FunKit import retry\r\n\r\n@retry(num=3, delay=1)\r\ndef my_function():\r\n    import random\r\n    if random.random() < 0.5:\r\n        raise ValueError(\"\u6a21\u62df\u9519\u8bef\")\r\n    return \"\u51fd\u6570\u6267\u884c\u6210\u529f\"\r\n\r\nresult = my_function()\r\nprint(f\"\u7ed3\u679c: {result}\")\r\n```\r\n\r\n### 9. \u7f13\u5b58\u88c5\u9970\u5668 (`memoize`)\r\n`memoize` \u88c5\u9970\u5668\u7528\u4e8e\u7f13\u5b58\u51fd\u6570\u7684\u6267\u884c\u7ed3\u679c\uff0c\u907f\u514d\u91cd\u590d\u8ba1\u7b97\u3002\r\n\r\n**\u53c2\u6570**\uff1a\r\n- `num`\uff1a\u6700\u5927\u7f13\u5b58\u6761\u76ee\u6570\uff08LRU \u6dd8\u6c70\uff09\uff0c\u9ed8\u8ba4\u4e3a 128\u3002\r\n- `ttl`\uff1a\u7f13\u5b58\u6709\u6548\u671f\uff08\u79d2\uff09\uff0c0 \u8868\u793a\u6c38\u4e45\uff0c\u9ed8\u8ba4\u4e3a 0\u3002\r\n\r\n**\u8fd4\u56de\u503c**\uff1a\r\n\u8fd4\u56de\u76ee\u6807\u51fd\u6570\u8fd4\u56de\u503c\u3002\r\n\r\n**\u793a\u4f8b\u4ee3\u7801**\uff1a\r\n```python\r\nfrom FunKit import memoize\r\n\r\n@memoize(num=2, ttl=2)\r\ndef my_function(x):\r\n    import time\r\n    time.sleep(1)\r\n    return x * 2\r\n\r\nprint(my_function(2))  # \u7b2c\u4e00\u6b21\u8c03\u7528\uff0c\u4f1a\u8fdb\u884c\u8ba1\u7b97\r\nprint(my_function(2))  # \u7b2c\u4e8c\u6b21\u8c03\u7528\uff0c\u4f1a\u4f7f\u7528\u7f13\u5b58\u7ed3\u679c\r\n```\r\n\r\n### 10. \u901f\u7387\u9650\u5236\u88c5\u9970\u5668 (`rateLimit`)\r\n`rateLimit` \u88c5\u9970\u5668\u7528\u4e8e\u9650\u5236\u51fd\u6570\u5728\u6307\u5b9a\u65f6\u95f4\u5468\u671f\u5185\u7684\u8c03\u7528\u6b21\u6570\u3002\r\n\r\n**\u53c2\u6570**\uff1a\r\n- `num`\uff1a\u5468\u671f\u5185\u6700\u5927\u8c03\u7528\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e3a 1\u3002\r\n- `period`\uff1a\u65f6\u95f4\u5468\u671f\uff08\u79d2\uff09\uff0c\u9ed8\u8ba4\u4e3a 1\u3002\r\n- `value`\uff1a\u8d85\u9650\u540e\u8fd4\u56de\u503c\uff0c\u9ed8\u8ba4\u4e3a `None`\u3002\r\n\r\n**\u8fd4\u56de\u503c**\uff1a\r\n\u8fd4\u56de\u901f\u7387\u9650\u5236\u63a7\u5236\u5668\u5bf9\u8c61\u3002\r\n\r\n**\u793a\u4f8b\u4ee3\u7801**\uff1a\r\n```python\r\nfrom FunKit import rateLimit\r\n\r\n@rateLimit(num=2, period=1, value=\"\u8c03\u7528\u901f\u7387\u5df2\u8d85\u9650\")\r\ndef my_function():\r\n    return \"\u51fd\u6570\u6b63\u5e38\u6267\u884c\"\r\n\r\nprint(my_function())\r\nprint(my_function())\r\nprint(my_function())\r\n```\r\n\r\n### 11. \u6027\u80fd\u5206\u6790\u88c5\u9970\u5668 (`analyse`)\r\n`analyse` \u88c5\u9970\u5668\u7528\u4e8e\u5206\u6790\u51fd\u6570\u7684\u6267\u884c\u6027\u80fd\uff0c\u5305\u62ec CPU \u548c\u5185\u5b58\u4f7f\u7528\u60c5\u51b5\u3002\r\n\r\n**\u53c2\u6570**\uff1a\r\n- `sampling`\uff1a\u91c7\u6837\u7387\uff0c\u9ed8\u8ba4\u4e3a 0.1\u3002\r\n- `cpuSampling`\uff1aCPU \u91c7\u6837\u7387\uff0c\u9ed8\u8ba4\u4e3a 0.1\u3002\r\n- `show`\uff1a\u662f\u5426\u76f4\u63a5\u6253\u5370\u5206\u6790\u7ed3\u679c\uff0c\u9ed8\u8ba4\u4e3a `True`\u3002\r\n- `info`\uff1a\u662f\u5426\u8fd4\u56de\u7edf\u8ba1\u4fe1\u606f\uff0c\u9ed8\u8ba4\u4e3a `False`\u3002\r\n\r\n**\u8fd4\u56de\u503c**\uff1a\r\n\u8fd4\u56de\u4e00\u4e2a`\u5143\u7ec4(\u539f\u51fd\u6570\u8fd4\u56de\u503c, \u7edf\u8ba1\u4fe1\u606f)` \u6216 `\u539f\u51fd\u6570\u8fd4\u56de\u503c`\uff0c\u7edf\u8ba1\u4fe1\u606f\u5305\u542b CPU \u548c\u5185\u5b58\u4f7f\u7528\u60c5\u51b5\u7684\u5206\u6790\u7ed3\u679c\u548c\u51fd\u6570\u6267\u884c\u7ed3\u679c\u3002\r\n\r\n**\u793a\u4f8b\u4ee3\u7801**\uff1a\r\n```python\r\nfrom FunKit import analyse\r\n\r\n@analyse(sampling=0.1, cpuSampling=0.1)\r\ndef intensiveFunction() -> int:\r\n    import time\r\n    result = 0\r\n    for i in range(10000000):\r\n        result += i * i\r\n    time.sleep(1)  # \u4e3a\u4e86\u66f4\u597d\u5730\u89c2\u5bdf\u5185\u5b58\u53d8\u5316\r\n    return result\r\n    \r\nresult = intensiveFunction()\r\nprint(f\"\\n\u51fd\u6570\u8fd4\u56de\u7ed3\u679c: {result}\")\r\n```    \r\n\r\n\r\n## \u8d21\u732e\r\n\u5982\u679c\u4f60\u53d1\u73b0\u4e86 bug \u6216\u8005\u6709\u65b0\u7684\u529f\u80fd\u9700\u6c42\uff0c\u6b22\u8fce\u8054\u7cfbQQ\u90ae\u7bb1\uff1a2449579731@qq.com\r\n\r\n## \u8bb8\u53ef\u8bc1\r\n\u672c\u9879\u76ee\u91c7\u7528 [MIT \u8bb8\u53ef\u8bc1](../../Downloads/FunKit-0.1.7/LICENSE)\u3002\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684 Python \u88c5\u9970\u5668\u5de5\u5177\u5305 | A powerful Python decorator toolkit",
    "version": "0.0.3",
    "project_urls": {
        "Homepage": "https://github.com/cxfjh/FunKit"
    },
    "split_keywords": [
        "decorator",
        " toolkit",
        " fun",
        " kit",
        " funkit",
        " funkit",
        " \u88c5\u9970\u5668",
        " \u5de5\u5177\u5305",
        " \u51fd\u6570",
        " \u51fd\u6570\u5f0f\u7f16\u7a0b",
        " funkit"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d493f2ddae4a807165577859762927db2d6b6ba7f6e7f14cc716c394443a7193",
                "md5": "8b55e0e0a1e9d04fa578bce565fc50f4",
                "sha256": "31ff46b88494f260ddaab58d037b7bbc320b43fe31e1e538e928b3e5a14b9461"
            },
            "downloads": -1,
            "filename": "funkit-0.0.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "8b55e0e0a1e9d04fa578bce565fc50f4",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 10266,
            "upload_time": "2025-07-15T14:44:29",
            "upload_time_iso_8601": "2025-07-15T14:44:29.033470Z",
            "url": "https://files.pythonhosted.org/packages/d4/93/f2ddae4a807165577859762927db2d6b6ba7f6e7f14cc716c394443a7193/funkit-0.0.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c271b1682ae1a6fc90048dadcf97b8f4428fa5443b11abecb4941592dc0490e1",
                "md5": "04957176961b0401c9f34299934bf89e",
                "sha256": "6a21de971e76392424cd5254a3db50c5b09feabdd6ce8ebf790185aa19c7f3e9"
            },
            "downloads": -1,
            "filename": "funkit-0.0.3.tar.gz",
            "has_sig": false,
            "md5_digest": "04957176961b0401c9f34299934bf89e",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 10023,
            "upload_time": "2025-07-15T14:44:30",
            "upload_time_iso_8601": "2025-07-15T14:44:30.202200Z",
            "url": "https://files.pythonhosted.org/packages/c2/71/b1682ae1a6fc90048dadcf97b8f4428fa5443b11abecb4941592dc0490e1/funkit-0.0.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-15 14:44:30",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "cxfjh",
    "github_project": "FunKit",
    "github_not_found": true,
    "lcname": "funkit"
}
        
Elapsed time: 2.34692s