mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-15 00:16:04 +08:00
feat(api): Add some utility functions for working with generators
This commit is contained in:
parent
3b45b87d02
commit
4cf9d23069
53
api/libs/gen_utils.py
Normal file
53
api/libs/gen_utils.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
"""Utility functions for working with generators."""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from collections.abc import Callable, Generator
|
||||||
|
from inspect import isgenerator
|
||||||
|
from typing import TypeVar
|
||||||
|
|
||||||
|
_YieldT = TypeVar("_YieldT")
|
||||||
|
_YieldR = TypeVar("_YieldR")
|
||||||
|
|
||||||
|
_T = TypeVar("_T")
|
||||||
|
|
||||||
|
|
||||||
|
def inspect(gen_or_normal: _T, logger: logging.Logger) -> _T:
|
||||||
|
if not isgenerator(gen_or_normal):
|
||||||
|
return gen_or_normal
|
||||||
|
|
||||||
|
def wrapper():
|
||||||
|
for item in gen_or_normal:
|
||||||
|
logger.info(
|
||||||
|
"received generator item, type=%s, value=%s",
|
||||||
|
type(item),
|
||||||
|
item,
|
||||||
|
)
|
||||||
|
yield item
|
||||||
|
|
||||||
|
return wrapper()
|
||||||
|
|
||||||
|
|
||||||
|
def map_(
|
||||||
|
gen: Generator[_YieldT, None, None],
|
||||||
|
mapper: Callable[[_YieldT], _YieldR],
|
||||||
|
) -> Generator[_YieldR, None, None]:
|
||||||
|
for item in gen:
|
||||||
|
yield mapper(item)
|
||||||
|
|
||||||
|
|
||||||
|
def filter_(
|
||||||
|
gen: Generator[_YieldT, None, None],
|
||||||
|
mapper: Callable[[_YieldT], bool],
|
||||||
|
) -> Generator[_YieldT, None, None]:
|
||||||
|
for item in gen:
|
||||||
|
if mapper(item):
|
||||||
|
yield item
|
||||||
|
|
||||||
|
|
||||||
|
def wrap(
|
||||||
|
gen: Generator[_YieldT, None, None],
|
||||||
|
funcs: list[Callable[[Generator[_YieldT, None, None]], Generator[_YieldT, None, None]]],
|
||||||
|
) -> Generator[_YieldT, None, None]:
|
||||||
|
for f in funcs:
|
||||||
|
gen = f(gen)
|
||||||
|
return gen
|
Loading…
x
Reference in New Issue
Block a user