l0n0lc 0.8.4__py3-none-any.whl → 1.0.0__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.
Files changed (47) hide show
  1. l0n0lc/Py/350/275/254Cpp/350/275/254/350/257/221/345/231/250.py +579 -0
  2. l0n0lc/__init__.py +75 -6
  3. l0n0lc/aot/347/274/226/350/257/221.py +679 -0
  4. l0n0lc/ast/350/256/277/351/227/256/350/200/205.py +599 -0
  5. l0n0lc/cpp/347/261/273/345/236/213.py +330 -0
  6. l0n0lc/cpp/347/274/226/350/257/221/345/231/250.py +317 -0
  7. l0n0lc/simd/344/274/230/345/214/226.py +260 -0
  8. l0n0lc/std_map.py +153 -0
  9. l0n0lc/std_set.py +185 -0
  10. l0n0lc/std_vector.py +96 -0
  11. l0n0lc//344/273/243/347/240/201/344/274/230/345/214/226.py +302 -0
  12. l0n0lc//344/273/243/347/240/201/347/224/237/346/210/220.py +546 -0
  13. l0n0lc//344/276/235/350/265/226/346/263/250/345/205/245.py +155 -0
  14. l0n0lc//345/215/263/346/227/266/347/274/226/350/257/221.py +192 -0
  15. l0n0lc//345/217/230/351/207/217/347/256/241/347/220/206/345/231/250.py +123 -0
  16. l0n0lc//345/237/272/347/241/200/346/230/240/345/260/204.py +103 -0
  17. l0n0lc//345/237/272/347/241/200/346/267/267/345/205/245.py +147 -0
  18. l0n0lc//345/256/271/345/231/250/346/236/204/345/273/272/345/231/250.py +214 -0
  19. l0n0lc//345/267/245/345/205/267.py +285 -0
  20. l0n0lc//345/271/266/350/241/214/347/274/226/350/257/221/345/231/250.py +412 -0
  21. l0n0lc//345/274/202/345/270/270.py +474 -0
  22. l0n0lc//346/225/260/347/273/204/345/257/271/350/261/241/346/261/240.py +248 -0
  23. l0n0lc//346/226/207/344/273/266/347/256/241/347/220/206/345/231/250.py +286 -0
  24. l0n0lc//346/227/245/345/277/227/345/267/245/345/205/267.py +152 -0
  25. l0n0lc//347/261/273/345/236/213/346/216/250/346/226/255/345/267/245/345/205/267.py +352 -0
  26. l0n0lc//347/261/273/345/236/213/350/275/254/346/215/242.py +210 -0
  27. l0n0lc//347/261/273/346/224/257/346/214/201.py +372 -0
  28. l0n0lc//347/274/226/350/257/221/344/270/212/344/270/213/346/226/207.py +132 -0
  29. l0n0lc//347/274/226/350/257/221/347/256/241/347/220/206/345/231/250.py +171 -0
  30. l0n0lc//350/241/250/350/276/276/345/274/217/345/244/204/347/220/206.py +462 -0
  31. l0n0lc//350/275/254/350/257/221/345/231/250/345/267/245/345/205/267.py +49 -0
  32. l0n0lc//350/277/220/350/241/214/346/227/266/345/212/240/350/275/275.py +217 -0
  33. l0n0lc//351/200/232/347/224/250/345/267/245/345/205/267.py +149 -0
  34. l0n0lc-1.0.0.dist-info/METADATA +363 -0
  35. l0n0lc-1.0.0.dist-info/RECORD +39 -0
  36. {l0n0lc-0.8.4.dist-info → l0n0lc-1.0.0.dist-info}/WHEEL +1 -1
  37. l0n0lc-1.0.0.dist-info/entry_points.txt +2 -0
  38. {l0n0lc-0.8.4.dist-info → l0n0lc-1.0.0.dist-info}/licenses/LICENSE +0 -0
  39. l0n0lc/StdList.py +0 -24
  40. l0n0lc/StdMap.py +0 -21
  41. l0n0lc/c/345/237/272/347/241/200/345/244/204/347/220/206.py +0 -207
  42. l0n0lc/jit.py +0 -604
  43. l0n0lc//347/274/226/350/257/221.py +0 -58
  44. l0n0lc//351/200/232/347/224/250.py +0 -134
  45. l0n0lc-0.8.4.dist-info/METADATA +0 -241
  46. l0n0lc-0.8.4.dist-info/RECORD +0 -12
  47. {l0n0lc-0.8.4.dist-info → l0n0lc-1.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,248 @@
1
+ """
2
+ 数组对象池模块
3
+
4
+ 提供高效的 ctypes 数组对象池,用于减少运行时参数转换开销。
5
+ """
6
+
7
+ import ctypes
8
+ import os
9
+ from collections import OrderedDict
10
+ from typing import Type, Tuple, Optional, Dict, Any
11
+ from threading import Lock
12
+
13
+
14
+ def 获取默认池大小() -> int:
15
+ """获取默认对象池大小"""
16
+ return int(os.environ.get("L0N0LC_ARRAY_POOL_SIZE", "128"))
17
+
18
+
19
+ def 获取是否启用对象池() -> bool:
20
+ """获取是否启用对象池"""
21
+ return os.environ.get("L0N0LC_ENABLE_ARRAY_POOL", "1") == "1"
22
+
23
+
24
+ class 数组对象池统计:
25
+ """对象池统计信息"""
26
+
27
+ def __init__(self):
28
+ self.命中次数 = 0
29
+ self.未命中次数 = 0
30
+ self.分配次数 = 0
31
+ self.释放次数 = 0
32
+ self.缓存数组数 = 0
33
+
34
+ def 重置(self):
35
+ """重置统计信息"""
36
+ self.命中次数 = 0
37
+ self.未命中次数 = 0
38
+ self.分配次数 = 0
39
+ self.释放次数 = 0
40
+ self.缓存数组数 = 0
41
+
42
+ def 获取命中率(self) -> float:
43
+ """获取缓存命中率"""
44
+ 总次数 = self.命中次数 + self.未命中次数
45
+ if 总次数 == 0:
46
+ return 0.0
47
+ return self.命中次数 / 总次数
48
+
49
+ def __repr__(self) -> str:
50
+ return (
51
+ f"数组对象池统计(命中={self.命中次数}, 未命中={self.未命中次数}, "
52
+ f"命中率={self.获取命中率():.2%}, 分配={self.分配次数}, "
53
+ f"释放={self.释放次数}, 缓存={self.缓存数组数})"
54
+ )
55
+
56
+
57
+ class 数组对象池:
58
+ """
59
+ ctypes 数组对象池
60
+
61
+ 使用 LRU 缓存策略管理已分配的数组对象,减少重复分配开销。
62
+ """
63
+
64
+ def __init__(self, 最大大小: Optional[int] = None):
65
+ """
66
+ 初始化对象池
67
+
68
+ Args:
69
+ 最大大小: 最大缓存条目数,None 表示使用默认值
70
+ """
71
+ self._最大大小 = 最大大小 or 获取默认池大小()
72
+ self._缓存: OrderedDict[Tuple[Type, int], Any] = OrderedDict()
73
+ self._锁 = Lock()
74
+ self._统计 = 数组对象池统计()
75
+ self._是否启用 = 获取是否启用对象池()
76
+
77
+ def 获取(self, 元素类型: Type[Any], 大小: int) -> Optional[Any]:
78
+ """
79
+ 从对象池获取数组
80
+
81
+ Args:
82
+ 元素类型: ctypes 元素类型(如 ctypes.c_int64)
83
+ 大小: 数组大小
84
+
85
+ Returns:
86
+ 缓存的数组对象,如果未命中则返回 None
87
+ """
88
+ if not self._是否启用:
89
+ return None
90
+
91
+ key = (元素类型, 大小)
92
+
93
+ with self._锁:
94
+ if key in self._缓存:
95
+ # LRU: 移到末尾
96
+ self._缓存.move_to_end(key)
97
+ array = self._缓存[key]
98
+ self._统计.命中次数 += 1
99
+ self._统计.缓存数组数 = len(self._缓存)
100
+ return array
101
+ else:
102
+ self._统计.未命中次数 += 1
103
+ return None
104
+
105
+ def 分配(self, 元素类型: Type[Any], 大小: int) -> Any:
106
+ """
107
+ 分配新数组
108
+
109
+ Args:
110
+ 元素类型: ctypes 元素类型
111
+ 大小: 数组大小
112
+
113
+ Returns:
114
+ 新分配的数组对象
115
+ """
116
+ array_type = 元素类型 * 大小 # type: ignore
117
+ array = array_type()
118
+
119
+ with self._锁:
120
+ self._统计.分配次数 += 1
121
+
122
+ return array
123
+
124
+ def 释放(self, 元素类型: Type[Any], 大小: int, 数组: Any) -> None:
125
+ """
126
+ 释放数组回对象池
127
+
128
+ Args:
129
+ 元素类型: ctypes 元素类型
130
+ 大小: 数组大小
131
+ 数组: 要释放的数组对象
132
+ """
133
+ if not self._是否启用:
134
+ return
135
+
136
+ key = (元素类型, 大小)
137
+
138
+ with self._锁:
139
+ # 如果缓存已满,移除最旧的条目
140
+ if len(self._缓存) >= self._最大大小:
141
+ self._缓存.popitem(last=False)
142
+
143
+ self._缓存[key] = 数组
144
+ self._缓存.move_to_end(key)
145
+ self._统计.释放次数 += 1
146
+ self._统计.缓存数组数 = len(self._缓存)
147
+
148
+ def 获取或分配(self, 元素类型: Type[Any], 大小: int) -> Tuple[Any, bool]:
149
+ """
150
+ 获取或分配数组
151
+
152
+ Args:
153
+ 元素类型: ctypes 元素类型
154
+ 大小: 数组大小
155
+
156
+ Returns:
157
+ (数组对象, 是否从缓存获取)
158
+ """
159
+ cached = self.获取(元素类型, 大小)
160
+ if cached is not None:
161
+ return cached, True
162
+
163
+ new_array = self.分配(元素类型, 大小)
164
+ return new_array, False
165
+
166
+ def 清空(self) -> None:
167
+ """清空对象池"""
168
+ with self._锁:
169
+ self._缓存.clear()
170
+
171
+ def 获取统计(self) -> 数组对象池统计:
172
+ """获取统计信息副本"""
173
+ with self._锁:
174
+ # 返回统计信息的副本
175
+ 统计 = 数组对象池统计()
176
+ 统计.命中次数 = self._统计.命中次数
177
+ 统计.未命中次数 = self._统计.未命中次数
178
+ 统计.分配次数 = self._统计.分配次数
179
+ 统计.释放次数 = self._统计.释放次数
180
+ 统计.缓存数组数 = len(self._缓存)
181
+ return 统计
182
+
183
+ def 设置启用(self, 启用: bool) -> None:
184
+ """设置是否启用对象池"""
185
+ self._是否启用 = 启用
186
+
187
+ def 是否启用(self) -> bool:
188
+ """获取是否启用对象池"""
189
+ return self._是否启用
190
+
191
+ def 获取缓存大小(self) -> int:
192
+ """获取当前缓存条目数"""
193
+ with self._锁:
194
+ return len(self._缓存)
195
+
196
+ def 获取最大大小(self) -> int:
197
+ """获取最大缓存大小"""
198
+ return self._最大大小
199
+
200
+
201
+ # 全局对象池实例
202
+ _全局对象池: Optional[数组对象池] = None
203
+ _全局池锁 = Lock()
204
+
205
+
206
+ def 获取全局对象池() -> 数组对象池:
207
+ """获取全局对象池实例(单例)"""
208
+ global _全局对象池
209
+
210
+ if _全局对象池 is None:
211
+ with _全局池锁:
212
+ if _全局对象池 is None:
213
+ _全局对象池 = 数组对象池()
214
+
215
+ return _全局对象池
216
+
217
+
218
+ def 重置全局对象池(最大大小: Optional[int] = None) -> 数组对象池:
219
+ """
220
+ 重置全局对象池
221
+
222
+ Args:
223
+ 最大大小: 新的最大缓存大小,None 表示保持默认
224
+
225
+ Returns:
226
+ 新创建的全局对象池实例
227
+ """
228
+ global _全局对象池
229
+
230
+ with _全局池锁:
231
+ _全局对象池 = 数组对象池(最大大小=最大大小)
232
+
233
+ return _全局对象池
234
+
235
+
236
+ def 获取全局池统计() -> 数组对象池统计:
237
+ """获取全局对象池统计信息"""
238
+ return 获取全局对象池().获取统计()
239
+
240
+
241
+ def 清空全局对象池() -> None:
242
+ """清空全局对象池"""
243
+ 获取全局对象池().清空()
244
+
245
+
246
+ def 设置全局池启用(启用: bool) -> None:
247
+ """设置全局对象池是否启用"""
248
+ 获取全局对象池().设置启用(启用)
@@ -0,0 +1,286 @@
1
+ """
2
+ 文件管理器模块
3
+
4
+ 统一管理文件路径构建、文件清理和缓存管理操作。
5
+ 消除重复代码,提供一致的文件操作接口。
6
+ """
7
+
8
+ import os
9
+ import glob
10
+ import time
11
+ from typing import List, Optional, Set
12
+
13
+
14
+ class 文件管理器:
15
+ """
16
+ 统一管理文件路径和清理操作
17
+
18
+ 负责处理所有与文件系统相关的操作,包括:
19
+ - 文件路径构建
20
+ - 临时文件清理
21
+ - 缓存管理
22
+ - 目录操作
23
+ """
24
+
25
+ def __init__(self, 工作目录: str):
26
+ """
27
+ 初始化文件管理器
28
+
29
+ Args:
30
+ 工作目录: 编译输出目录
31
+ """
32
+ self.工作目录 = 工作目录
33
+
34
+ def 获取完整路径(self, 文件名: str) -> str:
35
+ """
36
+ 获取文件的完整路径
37
+
38
+ Args:
39
+ 文件名: 文件名(不含路径)
40
+
41
+ Returns:
42
+ 完整路径: 工作目录/文件名
43
+ """
44
+ return f"{self.工作目录}/{文件名}"
45
+
46
+ def 确保目录存在(self):
47
+ """确保工作目录存在,不存在则创建"""
48
+ if not os.path.exists(self.工作目录):
49
+ try:
50
+ os.makedirs(self.工作目录, exist_ok=True)
51
+ except OSError as e:
52
+ raise RuntimeError(f"无法创建工作目录 {self.工作目录}: {e}")
53
+
54
+ def 清理临时文件(self, 基础名称: str):
55
+ """
56
+ 清理编译产生的临时文件
57
+
58
+ Args:
59
+ 基础名称: 文件的基础名称(不含扩展名)
60
+ """
61
+ temp_patterns = [
62
+ f"{self.工作目录}/{基础名称}*.o",
63
+ f"{self.工作目录}/{基础名称}*.tmp",
64
+ f"{self.工作目录}/{基础名称}*.bak"
65
+ ]
66
+
67
+ self._删除文件按模式(temp_patterns)
68
+
69
+ def 清理编译文件(self, 文件名列表: List[str]):
70
+ """
71
+ 清理指定的编译文件
72
+
73
+ Args:
74
+ 文件名列表: 需要清理的文件名列表
75
+ """
76
+ for 文件名 in 文件名列表:
77
+ file_path = self.获取完整路径(文件名)
78
+ if os.path.exists(file_path):
79
+ try:
80
+ os.remove(file_path)
81
+ except OSError:
82
+ pass # 忽略删除失败
83
+
84
+ def 清理所有缓存(self, 过期时间: Optional[float] = None) -> int:
85
+ """
86
+ 清理所有缓存文件
87
+
88
+ Args:
89
+ 过期时间: 可选,只清理超过此时间(秒)的文件
90
+ 如果为 None,则清理所有缓存
91
+
92
+ Returns:
93
+ 清理的文件数量
94
+ """
95
+ patterns = [
96
+ os.path.join(self.工作目录, "*.so"),
97
+ os.path.join(self.工作目录, "*.o"),
98
+ os.path.join(self.工作目录, "*.tmp"),
99
+ os.path.join(self.工作目录, "*.bak"),
100
+ os.path.join(self.工作目录, "*.cpp"),
101
+ os.path.join(self.工作目录, "*.h"),
102
+ os.path.join(self.工作目录, "*.hash"),
103
+ os.path.join(self.工作目录, "*.dylib"), # macOS
104
+ os.path.join(self.工作目录, "*.dll") # Windows
105
+ ]
106
+
107
+ cleaned_count = 0
108
+ 当前时间 = time.time()
109
+
110
+ for pattern in patterns:
111
+ for file_path in glob.glob(pattern):
112
+ try:
113
+ # 检查文件是否过期
114
+ if 过期时间 is not None:
115
+ file_mtime = os.path.getmtime(file_path)
116
+ if 当前时间 - file_mtime <= 过期时间:
117
+ continue
118
+
119
+ os.remove(file_path)
120
+ cleaned_count += 1
121
+ except OSError:
122
+ pass
123
+
124
+ return cleaned_count
125
+
126
+ def 清理旧文件(self, 文件前缀: str):
127
+ """
128
+ 清理具有指定前缀的所有旧文件
129
+
130
+ Args:
131
+ 文件前缀: 文件名前缀
132
+ """
133
+ if not os.path.exists(self.工作目录):
134
+ return
135
+
136
+ for fname in os.listdir(self.工作目录):
137
+ if fname.startswith(文件前缀):
138
+ file_path = os.path.join(self.工作目录, fname)
139
+ try:
140
+ os.remove(file_path)
141
+ except OSError:
142
+ pass
143
+
144
+ def 文件是否存在(self, 文件名: str) -> bool:
145
+ """
146
+ 检查文件是否存在
147
+
148
+ Args:
149
+ 文件名: 文件名
150
+
151
+ Returns:
152
+ 文件是否存在
153
+ """
154
+ return os.path.exists(self.获取完整路径(文件名))
155
+
156
+ def 文件是否可读(self, 文件名: str) -> bool:
157
+ """
158
+ 检查文件是否可读
159
+
160
+ Args:
161
+ 文件名: 文件名
162
+
163
+ Returns:
164
+ 文件是否可读
165
+ """
166
+ file_path = self.获取完整路径(文件名)
167
+ return os.path.exists(file_path) and os.access(file_path, os.R_OK)
168
+
169
+ def 获取文件大小(self, 文件名: str) -> int:
170
+ """
171
+ 获取文件大小
172
+
173
+ Args:
174
+ 文件名: 文件名
175
+
176
+ Returns:
177
+ 文件大小(字节)
178
+ """
179
+ file_path = self.获取完整路径(文件名)
180
+ if os.path.exists(file_path):
181
+ return os.path.getsize(file_path)
182
+ return 0
183
+
184
+ def 获取文件修改时间(self, 文件名: str) -> float:
185
+ """
186
+ 获取文件修改时间
187
+
188
+ Args:
189
+ 文件名: 文件名
190
+
191
+ Returns:
192
+ 文件修改时间(时间戳)
193
+ """
194
+ file_path = self.获取完整路径(文件名)
195
+ if os.path.exists(file_path):
196
+ return os.path.getmtime(file_path)
197
+ return 0
198
+
199
+ def 写入文件(self, 文件名: str, 内容: str):
200
+ """
201
+ 写入内容到文件
202
+
203
+ Args:
204
+ 文件名: 文件名
205
+ 内容: 文件内容
206
+ """
207
+ self.确保目录存在()
208
+ file_path = self.获取完整路径(文件名)
209
+
210
+ with open(file_path, "w", encoding="utf-8") as f:
211
+ f.write(内容)
212
+
213
+ def 读取文件(self, 文件名: str) -> Optional[str]:
214
+ """
215
+ 读取文件内容
216
+
217
+ Args:
218
+ 文件名: 文件名
219
+
220
+ Returns:
221
+ 文件内容,如果文件不存在返回 None
222
+ """
223
+ file_path = self.获取完整路径(文件名)
224
+ if not os.path.exists(file_path):
225
+ return None
226
+
227
+ with open(file_path, "r", encoding="utf-8") as f:
228
+ return f.read()
229
+
230
+ def 列出文件(self, 模式: str = "*") -> List[str]:
231
+ """
232
+ 列出工作目录中匹配模式的文件
233
+
234
+ Args:
235
+ 模式: 文件匹配模式(如 "*.cpp")
236
+
237
+ Returns:
238
+ 文件列表
239
+ """
240
+ if not os.path.exists(self.工作目录):
241
+ return []
242
+
243
+ pattern = os.path.join(self.工作目录, 模式)
244
+ return glob.glob(pattern)
245
+
246
+ def _删除文件按模式(self, 模式列表: List[str]):
247
+ """
248
+ 根据模式列表删除文件
249
+
250
+ Args:
251
+ 模式列表: 文件模式列表
252
+ """
253
+ for pattern in 模式列表:
254
+ for file_path in glob.glob(pattern):
255
+ try:
256
+ os.remove(file_path)
257
+ except OSError:
258
+ pass # 忽略删除失败
259
+
260
+ def 获取状态摘要(self) -> dict:
261
+ """
262
+ 获取文件管理器的状态摘要
263
+
264
+ Returns:
265
+ 包含当前状态的字典
266
+ """
267
+ 状态信息 = {
268
+ "工作目录": self.工作目录,
269
+ "目录是否存在": os.path.exists(self.工作目录)
270
+ }
271
+
272
+ if 状态信息["目录是否存在"]:
273
+ # 统计各类文件数量
274
+ 文件统计 = {
275
+ "cpp文件": len(glob.glob(os.path.join(self.工作目录, "*.cpp"))),
276
+ "头文件": len(glob.glob(os.path.join(self.工作目录, "*.h"))),
277
+ "共享库": len(glob.glob(os.path.join(self.工作目录, "*.so"))) +
278
+ len(glob.glob(os.path.join(self.工作目录, "*.dylib"))) +
279
+ len(glob.glob(os.path.join(self.工作目录, "*.dll"))),
280
+ "对象文件": len(glob.glob(os.path.join(self.工作目录, "*.o"))),
281
+ "临时文件": len(glob.glob(os.path.join(self.工作目录, "*.tmp"))) +
282
+ len(glob.glob(os.path.join(self.工作目录, "*.bak")))
283
+ }
284
+ 状态信息["文件统计"] = 文件统计
285
+
286
+ return 状态信息
@@ -0,0 +1,152 @@
1
+ """
2
+ 日志工具模块 - 提供可配置的日志系统
3
+ 替代调试代码,提供更专业的日志记录功能
4
+ """
5
+
6
+ import logging
7
+ import sys
8
+ from typing import Optional
9
+ from enum import Enum
10
+
11
+
12
+ class 日志级别(Enum):
13
+ """日志级别枚举"""
14
+ 调试 = logging.DEBUG
15
+ 信息 = logging.INFO
16
+ 警告 = logging.WARNING
17
+ 错误 = logging.ERROR
18
+ 严重 = logging.CRITICAL
19
+
20
+
21
+ class 日志工具:
22
+ """统一的日志管理类"""
23
+
24
+ _实例 = None
25
+ _已初始化 = False
26
+
27
+ def __new__(cls):
28
+ """单例模式"""
29
+ if cls._实例 is None:
30
+ cls._实例 = super().__new__(cls)
31
+ return cls._实例
32
+
33
+ def __init__(self):
34
+ if not self._已初始化:
35
+ self.日志器 = logging.getLogger("l0n0lc")
36
+ self.日志器.setLevel(logging.INFO) # 默认级别
37
+ self.处理器 = None
38
+ self.调试模式 = False
39
+ self.已初始化 = True
40
+
41
+ def 设置级别(self, 级别: 日志级别):
42
+ """设置日志级别"""
43
+ self.日志器.setLevel(级别.value)
44
+
45
+ def 启用调试模式(self):
46
+ """启用调试模式"""
47
+ self.调试模式 = True
48
+ self.设置级别(日志级别.调试)
49
+
50
+ def 禁用调试模式(self):
51
+ """禁用调试模式"""
52
+ self.调试模式 = False
53
+ self.设置级别(日志级别.信息)
54
+
55
+ def 设置输出格式(self, 格式字符串: Optional[str] = None):
56
+ """设置日志输出格式"""
57
+ if 格式字符串 is None:
58
+ if self.调试模式:
59
+ 格式字符串 = '[%(asctime)s] %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(funcName)s - %(message)s'
60
+ else:
61
+ 格式字符串 = '[%(levelname)s] %(message)s'
62
+
63
+ formatter = logging.Formatter(格式字符串)
64
+
65
+ if self.处理器:
66
+ self.处理器.setFormatter(formatter)
67
+ else:
68
+ self.处理器 = logging.StreamHandler(sys.stdout)
69
+ self.处理器.setFormatter(formatter)
70
+ self.日志器.addHandler(self.处理器)
71
+
72
+ def 调试(self, 消息: str, **kwargs):
73
+ """记录调试信息"""
74
+ if self.调试模式:
75
+ self.日志器.debug(消息, **kwargs)
76
+
77
+ def 信息(self, 消息: str, **kwargs):
78
+ """记录一般信息"""
79
+ self.日志器.info(消息, **kwargs)
80
+
81
+ def 警告(self, 消息: str, **kwargs):
82
+ """记录警告信息"""
83
+ self.日志器.warning(消息, **kwargs)
84
+
85
+ def 错误(self, 消息: str, **kwargs):
86
+ """记录错误信息"""
87
+ self.日志器.error(消息, **kwargs)
88
+
89
+ def 严重(self, 消息: str, **kwargs):
90
+ """记录严重错误信息"""
91
+ self.日志器.critical(消息, **kwargs)
92
+
93
+ def 异常(self, 消息: str, 异常对象: Optional[Exception] = None, **kwargs):
94
+ """记录异常信息"""
95
+ if 异常对象:
96
+ self.错误(f"{消息}: {str(异常对象)}", **kwargs)
97
+ if self.调试模式:
98
+ self.调试(f"异常详细信息: {type(异常对象).__name__}", **kwargs)
99
+ else:
100
+ self.错误(消息, **kwargs)
101
+
102
+ def 编译信息(self, 文件名: str, 操作: str, **kwargs):
103
+ """记录编译相关信息"""
104
+ self.信息(f"编译操作 - {操作}: {文件名}", **kwargs)
105
+
106
+ def 类型推断信息(self, 变量名: str, python类型: str, cpp类型: str, **kwargs):
107
+ """记录类型推断信息"""
108
+ if self.调试模式:
109
+ self.调试(f"类型推断 - {变量名}: {python类型} -> {cpp类型}", **kwargs)
110
+
111
+ def 依赖关系信息(self, 主函数: str, 依赖函数: str, **kwargs):
112
+ """记录依赖关系信息"""
113
+ if self.调试模式:
114
+ self.调试(f"依赖关系 - {主函数} 依赖 {依赖函数}", **kwargs)
115
+
116
+ def 性能信息(self, 操作: str, 耗时: float, **kwargs):
117
+ """记录性能信息"""
118
+ if self.调试模式:
119
+ self.信息(f"性能 - {操作}: {耗时:.3f}秒", **kwargs)
120
+
121
+ def 清理信息(self, 文件路径: str, 原因: str = "编译失败", **kwargs):
122
+ """记录文件清理信息"""
123
+ if self.调试模式:
124
+ self.调试(f"文件清理 - {原因}: {文件路径}", **kwargs)
125
+
126
+ def 缓存信息(self, 操作: str, 文件名: str, **kwargs):
127
+ """记录缓存操作信息"""
128
+ if self.调试模式:
129
+ self.调试(f"缓存操作 - {操作}: {文件名}", **kwargs)
130
+
131
+
132
+ # 全局日志实例
133
+ 日志 = 日志工具()
134
+
135
+ # 便捷函数
136
+ def 启用调试模式():
137
+ """全局启用调试模式"""
138
+ 日志.启用调试模式()
139
+ 日志.设置输出格式()
140
+
141
+ def 禁用调试模式():
142
+ """全局禁用调试模式"""
143
+ 日志.禁用调试模式()
144
+ 日志.设置输出格式()
145
+
146
+ def 设置日志级别(级别: 日志级别):
147
+ """全局设置日志级别"""
148
+ 日志.设置级别(级别)
149
+ 日志.设置输出格式()
150
+
151
+ # 初始化默认配置
152
+ 日志.设置输出格式()