ezKit 1.9.8__py3-none-any.whl → 1.9.10__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.
- ezKit/utils.py +85 -138
- {ezKit-1.9.8.dist-info → ezKit-1.9.10.dist-info}/METADATA +1 -1
- {ezKit-1.9.8.dist-info → ezKit-1.9.10.dist-info}/RECORD +6 -6
- {ezKit-1.9.8.dist-info → ezKit-1.9.10.dist-info}/LICENSE +0 -0
- {ezKit-1.9.8.dist-info → ezKit-1.9.10.dist-info}/WHEEL +0 -0
- {ezKit-1.9.8.dist-info → ezKit-1.9.10.dist-info}/top_level.txt +0 -0
ezKit/utils.py
CHANGED
@@ -8,6 +8,7 @@ import subprocess
|
|
8
8
|
import time
|
9
9
|
import tomllib
|
10
10
|
from copy import deepcopy
|
11
|
+
from itertools import islice
|
11
12
|
from multiprocessing import Pool, Process
|
12
13
|
from multiprocessing.pool import ThreadPool
|
13
14
|
from pathlib import Path
|
@@ -29,15 +30,10 @@ NoneType = type(None)
|
|
29
30
|
# --------------------------------------------------------------------------------------------------
|
30
31
|
|
31
32
|
|
32
|
-
def isTrue(
|
33
|
-
|
34
|
-
object_type: Any = None,
|
35
|
-
true_list: list | tuple | set | str | None = None,
|
36
|
-
false_list: list | tuple | set | str | None = None
|
37
|
-
) -> bool:
|
38
|
-
"""检查对象类型以及对象数据是否为 True"""
|
33
|
+
def isTrue(target: object, typeClass: Any) -> bool:
|
34
|
+
"""检查对象是否为真"""
|
39
35
|
|
40
|
-
#
|
36
|
+
# 常见布尔类型:
|
41
37
|
#
|
42
38
|
# Boolean bool False
|
43
39
|
# Numbers int/float 0/0.0
|
@@ -59,44 +55,33 @@ def isTrue(
|
|
59
55
|
# all() 用于检查一个可迭代对象(如列表、元组、集合等)中的 所有 元素是否为 真值 (truthy), 所有元素为真, 返回 True
|
60
56
|
# any() 用于检查一个可迭代对象(如列表、元组、集合等)中的 某个 元素是否为 真值 (truthy), 某个元素为真, 返回 True
|
61
57
|
# 与 all() 作用相反的 not any(), 可以用来检查所有元素是否为 假值 (falsy), any() 中所有元素为假, not any() 返回 True
|
58
|
+
#
|
59
|
+
# return target not in [False, None, 0, 0.0, '', (), [], {}, {*()}, {*[]}, {*{}}]
|
62
60
|
|
63
61
|
try:
|
62
|
+
return isinstance(target, typeClass) and bool(target)
|
63
|
+
except Exception as e:
|
64
|
+
logger.exception(e)
|
65
|
+
return False
|
64
66
|
|
65
|
-
if isinstance(object_data, object_type):
|
66
|
-
|
67
|
-
if all(
|
68
|
-
[
|
69
|
-
true_list is not None,
|
70
|
-
false_list is None,
|
71
|
-
isinstance(true_list, (list, tuple, set, str))
|
72
|
-
]
|
73
|
-
):
|
74
|
-
return object_data in true_list
|
75
|
-
|
76
|
-
if all(
|
77
|
-
[
|
78
|
-
true_list is None,
|
79
|
-
false_list is not None,
|
80
|
-
isinstance(false_list, (list, tuple, set, str))
|
81
|
-
]
|
82
|
-
):
|
83
|
-
return object_data not in false_list
|
84
|
-
|
85
|
-
if all(
|
86
|
-
[
|
87
|
-
true_list is not None,
|
88
|
-
false_list is not None,
|
89
|
-
isinstance(true_list, (list, tuple, set, str)),
|
90
|
-
isinstance(false_list, (list, tuple, set, str))
|
91
|
-
]
|
92
|
-
):
|
93
|
-
return (object_data in true_list) and (object_data not in false_list)
|
94
|
-
|
95
|
-
# return object_data not in [False, None, 0, 0.0, '', (), [], {}, {*()}, {*[]}, {*{}}]
|
96
|
-
return bool(object_data)
|
97
67
|
|
98
|
-
|
68
|
+
# --------------------------------------------------------------------------------------------------
|
69
|
+
|
70
|
+
|
71
|
+
def check_arguments(data: list) -> bool:
|
72
|
+
"""检查函数参数"""
|
99
73
|
|
74
|
+
# data 示例: [(name, str, "name"), (age, int, "age")]
|
75
|
+
|
76
|
+
try:
|
77
|
+
if not isTrue(data, list):
|
78
|
+
logger.error("argument error: data")
|
79
|
+
return False
|
80
|
+
for arg, arg_type, arg_name in data:
|
81
|
+
if not isTrue(arg, arg_type):
|
82
|
+
logger.error(f"argument error: {arg_name}")
|
83
|
+
return False
|
84
|
+
return True
|
100
85
|
except Exception as e:
|
101
86
|
logger.exception(e)
|
102
87
|
return False
|
@@ -115,13 +100,9 @@ def os_environ(
|
|
115
100
|
# Python 没有全局变量, 多个文件无法调用同一个变量.
|
116
101
|
# 为了解决这个问题, 将变量设置为系统变量, 从而实现多个文件调用同一个变量.
|
117
102
|
|
118
|
-
#
|
119
|
-
|
120
|
-
|
121
|
-
logger.error("argument error: name")
|
122
|
-
return None
|
123
|
-
case _:
|
124
|
-
pass
|
103
|
+
# 检查参数是否正确
|
104
|
+
if not check_arguments([(name, str, "name")]):
|
105
|
+
return None
|
125
106
|
|
126
107
|
try:
|
127
108
|
|
@@ -164,29 +145,24 @@ def mam_of_numbers(
|
|
164
145
|
# numbers 数字列表 (仅支持 list 和 tuple, 不支 set)
|
165
146
|
# dest_type 目标类型 (将数字列表中的数字转换成统一的类型)
|
166
147
|
|
167
|
-
#
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
return None
|
175
|
-
case _:
|
176
|
-
pass
|
148
|
+
# 检查参数是否正确
|
149
|
+
if not check_arguments([(numbers, (list, tuple), "numbers")]):
|
150
|
+
return None
|
151
|
+
|
152
|
+
if not any([isTrue(dest_type, str), dest_type is None]):
|
153
|
+
logger.error("argument error: dest_type")
|
154
|
+
return None
|
177
155
|
|
178
156
|
try:
|
179
157
|
|
180
158
|
_numbers = deepcopy(numbers)
|
181
159
|
|
182
160
|
# 转换数据类型
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
case _:
|
189
|
-
pass
|
161
|
+
if dest_type == "float":
|
162
|
+
_numbers = [float(i) for i in numbers]
|
163
|
+
|
164
|
+
if dest_type == "int":
|
165
|
+
_numbers = [int(i) for i in numbers]
|
190
166
|
|
191
167
|
# 提取数据
|
192
168
|
_num_max = max(_numbers)
|
@@ -247,6 +223,9 @@ def division(
|
|
247
223
|
divisor: int | float
|
248
224
|
) -> float | None:
|
249
225
|
"""Division"""
|
226
|
+
# 检查参数是否正确
|
227
|
+
if not check_arguments([(dividend, (int, float), "dividend"), (divisor, (int, float), "divisor")]):
|
228
|
+
return None
|
250
229
|
try:
|
251
230
|
return dividend / divisor
|
252
231
|
except Exception as e:
|
@@ -261,14 +240,15 @@ def check_file_type(
|
|
261
240
|
file_object: str,
|
262
241
|
file_type: str
|
263
242
|
) -> bool:
|
264
|
-
"""
|
265
|
-
check file type
|
243
|
+
"""检查文件类型"""
|
266
244
|
|
267
|
-
|
245
|
+
# file_object 文件对象
|
246
|
+
# file_type 文件类型
|
247
|
+
|
248
|
+
# 检查参数是否正确
|
249
|
+
if not check_arguments([(file_object, str, "file"), (file_type, str, "file_type")]):
|
250
|
+
return False
|
268
251
|
|
269
|
-
file_object 文件对象
|
270
|
-
file_type 文件类型
|
271
|
-
"""
|
272
252
|
try:
|
273
253
|
|
274
254
|
_file_path = Path(file_object)
|
@@ -352,90 +332,57 @@ def list_dict_sorted_by_key(
|
|
352
332
|
logger.exception(e)
|
353
333
|
return None
|
354
334
|
|
355
|
-
|
356
335
|
def list_split(
|
357
336
|
data: list,
|
358
337
|
number: int,
|
359
338
|
equally: bool = False
|
360
339
|
) -> list | None:
|
361
|
-
"""
|
340
|
+
"""列表分割"""
|
341
|
+
|
362
342
|
# 列表分割
|
363
343
|
#
|
364
|
-
# 默认: 将 list 以 number
|
344
|
+
# 默认: 将 list 以 number 个元素为一个子 list 分割
|
365
345
|
#
|
366
|
-
#
|
346
|
+
# data = [1, 2, 3, 4, 5, 6, 7] 奇数个元素
|
347
|
+
# list_split(data, 2) -> [[1, 2], [3, 4], [5, 6], [7]] 将 data 以 2个元素 为一个 list 分割
|
348
|
+
# list_split(data, 3) -> [[1, 2, 3], [4, 5, 6], [7]] 将 data 以 3个元素 为一个 list 分割
|
367
349
|
#
|
368
|
-
#
|
369
|
-
#
|
350
|
+
# data = [1, 2, 3, 4, 5, 6, 7, 8] 偶数个元素
|
351
|
+
# list_split(data, 2) -> [[1, 2], [3, 4], [5, 6], [7, 8]] 将 data 以 2个元素 为一个 list 分割
|
352
|
+
# list_split(data, 3) -> [[1, 2, 3], [4, 5, 6], [7, 8]] 将 data 以 3个元素 为一个 list 分割
|
370
353
|
#
|
371
|
-
#
|
372
|
-
# [[1, 2, 3], [4, 5, 6], [7]]
|
354
|
+
# equally 为 True 时, 将 list 平均分成 number 个元素的子 list
|
373
355
|
#
|
374
|
-
#
|
356
|
+
# data = [1, 2, 3, 4, 5, 6, 7] 奇数个元素
|
357
|
+
# list_split(data, 2, True) -> [[1, 2, 3, 4], [5, 6, 7]] 将 data 平均分成 2个子list
|
358
|
+
# list_split(data, 3, True) -> [[1, 2, 3], [4, 5, 6], [7]] 将 data 平均分成 3个子list
|
375
359
|
#
|
376
|
-
#
|
377
|
-
#
|
378
|
-
#
|
379
|
-
# [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19]]
|
380
|
-
#
|
381
|
-
# list_split_equally(data, 6) -> 将 data 平均分成 6 份
|
382
|
-
# [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10], [11, 12, 13], [14, 15, 16], [17, 18, 19]]
|
383
|
-
#
|
384
|
-
# list_split_equally(data, 7) -> 将 data 平均分成 7 份
|
385
|
-
# [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17], [18, 19]]
|
386
|
-
|
387
|
-
try:
|
388
|
-
|
389
|
-
# 数据拷贝
|
390
|
-
_data_object = deepcopy(data)
|
391
|
-
|
392
|
-
# 数据长度
|
393
|
-
_data_length = len(_data_object)
|
394
|
-
|
395
|
-
# 数据平分后的结果
|
396
|
-
_data_result = []
|
397
|
-
|
398
|
-
_step_number: Optional[int] = None
|
360
|
+
# data = [1, 2, 3, 4, 5, 6, 7, 8] 偶数个元素
|
361
|
+
# list_split(data, 2, True) -> [[1, 2, 3, 4], [5, 6, 7, 8]] 将 data 平均分成 2个子list
|
362
|
+
# list_split(data, 3, True) -> [[1, 2, 3], [4, 5, 6], [7, 8]] 将 data 平均分成 3个子list
|
399
363
|
|
400
|
-
|
364
|
+
# 判断参数是否正确
|
365
|
+
match True:
|
366
|
+
case True if not isTrue(data, list):
|
367
|
+
logger.error("argument error: data")
|
401
368
|
return None
|
369
|
+
case True if not isTrue(number, int):
|
370
|
+
logger.error("argument error: number")
|
371
|
+
return None
|
372
|
+
case _:
|
373
|
+
pass
|
402
374
|
|
403
|
-
|
404
|
-
|
405
|
-
_data_result = [[i] for i in _data_object]
|
406
|
-
|
407
|
-
else:
|
408
|
-
|
409
|
-
if isTrue(equally, bool):
|
410
|
-
|
411
|
-
_step_number = step_number_for_split_equally(_data_length, number)
|
412
|
-
|
413
|
-
if _data_length % number == 0:
|
414
|
-
|
415
|
-
index_number_list = list(range(0, _data_length, number))
|
416
|
-
for index_number in index_number_list:
|
417
|
-
_data_result.append(deepcopy(_data_object[index_number:index_number + number]))
|
418
|
-
|
419
|
-
else:
|
420
|
-
|
421
|
-
# 前一部分
|
422
|
-
if _step_number is not None:
|
423
|
-
previous_end_number = (_data_length % number) * _step_number
|
424
|
-
previous_index_number_list = list(range(0, previous_end_number, _step_number))
|
425
|
-
for index_number in previous_index_number_list:
|
426
|
-
_data_result.append(deepcopy(_data_object[index_number:index_number + _step_number]))
|
427
|
-
|
428
|
-
# 后一部分
|
429
|
-
next_number_list = list(range(previous_end_number, _data_length, _step_number - 1))
|
430
|
-
for index_number in next_number_list:
|
431
|
-
_data_result.append(deepcopy(_data_object[index_number:index_number + (_step_number - 1)]))
|
432
|
-
|
433
|
-
else:
|
375
|
+
try:
|
434
376
|
|
435
|
-
|
436
|
-
|
377
|
+
# 要将列表平均分成 n 个子列表
|
378
|
+
if isTrue(equally, bool):
|
379
|
+
it = iter(data)
|
380
|
+
chunk_size = (len(data) + number - 1) // number # 每组至少多少个元素
|
381
|
+
return [list(islice(it, chunk_size)) for _ in range(number)]
|
437
382
|
|
438
|
-
|
383
|
+
# 将列表按每 n 个元素为一个列表进行分割
|
384
|
+
it = iter(data)
|
385
|
+
return [list(islice(it, number)) for _ in range((len(data) + number - 1) // number)]
|
439
386
|
|
440
387
|
except Exception as e:
|
441
388
|
logger.exception(e)
|
@@ -11,10 +11,10 @@ ezKit/redis.py,sha256=g2_V4jvq0djRc20jLZkgeAeF_bYrq-Rbl_kHcCUPZcA,1965
|
|
11
11
|
ezKit/sendemail.py,sha256=tRXCsJm_RfTJ9xEWe_lTQ5kOs2JxHGPXvq0oWA7prq0,7263
|
12
12
|
ezKit/stock.py,sha256=cbL0ZXCur4G290wFN5ynmLmMjgDRNSvVQgsE_0jSQKU,11802
|
13
13
|
ezKit/token.py,sha256=HKREyZj_T2S8-aFoFIrBXTaCKExQq4zE66OHXhGHqQg,1750
|
14
|
-
ezKit/utils.py,sha256
|
14
|
+
ezKit/utils.py,sha256=TDsL3PRkQy6NdZgphkgwacbWvHqEmq4LOkfNzmxV4DY,42682
|
15
15
|
ezKit/xftp.py,sha256=XyIdr_2rxRVLqPofG6fIYWhAMVsFwTyp46dg5P9FLW4,7774
|
16
|
-
ezKit-1.9.
|
17
|
-
ezKit-1.9.
|
18
|
-
ezKit-1.9.
|
19
|
-
ezKit-1.9.
|
20
|
-
ezKit-1.9.
|
16
|
+
ezKit-1.9.10.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
17
|
+
ezKit-1.9.10.dist-info/METADATA,sha256=7xdrfPXxnqwajfaZzvzvayL0KDLsfjstCk-j_f_gA5k,191
|
18
|
+
ezKit-1.9.10.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
19
|
+
ezKit-1.9.10.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
|
20
|
+
ezKit-1.9.10.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|