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 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