ezKit 1.9.8__py3-none-any.whl → 1.9.10__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- 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
|