跳转到主要内容

构建可选依赖项的检查

项目描述

optional_dependencies

构建可选依赖项的检查

安装

PyPI platforms PyPI version

pip install optional_dependencies

文档

高级API

此包允许轻松构建可选依赖项的检查。由于每个Python项目都可能有其自己独特的可选依赖项集合,optional_dependencies提供了enum.Enum基类OptionalDependencyEnum以枚举可选依赖项。

一个构造的 OptionalDependencyEnum enum.Enum 包含成员,这些成员是包名,其值可以是 packaging.VersionNOT_INSTALLED 标志值。

例如

# Note that `auto` is a convenience re-export of enum.auto
from optional_dependencies import OptionalDependencyEnum, auto


class OptDeps(OptionalDependencyEnum):
    PACKAGING = auto()
    THIS_IS_NOT_INSTALLED = auto()


OptDeps.PACKAGING
# <OptDeps.PACKAGING: <Version('...')>>

OptDeps.PACKAGING.installed
# True

OptDeps.PACKAGING.version
# <Version('...')>

OptDeps.THIS_IS_NOT_INSTALLED
# <OptDeps.THIS_IS_NOT_A_PACKAGE: <InstalledState.NOT_INSTALLED: False>>

OptionalDependencyEnum 上使用 enum.auto 将版本解析传递给 packaging.utils.canonicalize_name,然后 importlib.metadata.version,然后 packaging.version.parse。如果找不到包,则认为是 InstalledState.NOT_INSTALLED

InstalledState.NOT_INSTALLED 是一个 enum.Enum 成员,其布尔值为 False。这在布尔检查中可能很有用,因为 packaging.Version 总是有一个布尔值为 True

if not OptDeps.THIS_IS_NOT_INSTALLED:
    print("NOT_INSTALLED has a truthy value of False")
# NOT_INSTALLED has a truthy value of False

if OptDeps.PACKAGING:  # truthy value of `True`
    print(OptDeps.PACKAGING)
# OptDeps.PACKAGING

低级 API

有时高级 API 不足以确定是否存在可选依赖项。例如,这可能会发生在编译包的情况下,其中包似乎已安装,但某些东西出了问题。在这些情况下,您可以使用低级 API 自定义枚举成员。

低级函数包括

  • optional_dependencies.utils.is_installed(pkg_name: str, /) -> bool:是 importlib.util.find_spec 的规范化形式。

  • optional_dependencies.utils.get_version(pkg_name: str, /) -> Version | Literal[InstalledState.NOT_INSTALLED]:用于获取已安装包的 packaging.Version,或者在没有安装的情况下返回 NOT_INSTALLED

  • optional_dependencies.utils.chain_checks(version: Version, /, *checks: bool):用于连接检查并确保返回值仍然是 packaging.VersionNOT_INSTALLED

以下是一个示例,说明具有 C 编译代码的包

from optional_dependencies.utils import is_installed, get_version, chain_checks

# A subpackage needs to be checked.
chain_checks(get_version("package1"), is_installed("package1.subpackage"))
# <Version('...')>

# This package is not installed correctly
chain_checks(get_version("package2"), is_installed("package2.subpackage"))
# <InstalledState.NOT_INSTALLED: False>

可以使用低级 API 与 OptionalDependencyEnum 一起使用

class OptDeps(OptionalDependencyEnum):
    PACKAGING = auto()
    THIS_IS_NOT_INSTALLED = chain_checks(
        get_version("package2"), is_installed("package2.subpackage")
    )

引用

DOI

如果您发现这个库很有用,并希望支持为科学社区开发低级代码库的开发和维护,请考虑引用这项工作。

开发

codecov Actions Status

我们欢迎贡献!

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。

源分布

optional_dependencies-0.3.2.tar.gz (12.6 kB 查看哈希值)

上传时间

构建分布

optional_dependencies-0.3.2-py3-none-any.whl (8.5 kB 查看哈希值)

上传时间 Python 3

支持者