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 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
- object_data: Any,
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
- return False
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
- match True:
120
- case True if not isTrue(name, str):
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
- match True:
169
- case True if not isTrue(numbers, (list, tuple)):
170
- logger.error("argument error: numbers")
171
- return None
172
- case True if not any([isTrue(dest_type, str), dest_type is None]):
173
- logger.error("argument error: dest_type")
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
- match True:
184
- case True if dest_type == "float":
185
- _numbers = [float(i) for i in numbers]
186
- case True if dest_type == "int":
187
- _numbers = [int(i) for i in numbers]
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
- """list split"""
340
+ """列表分割"""
341
+
362
342
  # 列表分割
363
343
  #
364
- # 默认: 将 list 以 number个元素为一个list 分割
344
+ # 默认: 将 list 以 number 个元素为一个子 list 分割
365
345
  #
366
- # data = [1, 2, 3, 4, 5, 6, 7]
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
- # list_split(data, 2) -> data 2个元素为一个 list 分割
369
- # [[1, 2], [3, 4], [5, 6], [7]]
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
- # list_split(data, 3) ->data 3个元素为一个 list 分割
372
- # [[1, 2, 3], [4, 5, 6], [7]]
354
+ # equally True 时, list 平均分成 number 个元素的子 list
373
355
  #
374
- # equally True 时, data 平均分成 number 份
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
- # data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
377
- #
378
- # list_split_equally(data, 5) -> 将 data 平均分成 5 份
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
- if _data_length < number:
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
- if _data_length == number:
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
- for index_number in list(range(0, _data_length, number)):
436
- _data_result.append(deepcopy(_data_object[index_number:index_number + number]))
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
- return _data_result
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ezKit
3
- Version: 1.9.8
3
+ Version: 1.9.10
4
4
  Summary: Easy Kit
5
5
  Author: septvean
6
6
  Author-email: septvean@gmail.com
@@ -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=-gvuVXSoYRIjjuHfE0WYr2BegetpFCfY-juo3253FMs,43900
14
+ ezKit/utils.py,sha256=TDsL3PRkQy6NdZgphkgwacbWvHqEmq4LOkfNzmxV4DY,42682
15
15
  ezKit/xftp.py,sha256=XyIdr_2rxRVLqPofG6fIYWhAMVsFwTyp46dg5P9FLW4,7774
16
- ezKit-1.9.8.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
17
- ezKit-1.9.8.dist-info/METADATA,sha256=wCl9POdJB7m1pfOX7wQYCreg9jUg49M4DeR2jZEUBDk,190
18
- ezKit-1.9.8.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
19
- ezKit-1.9.8.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
20
- ezKit-1.9.8.dist-info/RECORD,,
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