# 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"
}