存在 pyproject.toml 的 Python 项目版本的单一事实来源

问题描述 投票:0回答:1

pyproject.toml 规范提供了指定项目版本的能力,例如

[project]
name = "foo"
version = "0.0.1"

但是,将

__version__ = "0.0.1"
放在
foo/__init__.py
中以便用户查询也是一种常见的 Python 习惯用法。

有没有一种标准方法可以从

version
中提取
pyproject.toml
并将其放入
foo/__init__.py
中?

python version pyproject.toml
1个回答
14
投票

您可以采取两种方法。

  1. 将版本保留在

    pyproject.toml
    中,并从源代码中的包元数据中获取它。所以,在您的
    mypkg/__init__.py
    或任何地方:

    from importlib.metadata import version
    __version__ = version("mypkg")
    

    importlib.metadata.version
    自 Python 3.8 起可用。对于早期的 Python 版本,您可以使用
    importlib_metadata
    向后移植执行类似操作。

  2. 将版本保留在源代码中并指示构建系统从那里获取它。对于 setuptools 构建后端,它看起来像这样

    pyproject.toml
    :

    [project]
    name = "mypkg"
    dynamic = ["version"]
    
    [tool.setuptools.dynamic]
    version = {attr = "mypkg.__version__"}
    

我的建议是(🥁)...都不是!根本不要在源代码中保留

__version__
属性。这是一个过时的习惯,现在我们可以不用了。
Version
已经是包元数据中的required字段,在包/模块命名空间中保留相同的字符串作为属性是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.