funcguard 0.2.43__tar.gz → 0.2.45__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {funcguard-0.2.43 → funcguard-0.2.45}/PKG-INFO +38 -2
- {funcguard-0.2.43 → funcguard-0.2.45}/README.md +37 -1
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/__init__.py +2 -1
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/core.py +96 -3
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard.egg-info/PKG-INFO +38 -2
- {funcguard-0.2.43 → funcguard-0.2.45}/setup.py +1 -1
- {funcguard-0.2.43 → funcguard-0.2.45}/LICENSE +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/calculate.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/data_models/__init__.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/data_models/request_models.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/ip_utils.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/log_utils.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/pd_utils/__init__.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/pd_utils/convert_utils.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/pd_utils/date_utils.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/pd_utils/fill_round.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/pd_utils/filter.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/pd_utils/json_utils/__init__.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/pd_utils/json_utils/json_parser.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/pd_utils/statistics/__init__.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/pd_utils/statistics/agg_utils.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/pd_utils/statistics/count_utils.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/pd_utils/statistics/df_statistics.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/pd_utils/statistics/mask_utils.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/printer.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/time_utils.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard/tools.py +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard.egg-info/SOURCES.txt +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard.egg-info/dependency_links.txt +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard.egg-info/not-zip-safe +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard.egg-info/requires.txt +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/funcguard.egg-info/top_level.txt +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/setup.cfg +0 -0
- {funcguard-0.2.43 → funcguard-0.2.45}/tests/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: funcguard
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.45
|
|
4
4
|
Summary: FuncGuard是一个Python库,提供函数执行超时控制、重试机制、HTTP请求封装和格式化打印工具。
|
|
5
5
|
Home-page: https://github.com/tinycen/funcguard
|
|
6
6
|
Author: tinycen
|
|
@@ -34,7 +34,7 @@ FuncGuard是一个Python库,提供了函数执行超时控制和重试机制
|
|
|
34
34
|
|
|
35
35
|
| 分类 | 功能描述 | 文档 |
|
|
36
36
|
|------|----------|------|
|
|
37
|
-
| **核心功能** |
|
|
37
|
+
| **核心功能** | 函数执行超时控制、函数执行失败自动重试、交互式选择菜单 | - |
|
|
38
38
|
| **网络请求** | HTTP请求封装(支持自动重试)、MD5哈希、Basic Auth编码 | [查看](./docs/network.md) |
|
|
39
39
|
| **时间工具** | 时间日志记录、耗时统计、执行时间监控和警告、时间等待(带倒计时) | [查看](./docs/time_utils.md) |
|
|
40
40
|
| **打印工具** | 格式化分隔线、块打印、标题打印、进度条显示 | - |
|
|
@@ -95,6 +95,41 @@ except Exception as e:
|
|
|
95
95
|
print(f"重试后仍然失败: {e}")
|
|
96
96
|
```
|
|
97
97
|
|
|
98
|
+
### 交互式选择菜单
|
|
99
|
+
|
|
100
|
+
使用 `ask_select` 函数创建一个带数字编号的交互式选择菜单(编号从0开始),支持超时自动选择和倒计时动态显示:
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
from funcguard import ask_select
|
|
104
|
+
|
|
105
|
+
# 基础用法 - 选择属性填写模式
|
|
106
|
+
result = ask_select(
|
|
107
|
+
options={True: "需要填写属性", False: "不需要填写属性", "all": "不限制"},
|
|
108
|
+
default_key="all",
|
|
109
|
+
prompt="请选择属性填写模式",
|
|
110
|
+
timeout=5
|
|
111
|
+
)
|
|
112
|
+
print(f"用户选择: {result}") # 返回 True, False 或 "all"
|
|
113
|
+
|
|
114
|
+
# 选择部署环境
|
|
115
|
+
env = ask_select(
|
|
116
|
+
options={"dev": "开发环境", "test": "测试环境", "prod": "生产环境"},
|
|
117
|
+
default_key="dev",
|
|
118
|
+
prompt="请选择部署环境",
|
|
119
|
+
timeout=3
|
|
120
|
+
)
|
|
121
|
+
print(f"当前环境: {env}")
|
|
122
|
+
|
|
123
|
+
# 选择数量(使用整数作为键)
|
|
124
|
+
count = ask_select(
|
|
125
|
+
options={10: "10条", 50: "50条", 100: "100条"},
|
|
126
|
+
default_key=50,
|
|
127
|
+
prompt="查询数量",
|
|
128
|
+
timeout=5
|
|
129
|
+
)
|
|
130
|
+
print(f"查询 {count} 条数据")
|
|
131
|
+
```
|
|
132
|
+
|
|
98
133
|
### HTTP请求
|
|
99
134
|
|
|
100
135
|
FuncGuard 提供了强大的 HTTP 请求功能,支持自动重试、请求日志记录、以及 curl_cffi 兜底(用于绕过反爬虫检测)。详细文档请参考 [network.md](docs/network.md)。
|
|
@@ -496,6 +531,7 @@ print(f"当前价格: {current_price}, 变化: {price_change}") # 输出: 当
|
|
|
496
531
|
|-----------|----------|
|
|
497
532
|
| `timeout_handler` | 函数执行超时控制 |
|
|
498
533
|
| `retry_function` | 函数执行失败自动重试 |
|
|
534
|
+
| `ask_select` | 交互式数字选择菜单(支持超时自动选择) |
|
|
499
535
|
|
|
500
536
|
### 网络请求
|
|
501
537
|
|
|
@@ -7,7 +7,7 @@ FuncGuard是一个Python库,提供了函数执行超时控制和重试机制
|
|
|
7
7
|
|
|
8
8
|
| 分类 | 功能描述 | 文档 |
|
|
9
9
|
|------|----------|------|
|
|
10
|
-
| **核心功能** |
|
|
10
|
+
| **核心功能** | 函数执行超时控制、函数执行失败自动重试、交互式选择菜单 | - |
|
|
11
11
|
| **网络请求** | HTTP请求封装(支持自动重试)、MD5哈希、Basic Auth编码 | [查看](./docs/network.md) |
|
|
12
12
|
| **时间工具** | 时间日志记录、耗时统计、执行时间监控和警告、时间等待(带倒计时) | [查看](./docs/time_utils.md) |
|
|
13
13
|
| **打印工具** | 格式化分隔线、块打印、标题打印、进度条显示 | - |
|
|
@@ -68,6 +68,41 @@ except Exception as e:
|
|
|
68
68
|
print(f"重试后仍然失败: {e}")
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
+
### 交互式选择菜单
|
|
72
|
+
|
|
73
|
+
使用 `ask_select` 函数创建一个带数字编号的交互式选择菜单(编号从0开始),支持超时自动选择和倒计时动态显示:
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
from funcguard import ask_select
|
|
77
|
+
|
|
78
|
+
# 基础用法 - 选择属性填写模式
|
|
79
|
+
result = ask_select(
|
|
80
|
+
options={True: "需要填写属性", False: "不需要填写属性", "all": "不限制"},
|
|
81
|
+
default_key="all",
|
|
82
|
+
prompt="请选择属性填写模式",
|
|
83
|
+
timeout=5
|
|
84
|
+
)
|
|
85
|
+
print(f"用户选择: {result}") # 返回 True, False 或 "all"
|
|
86
|
+
|
|
87
|
+
# 选择部署环境
|
|
88
|
+
env = ask_select(
|
|
89
|
+
options={"dev": "开发环境", "test": "测试环境", "prod": "生产环境"},
|
|
90
|
+
default_key="dev",
|
|
91
|
+
prompt="请选择部署环境",
|
|
92
|
+
timeout=3
|
|
93
|
+
)
|
|
94
|
+
print(f"当前环境: {env}")
|
|
95
|
+
|
|
96
|
+
# 选择数量(使用整数作为键)
|
|
97
|
+
count = ask_select(
|
|
98
|
+
options={10: "10条", 50: "50条", 100: "100条"},
|
|
99
|
+
default_key=50,
|
|
100
|
+
prompt="查询数量",
|
|
101
|
+
timeout=5
|
|
102
|
+
)
|
|
103
|
+
print(f"查询 {count} 条数据")
|
|
104
|
+
```
|
|
105
|
+
|
|
71
106
|
### HTTP请求
|
|
72
107
|
|
|
73
108
|
FuncGuard 提供了强大的 HTTP 请求功能,支持自动重试、请求日志记录、以及 curl_cffi 兜底(用于绕过反爬虫检测)。详细文档请参考 [network.md](docs/network.md)。
|
|
@@ -469,6 +504,7 @@ print(f"当前价格: {current_price}, 变化: {price_change}") # 输出: 当
|
|
|
469
504
|
|-----------|----------|
|
|
470
505
|
| `timeout_handler` | 函数执行超时控制 |
|
|
471
506
|
| `retry_function` | 函数执行失败自动重试 |
|
|
507
|
+
| `ask_select` | 交互式数字选择菜单(支持超时自动选择) |
|
|
472
508
|
|
|
473
509
|
### 网络请求
|
|
474
510
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from .core import timeout_handler, retry_function
|
|
1
|
+
from .core import timeout_handler, retry_function, ask_select
|
|
2
2
|
from .tools import send_request, curl_cffi_request, check_url_valid, encode_basic_auth, md5_hash
|
|
3
3
|
from .time_utils import (
|
|
4
4
|
time_log, time_diff, time_monitor, time_wait, color_logger,
|
|
@@ -50,6 +50,7 @@ __all__ = [
|
|
|
50
50
|
# 核心功能
|
|
51
51
|
"timeout_handler",
|
|
52
52
|
"retry_function",
|
|
53
|
+
"ask_select",
|
|
53
54
|
|
|
54
55
|
# 网络请求工具
|
|
55
56
|
"md5_hash",
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from concurrent.futures import ThreadPoolExecutor , TimeoutError
|
|
3
|
+
|
|
4
|
+
|
|
1
5
|
class FuncguardTimeoutError(Exception):
|
|
2
6
|
"""
|
|
3
7
|
funcguard库专用的超时异常类。
|
|
4
|
-
|
|
8
|
+
|
|
5
9
|
为了避免与concurrent.futures.TimeoutError和Python内置TimeoutError的命名冲突,
|
|
6
10
|
特定义此异常类来明确表示这是funcguard库抛出的函数执行超时异常。
|
|
7
11
|
这样用户可以清晰地区分异常来源,并进行针对性的异常处理。
|
|
8
12
|
"""
|
|
9
13
|
pass
|
|
10
14
|
|
|
11
|
-
import time
|
|
12
|
-
from concurrent.futures import ThreadPoolExecutor , TimeoutError
|
|
13
15
|
|
|
14
16
|
# 计算函数运行时间
|
|
15
17
|
def timeout_handler( func, args = (), kwargs = None, execution_timeout = 90 ):
|
|
@@ -86,3 +88,94 @@ def retry_function( func , max_retries = 5 , execute_timeout = 90 , task_name =
|
|
|
86
88
|
if last_exception:
|
|
87
89
|
raise last_exception # 重新抛出最后一个异常
|
|
88
90
|
return None
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# 交互式选择菜单
|
|
94
|
+
def ask_select(
|
|
95
|
+
options: dict,
|
|
96
|
+
default_key = None,
|
|
97
|
+
prompt: str = "请选择",
|
|
98
|
+
timeout: int = 5,
|
|
99
|
+
):
|
|
100
|
+
"""
|
|
101
|
+
显示一个数字选择菜单,接受用户输入,超时自动返回默认值。
|
|
102
|
+
|
|
103
|
+
参数:
|
|
104
|
+
options: 字典,键为选项标识(任意类型),值为显示文本
|
|
105
|
+
例如: {True: "需要填写属性", False: "不需要填写属性", "all": "不限制"}
|
|
106
|
+
default_key: 超时或输入无效时的默认返回值,若为None则使用最后一个选项的键
|
|
107
|
+
prompt: 提示语前缀
|
|
108
|
+
timeout: 超时时间(秒),默认5秒
|
|
109
|
+
|
|
110
|
+
返回:
|
|
111
|
+
用户选择的选项键(options中的某个键),或default_key
|
|
112
|
+
|
|
113
|
+
示例:
|
|
114
|
+
>>> result = ask_select(
|
|
115
|
+
... {True: "需要填写属性", False: "不需要填写属性", "all": "不限制"},
|
|
116
|
+
... default_key="all",
|
|
117
|
+
... prompt="请选择属性填写模式",
|
|
118
|
+
... timeout=5,
|
|
119
|
+
... )
|
|
120
|
+
"""
|
|
121
|
+
# 确保选项非空
|
|
122
|
+
if not options:
|
|
123
|
+
raise ValueError("options字典不能为空")
|
|
124
|
+
|
|
125
|
+
# 设置默认值
|
|
126
|
+
if default_key is None:
|
|
127
|
+
default_key = list(options.keys())[-1]
|
|
128
|
+
|
|
129
|
+
# 构建选项列表(保持字典顺序)
|
|
130
|
+
items = list(options.items())
|
|
131
|
+
|
|
132
|
+
# 显示选项
|
|
133
|
+
option_lines = ", ".join([f"{i}-{label}" for i, (_, label) in enumerate(items)])
|
|
134
|
+
default_label = options.get(default_key, default_key)
|
|
135
|
+
|
|
136
|
+
# 使用线程实现跨平台超时输入
|
|
137
|
+
from threading import Thread
|
|
138
|
+
from queue import Queue, Empty
|
|
139
|
+
|
|
140
|
+
result_queue = Queue()
|
|
141
|
+
|
|
142
|
+
def input_thread():
|
|
143
|
+
try:
|
|
144
|
+
user_input = input().strip()
|
|
145
|
+
result_queue.put(user_input)
|
|
146
|
+
except EOFError:
|
|
147
|
+
result_queue.put(None)
|
|
148
|
+
|
|
149
|
+
thread = Thread(target=input_thread, daemon=True)
|
|
150
|
+
thread.start()
|
|
151
|
+
|
|
152
|
+
# 倒计时显示
|
|
153
|
+
remaining = timeout
|
|
154
|
+
while remaining > 0 and thread.is_alive():
|
|
155
|
+
print(f"\r{prompt} ({option_lines}),{remaining} 秒后自动选择[{default_label}]: ", end="", flush=True)
|
|
156
|
+
time.sleep(1)
|
|
157
|
+
remaining -= 1
|
|
158
|
+
|
|
159
|
+
# 等待线程结束(如果用户已输入)或超时
|
|
160
|
+
thread.join(0)
|
|
161
|
+
|
|
162
|
+
try:
|
|
163
|
+
user_input = result_queue.get_nowait()
|
|
164
|
+
except Empty:
|
|
165
|
+
user_input = None
|
|
166
|
+
|
|
167
|
+
if user_input is None:
|
|
168
|
+
print(f"\n超时,自动选择[{default_label}]")
|
|
169
|
+
return default_key
|
|
170
|
+
|
|
171
|
+
# 验证输入
|
|
172
|
+
try:
|
|
173
|
+
choice = int(user_input)
|
|
174
|
+
if 1 <= choice <= len(items):
|
|
175
|
+
return items[choice - 1][0]
|
|
176
|
+
except ValueError:
|
|
177
|
+
pass
|
|
178
|
+
|
|
179
|
+
# 输入无效,返回默认值
|
|
180
|
+
print(f"输入无效,使用默认选项[{default_label}]")
|
|
181
|
+
return default_key
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: funcguard
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.45
|
|
4
4
|
Summary: FuncGuard是一个Python库,提供函数执行超时控制、重试机制、HTTP请求封装和格式化打印工具。
|
|
5
5
|
Home-page: https://github.com/tinycen/funcguard
|
|
6
6
|
Author: tinycen
|
|
@@ -34,7 +34,7 @@ FuncGuard是一个Python库,提供了函数执行超时控制和重试机制
|
|
|
34
34
|
|
|
35
35
|
| 分类 | 功能描述 | 文档 |
|
|
36
36
|
|------|----------|------|
|
|
37
|
-
| **核心功能** |
|
|
37
|
+
| **核心功能** | 函数执行超时控制、函数执行失败自动重试、交互式选择菜单 | - |
|
|
38
38
|
| **网络请求** | HTTP请求封装(支持自动重试)、MD5哈希、Basic Auth编码 | [查看](./docs/network.md) |
|
|
39
39
|
| **时间工具** | 时间日志记录、耗时统计、执行时间监控和警告、时间等待(带倒计时) | [查看](./docs/time_utils.md) |
|
|
40
40
|
| **打印工具** | 格式化分隔线、块打印、标题打印、进度条显示 | - |
|
|
@@ -95,6 +95,41 @@ except Exception as e:
|
|
|
95
95
|
print(f"重试后仍然失败: {e}")
|
|
96
96
|
```
|
|
97
97
|
|
|
98
|
+
### 交互式选择菜单
|
|
99
|
+
|
|
100
|
+
使用 `ask_select` 函数创建一个带数字编号的交互式选择菜单(编号从0开始),支持超时自动选择和倒计时动态显示:
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
from funcguard import ask_select
|
|
104
|
+
|
|
105
|
+
# 基础用法 - 选择属性填写模式
|
|
106
|
+
result = ask_select(
|
|
107
|
+
options={True: "需要填写属性", False: "不需要填写属性", "all": "不限制"},
|
|
108
|
+
default_key="all",
|
|
109
|
+
prompt="请选择属性填写模式",
|
|
110
|
+
timeout=5
|
|
111
|
+
)
|
|
112
|
+
print(f"用户选择: {result}") # 返回 True, False 或 "all"
|
|
113
|
+
|
|
114
|
+
# 选择部署环境
|
|
115
|
+
env = ask_select(
|
|
116
|
+
options={"dev": "开发环境", "test": "测试环境", "prod": "生产环境"},
|
|
117
|
+
default_key="dev",
|
|
118
|
+
prompt="请选择部署环境",
|
|
119
|
+
timeout=3
|
|
120
|
+
)
|
|
121
|
+
print(f"当前环境: {env}")
|
|
122
|
+
|
|
123
|
+
# 选择数量(使用整数作为键)
|
|
124
|
+
count = ask_select(
|
|
125
|
+
options={10: "10条", 50: "50条", 100: "100条"},
|
|
126
|
+
default_key=50,
|
|
127
|
+
prompt="查询数量",
|
|
128
|
+
timeout=5
|
|
129
|
+
)
|
|
130
|
+
print(f"查询 {count} 条数据")
|
|
131
|
+
```
|
|
132
|
+
|
|
98
133
|
### HTTP请求
|
|
99
134
|
|
|
100
135
|
FuncGuard 提供了强大的 HTTP 请求功能,支持自动重试、请求日志记录、以及 curl_cffi 兜底(用于绕过反爬虫检测)。详细文档请参考 [network.md](docs/network.md)。
|
|
@@ -496,6 +531,7 @@ print(f"当前价格: {current_price}, 变化: {price_change}") # 输出: 当
|
|
|
496
531
|
|-----------|----------|
|
|
497
532
|
| `timeout_handler` | 函数执行超时控制 |
|
|
498
533
|
| `retry_function` | 函数执行失败自动重试 |
|
|
534
|
+
| `ask_select` | 交互式数字选择菜单(支持超时自动选择) |
|
|
499
535
|
|
|
500
536
|
### 网络请求
|
|
501
537
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|