mns-common 1.3.9.2__py3-none-any.whl → 1.3.9.4__py3-none-any.whl

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.

Potentially problematic release.


This version of mns-common might be problematic. Click here for more details.

@@ -5,7 +5,6 @@ file_path = os.path.abspath(__file__)
5
5
  end = file_path.index('mns') + 16
6
6
  project_path = file_path[0:end]
7
7
  sys.path.append(project_path)
8
- from loguru import logger
9
8
  import requests
10
9
  import pandas as pd
11
10
 
@@ -42,28 +41,26 @@ def get_xue_qiu_k_line(symbol, period, cookie, end_time, hq):
42
41
  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
43
42
  "cookie": cookie
44
43
  }
45
- try:
46
- response = requests.get(
47
- url=url,
48
- params=params,
49
- headers=headers
50
- )
51
44
 
52
- if response.status_code == 200:
53
- response_data = response.json()
54
- df = pd.DataFrame(
55
- data=response_data['data']['item'],
56
- columns=response_data['data']['column']
57
- )
58
- # 处理DataFrame列(秒级时间戳)
59
- df['str_day'] = pd.to_datetime(df['timestamp'], unit='ms').dt.normalize()
60
- df["str_day"] = df["str_day"].dt.strftime("%Y-%m-%d")
61
- return df
62
- else:
63
- return pd.DataFrame()
64
- except BaseException as e:
65
- logger.error("同步股票年度数据出现异常:{},{}", symbol, e)
66
- return pd.DataFrame()
45
+ response = requests.get(
46
+ url=url,
47
+ params=params,
48
+ headers=headers
49
+ )
50
+
51
+ if response.status_code == 200:
52
+ response_data = response.json()
53
+ df = pd.DataFrame(
54
+ data=response_data['data']['item'],
55
+ columns=response_data['data']['column']
56
+ )
57
+ # 处理DataFrame列(秒级时间戳)
58
+ df['str_day'] = pd.to_datetime(df['timestamp'], unit='ms').dt.normalize()
59
+ df["str_day"] = df["str_day"].dt.strftime("%Y-%m-%d")
60
+ return df
61
+ else:
62
+ # 直接抛出带有明确信息的异常
63
+ raise ValueError("获取到的DataFrame数据为空")
67
64
 
68
65
 
69
66
  if __name__ == '__main__':
@@ -0,0 +1,86 @@
1
+ import threading
2
+ from functools import wraps
3
+ from typing import Optional, Callable
4
+
5
+ class ExceptionMonitor:
6
+ """支持动态配置的异常监控器"""
7
+ def __init__(
8
+ self,
9
+ threshold: int = 1000,
10
+ alert_handler: Optional[Callable[[int, int], None]] = None,
11
+ auto_reset: bool = True
12
+ ):
13
+ """
14
+ :param threshold: 报警阈值,默认1000次
15
+ :param alert_handler: 自定义报警函数,格式 func(current_count, threshold)
16
+ :param auto_reset: 触发报警后是否自动重置计数器
17
+ """
18
+ self.counter = 0
19
+ self._threshold = threshold
20
+ self.alert_handler = alert_handler
21
+ self.auto_reset = auto_reset
22
+ self.lock = threading.Lock()
23
+
24
+ @property
25
+ def threshold(self) -> int:
26
+ """当前报警阈值"""
27
+ return self._threshold
28
+
29
+ @threshold.setter
30
+ def threshold(self, value: int):
31
+ """动态设置报警阈值"""
32
+ with self.lock:
33
+ self._threshold = value
34
+
35
+ def increment(self):
36
+ """线程安全的计数器递增"""
37
+ with self.lock:
38
+ self.counter += 1
39
+ if self.counter >= self.threshold:
40
+ self.trigger_alert()
41
+ if self.auto_reset:
42
+ self.reset_counter()
43
+
44
+ def reset_counter(self):
45
+ """手动重置计数器"""
46
+ with self.lock:
47
+ self.counter = 0
48
+
49
+ def trigger_alert(self):
50
+ """触发报警(支持自定义处理逻辑)"""
51
+ if self.alert_handler:
52
+ self.alert_handler(self.counter, self.threshold)
53
+ else:
54
+ print(f"[ALERT] Exception count {self.counter} exceeded threshold {self.threshold}")
55
+
56
+ def exception_counter(
57
+ threshold: int = 1000,
58
+ alert_handler: Optional[Callable[[int, int], None]] = None,
59
+ auto_reset: bool = True
60
+ ):
61
+ """
62
+ 异常计数装饰器工厂
63
+ :param threshold: 报警阈值
64
+ :param alert_handler: 自定义报警处理函数
65
+ :param auto_reset: 是否自动重置计数器
66
+ """
67
+ def decorator(func):
68
+ # 为每个被装饰函数创建独立监控实例
69
+ monitor = ExceptionMonitor(
70
+ threshold=threshold,
71
+ alert_handler=alert_handler,
72
+ auto_reset=auto_reset
73
+ )
74
+
75
+ @wraps(func)
76
+ def wrapper(*args, **kwargs):
77
+ try:
78
+ return func(*args, **kwargs)
79
+ except Exception as e:
80
+ monitor.increment()
81
+ raise # 保持原始异常栈
82
+
83
+ # 暴露监控器以便外部访问
84
+ wrapper.monitor = monitor
85
+ return wrapper
86
+ return decorator
@@ -0,0 +1,7 @@
1
+ import sys
2
+ import os
3
+
4
+ file_path = os.path.abspath(__file__)
5
+ end = file_path.index('mns') + 16
6
+ project_path = file_path[0:end]
7
+ sys.path.append(project_path)
@@ -1,4 +1,4 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mns-common
3
- Version: 1.3.9.2
3
+ Version: 1.3.9.4
4
4
 
@@ -71,7 +71,7 @@ mns_common/api/ths/zt/ths_stock_zt_pool_v2_api.py,sha256=eICTYaHJYp2ccsHkeDnkzpJ
71
71
  mns_common/api/us/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
72
72
  mns_common/api/us/ths_us_company_info_api.py,sha256=qQjv4F-ovQ2uuu-FlBAnxjvVA7qj9y_x5WZtUoyoEW4,241
73
73
  mns_common/api/xueqiu/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
74
- mns_common/api/xueqiu/xue_qiu_k_line_api.py,sha256=Vqal_JvHCYFGPZ5CK2BSgMPQ7ull2N3G79UsJ3sfu2k,4586
74
+ mns_common/api/xueqiu/xue_qiu_k_line_api.py,sha256=G0AAejex8Fv7FCBtFUiMslrjlIxlo3JnuxqHdDzNrek,4424
75
75
  mns_common/component/__init__.py,sha256=2U9DiKslxsWwLLEcZKjS8UiQPN1QgALvnK3HiJNIZE0,163
76
76
  mns_common/component/common_service_fun_api.py,sha256=ZPPqo-ZBwSJ23I_2xXGxXyN6emYrlPqUuBGjA2Cv4gs,6629
77
77
  mns_common/component/cache/__init__.py,sha256=2U9DiKslxsWwLLEcZKjS8UiQPN1QgALvnK3HiJNIZE0,163
@@ -95,6 +95,8 @@ mns_common/component/deal/terminal_enum.py,sha256=JUkSTXLQW1fob05PCCzIBg_VKlGmqa
95
95
  mns_common/component/em/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
96
96
  mns_common/component/em/em_real_time_quotes_api.py,sha256=9VAwzj_am-Jd4zG57bhrVjXrrsytzymSu8CIs7T7Lc0,2144
97
97
  mns_common/component/em/em_stock_info_api.py,sha256=r2T9H4cgnZ6p-TUjjeNXsw0aQtwugJQkHeOuHgFl5VY,1192
98
+ mns_common/component/exception/ExceptionMonitor.py,sha256=Ma8DsXcU357ni0l_PAFhRZ-nxghiVvnUWE3vu_UeqSk,2731
99
+ mns_common/component/exception/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
98
100
  mns_common/component/hk/__init__.py,sha256=wEg73KlZo-dU0yKGwpA1C2y6LZm4IBb94tNda1tqLeg,163
99
101
  mns_common/component/hk/company_hk_service_api.py,sha256=c5z3N2OQ1SOiditHSPkb5Hqh-U67aDlpSKAV3s4U3vs,857
100
102
  mns_common/component/industry/__init__.py,sha256=2U9DiKslxsWwLLEcZKjS8UiQPN1QgALvnK3HiJNIZE0,163
@@ -150,7 +152,7 @@ mns_common/utils/date_handle_util.py,sha256=XS-MyA8_7k35LOCFAYOHgVcVkMft_Kc4Wa9U
150
152
  mns_common/utils/db_util.py,sha256=hSmfNAN4vEeEaUva6_cicZEhb2jSnib-Gvk2reke1vc,2590
151
153
  mns_common/utils/file_util.py,sha256=egWu6PenGPRp_ixrNTHKarT4dAnOT6FETR82EHUZJnQ,1042
152
154
  mns_common/utils/ip_util.py,sha256=UTcYfz_uytB__6nlBf7T-izuI7hi4XdB6ET0sJgEel4,969
153
- mns_common-1.3.9.2.dist-info/METADATA,sha256=ztJJXpd0wcfXSWBv5jQDyfAYzDasTR2wPLdPuVhyYQ0,61
154
- mns_common-1.3.9.2.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
155
- mns_common-1.3.9.2.dist-info/top_level.txt,sha256=ZC58kAR-8Hvc6U2xhYNBNLAh3mb6sZazbdj5nZpvEkQ,11
156
- mns_common-1.3.9.2.dist-info/RECORD,,
155
+ mns_common-1.3.9.4.dist-info/METADATA,sha256=wAxR5QG05NWjAmUIoKTo0MvIo5ehDn6fntqE_awhCi8,61
156
+ mns_common-1.3.9.4.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
157
+ mns_common-1.3.9.4.dist-info/top_level.txt,sha256=ZC58kAR-8Hvc6U2xhYNBNLAh3mb6sZazbdj5nZpvEkQ,11
158
+ mns_common-1.3.9.4.dist-info/RECORD,,