跳至主要內容

- 资源包开发
- 轻雪函数
- 轻雪插件开发
- 进程通信
- - liteyuki
  - liteyuki.config
  - liteyuki.exception
  - liteyuki.log
  - liteyuki.mkdoc
  - liteyuki.utils

# liteyuki.utils

远野千束
大约 1 分钟
API

此页内容

- def is_coroutine_callable(call: Callable[..., Any]) -> bool
- def run_coroutine() -> None
- def path_to_module_name(path: Path) -> str
- def async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]
- async def wrapper() -> None
- var IS_MAIN_PROCESS = multiprocessing.current_process().name == 'MainProcess'
- var func_ = getattr(call, '__call__', None)
- var rel_path = path.resolve().relative_to(Path.cwd().resolve())
- var loop = asyncio.get_event_loop()
- var loop = asyncio.new_event_loop()

### def `is_coroutine_callable(call: Callable[..., Any]) -> bool`

判断是否为协程可调用对象

Args:

    call: 可调用对象

Returns:

    bool: 是否为协程可调用对象

源代码

    def is_coroutine_callable(call: Callable[..., Any]) -> bool:
        """
        判断是否为协程可调用对象
        Args:
            call: 可调用对象
        Returns:
            bool: 是否为协程可调用对象
        """
        if inspect.isroutine(call):
            return inspect.iscoroutinefunction(call)
        if inspect.isclass(call):
            return False
        func_ = getattr(call, '__call__', None)
        return inspect.iscoroutinefunction(func_)

### def `run_coroutine() -> None`

运行协程

Args:

    coro:

Returns:

源代码

    def run_coroutine(*coro: Coroutine):
        """
        运行协程
        Args:
            coro:

        Returns:

        """
        try:
            loop = asyncio.get_event_loop()
            if loop.is_running():
                for c in coro:
                    asyncio.ensure_future(c)
            else:
                for c in coro:
                    loop.run_until_complete(c)
        except RuntimeError:
            loop = asyncio.new_event_loop()
            asyncio.set_event_loop(loop)
            loop.run_until_complete(asyncio.gather(*coro))
            loop.close()
        except Exception as e:
            logger.error(f'Exception occurred: {e}')

### def `path_to_module_name(path: Path) -> str`

转换路径为模块名

Args:

    path: 路径a/b/c/d -> a.b.c.d

Returns:

    str: 模块名

源代码

    def path_to_module_name(path: Path) -> str:
        """
        转换路径为模块名
        Args:
            path: 路径a/b/c/d -> a.b.c.d
        Returns:
            str: 模块名
        """
        rel_path = path.resolve().relative_to(Path.cwd().resolve())
        if rel_path.stem == '__init__':
            return '.'.join(rel_path.parts[:-1])
        else:
            return '.'.join(rel_path.parts[:-1] + (rel_path.stem,))

### def `async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]`

异步包装器

Args:

    func: Sync Callable

Returns:

    Coroutine: Asynchronous Callable

源代码

    def async_wrapper(func: Callable[..., Any]) -> Callable[..., Coroutine]:
        """
        异步包装器
        Args:
            func: Sync Callable
        Returns:
            Coroutine: Asynchronous Callable
        """

        async def wrapper(*args, **kwargs):
            return func(*args, **kwargs)
        wrapper.__signature__ = inspect.signature(func)
        return wrapper

### async def `wrapper() -> None`

源代码

    async def wrapper(*args, **kwargs):
        return func(*args, **kwargs)

### var `IS_MAIN_PROCESS = multiprocessing.current_process().name == 'MainProcess'`

### var `func_ = getattr(call, '__call__', None)`

### var `rel_path = path.resolve().relative_to(Path.cwd().resolve())`

### var `loop = asyncio.get_event_loop()`

### var `loop = asyncio.new_event_loop()`