Skip to content

# liteyuki.utils ​

一些常用的工具类，部分来源于 nonebot 并遵循其许可进行修改

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

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

参数:

> - call: 可调用对象

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

源代码 或 在GitHub上查看
python

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

### func `run_coroutine(*coro: Coroutine)` ​

说明: 运行协程

参数:

> - coro:

源代码 或 在GitHub上查看
python

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

        Returns:

        """
        try:
            loop = asyncio.get_running_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}')

### func `run_coroutine_in_thread(*coro: Coroutine)` ​

说明: 在新线程中运行协程

参数:

> - coro:

源代码 或 在GitHub上查看
python

    def run_coroutine_in_thread(*coro: Coroutine):
        """
        在新线程中运行协程
        Args:
            coro:

        Returns:

        """
        threading.Thread(target=run_coroutine, args=coro, daemon=True).start()

### func `path_to_module_name(path: Path) -> str` ​

说明: 转换路径为模块名

参数:

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

返回: str: 模块名

源代码 或 在GitHub上查看
python

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

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

说明: 异步包装器

参数:

> - func: Sync Callable

返回: Coroutine: Asynchronous Callable

源代码 或 在GitHub上查看
python

    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