python-iterutils 0.0.6__tar.gz → 0.0.7__tar.gz
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.
- {python_iterutils-0.0.6 → python_iterutils-0.0.7}/PKG-INFO +1 -1
- {python_iterutils-0.0.6 → python_iterutils-0.0.7}/iterutils/__init__.py +57 -41
- {python_iterutils-0.0.6 → python_iterutils-0.0.7}/pyproject.toml +1 -1
- {python_iterutils-0.0.6 → python_iterutils-0.0.7}/LICENSE +0 -0
- {python_iterutils-0.0.6 → python_iterutils-0.0.7}/iterutils/py.typed +0 -0
- {python_iterutils-0.0.6 → python_iterutils-0.0.7}/readme.md +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# encoding: utf-8
|
|
3
3
|
|
|
4
4
|
__author__ = "ChenyangGao <https://chenyanggao.github.io>"
|
|
5
|
-
__version__ = (0, 0,
|
|
5
|
+
__version__ = (0, 0, 7)
|
|
6
6
|
__all__ = [
|
|
7
7
|
"iterable", "async_iterable", "foreach", "async_foreach", "through", "async_through",
|
|
8
8
|
"wrap_iter", "wrap_aiter", "acc_step", "cut_iter", "run_gen_step", "run_gen_step_iter",
|
|
@@ -24,7 +24,7 @@ T = TypeVar("T")
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
class YieldBase(ABC, Iterable):
|
|
27
|
-
__slots__ = "value", "identity"
|
|
27
|
+
__slots__ = "value", "identity", "try_call_me"
|
|
28
28
|
@property
|
|
29
29
|
@abstractmethod
|
|
30
30
|
def yield_type(self, /) -> int:
|
|
@@ -35,6 +35,7 @@ class YieldBase(ABC, Iterable):
|
|
|
35
35
|
class Yield(NamedTuple):
|
|
36
36
|
value: Any
|
|
37
37
|
identity: bool = False
|
|
38
|
+
try_call_me: bool = True
|
|
38
39
|
yield_type = 1 # type: ignore
|
|
39
40
|
|
|
40
41
|
|
|
@@ -212,12 +213,10 @@ def run_gen_step(
|
|
|
212
213
|
ret = send(None)
|
|
213
214
|
while True:
|
|
214
215
|
try:
|
|
216
|
+
if callable(ret):
|
|
217
|
+
ret = ret()
|
|
215
218
|
if isawaitable(ret):
|
|
216
219
|
ret = await ret
|
|
217
|
-
elif callable(ret):
|
|
218
|
-
ret = ret()
|
|
219
|
-
if isawaitable(ret):
|
|
220
|
-
ret = await ret
|
|
221
220
|
except BaseException as e:
|
|
222
221
|
if threaded:
|
|
223
222
|
ret = await to_thread(throw, e)
|
|
@@ -305,45 +304,53 @@ def run_gen_step_iter(
|
|
|
305
304
|
throw = gen.throw
|
|
306
305
|
if async_:
|
|
307
306
|
async def process():
|
|
307
|
+
async def extract(ret):
|
|
308
|
+
yield_type = 0
|
|
309
|
+
identity = False
|
|
310
|
+
try_call_me = True
|
|
311
|
+
if isinstance(ret, YieldBase):
|
|
312
|
+
yield_type = ret.yield_type
|
|
313
|
+
ret, identity, try_call_me = ret
|
|
314
|
+
if not identity:
|
|
315
|
+
if try_call_me and callable(ret):
|
|
316
|
+
ret = ret()
|
|
317
|
+
if isawaitable(ret):
|
|
318
|
+
ret = await ret
|
|
319
|
+
return yield_type, ret
|
|
308
320
|
try:
|
|
309
321
|
if threaded:
|
|
310
322
|
ret = await to_thread(send, None)
|
|
311
323
|
else:
|
|
312
324
|
ret = send(None)
|
|
313
325
|
while True:
|
|
314
|
-
yield_type = 0
|
|
315
|
-
identity = False
|
|
316
|
-
if isinstance(ret, YieldBase):
|
|
317
|
-
yield_type = ret.yield_type
|
|
318
|
-
ret, identity = ret
|
|
319
326
|
try:
|
|
320
|
-
|
|
321
|
-
if isawaitable(ret):
|
|
322
|
-
ret = await ret
|
|
323
|
-
elif callable(ret):
|
|
324
|
-
ret = ret()
|
|
325
|
-
if isawaitable(ret):
|
|
326
|
-
ret = await ret
|
|
327
|
-
else:
|
|
328
|
-
ret = ret
|
|
329
|
-
except BaseException as e:
|
|
330
|
-
if threaded:
|
|
331
|
-
ret = await to_thread(throw, e)
|
|
332
|
-
else:
|
|
333
|
-
ret = throw(e)
|
|
334
|
-
else:
|
|
327
|
+
yield_type, ret = await extract(ret)
|
|
335
328
|
match yield_type:
|
|
336
329
|
case 1:
|
|
337
330
|
yield ret
|
|
338
331
|
case 2:
|
|
339
332
|
async for val in ensure_aiter(ret, threaded=threaded):
|
|
340
333
|
yield val
|
|
334
|
+
except BaseException as e:
|
|
335
|
+
if threaded:
|
|
336
|
+
ret = await to_thread(throw, e)
|
|
337
|
+
else:
|
|
338
|
+
ret = throw(e)
|
|
339
|
+
else:
|
|
341
340
|
if threaded:
|
|
342
341
|
ret = await to_thread(send, ret)
|
|
343
342
|
else:
|
|
344
343
|
ret = send(ret)
|
|
345
|
-
except
|
|
346
|
-
|
|
344
|
+
except StopIteration as e:
|
|
345
|
+
ret = e.value
|
|
346
|
+
if isinstance(ret, YieldBase):
|
|
347
|
+
yield_type, ret = await extract(ret)
|
|
348
|
+
match yield_type:
|
|
349
|
+
case 1:
|
|
350
|
+
yield ret
|
|
351
|
+
case 2:
|
|
352
|
+
async for val in ensure_aiter(ret, threaded=threaded):
|
|
353
|
+
yield val
|
|
347
354
|
finally:
|
|
348
355
|
if close is not None:
|
|
349
356
|
if threaded:
|
|
@@ -352,30 +359,39 @@ def run_gen_step_iter(
|
|
|
352
359
|
close()
|
|
353
360
|
else:
|
|
354
361
|
def process():
|
|
362
|
+
def extract(ret):
|
|
363
|
+
yield_type = 0
|
|
364
|
+
identity = False
|
|
365
|
+
try_call_me = True
|
|
366
|
+
if isinstance(ret, YieldBase):
|
|
367
|
+
yield_type = ret.yield_type
|
|
368
|
+
ret, identity, try_call_me = ret
|
|
369
|
+
if not identity and try_call_me and callable(ret):
|
|
370
|
+
ret = ret()
|
|
371
|
+
return yield_type, ret
|
|
355
372
|
try:
|
|
356
373
|
ret = send(None)
|
|
357
374
|
while True:
|
|
358
|
-
yield_type = 0
|
|
359
|
-
identity = False
|
|
360
|
-
if isinstance(ret, YieldBase):
|
|
361
|
-
yield_type = ret.yield_type
|
|
362
|
-
ret, identity = ret
|
|
363
375
|
try:
|
|
364
|
-
|
|
365
|
-
ret = ret() if callable(ret) else ret
|
|
366
|
-
except BaseException as e:
|
|
367
|
-
ret = throw(e)
|
|
368
|
-
else:
|
|
376
|
+
yield_type, ret = extract(ret)
|
|
369
377
|
match yield_type:
|
|
370
378
|
case 1:
|
|
371
379
|
yield ret
|
|
372
380
|
case 2:
|
|
373
381
|
yield from ret
|
|
382
|
+
except BaseException as e:
|
|
383
|
+
ret = throw(e)
|
|
384
|
+
else:
|
|
374
385
|
ret = send(ret)
|
|
375
386
|
except StopIteration as e:
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
387
|
+
ret = e.value
|
|
388
|
+
if isinstance(ret, YieldBase):
|
|
389
|
+
yield_type, ret = extract(ret)
|
|
390
|
+
match yield_type:
|
|
391
|
+
case 1:
|
|
392
|
+
yield ret
|
|
393
|
+
case 2:
|
|
394
|
+
yield from ret
|
|
379
395
|
finally:
|
|
380
396
|
if close is not None:
|
|
381
397
|
close()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|