【问题标题】:Is there a standard way to declare old python versions unsupported?是否有标准方法来声明不支持旧的 python 版本?
【发布时间】:2014-12-13 18:31:30
【问题描述】:

我想正式放弃对我维护的程序的 python 2 支持,并充分利用 python 3 的特性。我不想让一个或多或少在 python 2 下工作但在极端情况下因奇怪行为而失败的程序,我想正式打破我的 python 2 程序,并带有明确的“请改用 python 3”错误消息。对于不受支持的 python 版本,最合理的失败方法是什么?

例如,我想在 python 2(至少是顶级包)中导入代码以触发错误,并让我的 distutils setup.py 脚本在尝试为 python 2 安装或构建它时出错(即使通过 python 3 调用,如python3 setup.py sdist_dsc --with-python2)。我还想包含任何相关的元数据来正式声明我支持哪些 python 版本。 PEP 345 中有一个 Requires-Python 字段,但如果我不使用 distutils2,我认为这并不重要。

【问题讨论】:

  • 我也可以在其上进行某种 3to2 翻译,以便尽最大努力实现 python 2 向后兼容,但 IIUC 这是一个手动过程,不提供任何轻松的即时操作飞翻译。

标签: python


【解决方案1】:

从 setuptools 24.2.0 (2016-07-20) 和 pip 9.0.0 (2016-11-02) 开始,setup.pysetup()python_requires 参数将告诉打包工具不要安装与说明符不匹配的包。例如,仅支持 Python 3.6+:

setup(
    ...
    python_requires=">=3.6",
    ...
)

仅支持 Python 2.7 和 3.4+:

setup(
    ...
    python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
    ...
)

鉴于内置支持,不应再使用此答案中的以下方法。


为了防止导入,把它放在模块的顶部:

import sys

if sys.version_info[0] < 3:
    raise ImportError('Python < 3 is unsupported.')

为了防止安装,把这个放在setup.py的顶部:

import sys

if sys.version_info[0] < 3:
    sys.exit('Python < 3 is unsupported.')

如果您使用与 Python 2 不兼容的语法,这也会在检查之前失败,因为模块将在运行之前被解析。检测到支持“不支持 Python 2”可能是多余的。

但我实际上并没有在实践中看到这样做。大多数维护者只说支持的内容,而不去检查。

【讨论】:

    【解决方案2】:

    标准方法是在setup.py中设置classifiers

    if sys.version_info < (3, 3):
        sys.exit("error: this script requires Python 3.3 or greater.")
    
    setup(...,
    classifiers=[
            'Programming Language :: Python :: 3',
            'Programming Language :: Python :: 3.3',
            'Programming Language :: Python :: 3.4',
            # ... other non-version info
        ],
        ...)
    

    例如,tulip project (asyncio) supports only Python 3.3

    你也可以在你的包中添加__init__.py:

    if sys.version_info < (3, 3):
        raise ImportError("Python 3.3 or greater is required")
    

    【讨论】:

      【解决方案3】:

      我会选择this answer,但我会提出一个例外:

      import sys
      
      if sys.version_info[0] < 3:
          raise ImportError('Only Python 3 is supported.')
      

      【讨论】:

      • 可能应该只是对该答案的评论,但我同意这个建议。 =)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      相关资源
      最近更新 更多