如何优雅地处理由于旧解释器版本而导致的失败的未来功能(__future__)导入?

2024-02-01

您如何优雅地处理失败的未来功能导入?如果用户使用 Python 2.5 运行并且我的模块中的第一条语句是:

from __future__ import print_function

为 Python 2.5 编译此模块将失败并显示:

  File "__init__.py", line 1
    from __future__ import print_function
SyntaxError: future feature print_function is not defined

我想通知用户他们需要使用 Python >= 2.6 重新运行该程序,并可能提供一些有关如何执行此操作的说明。然而,引用PEP 236 http://www.python.org/dev/peps/pep-0236/:

唯一可以出现在前面的行 future_statement 是:

  • 模块文档字符串(如果有)。
  • 评论。
  • 空行。
  • 其他 future_statements。

所以我不能做这样的事情:

import __future__

if hasattr(__future__, 'print_function'):
    from __future__ import print_function
else:
    raise ImportError('Python >= 2.6 is required')

因为它产生:

  File "__init__.py", line 4
    from __future__ import print_function
SyntaxError: from __future__ imports must occur at the beginning of the file

PEP 中的这段代码似乎给了内联执行此操作的希望:

问:我想包装 future_statements 在 try/ except 块中,所以我可以使用 不同的代码取决于 我正在运行的Python版本。为什么 我不能吗?

答: 抱歉! try/ except 是一个运行时 特征; future_statement 是 主要是编译时的噱头,以及 你的尝试/例外发生很久之后 编译器完成。也就是说,由 当你尝试/除外时,语义 对模块有效的已经是 木已成舟。由于尝试/例外 达不到它的目的looks就像它应该完成的那样,这只是 不允许。我们也想保留 这些特殊的语句很容易 发现并认识。

请注意,您can导入 __future__ 直接使用信息 它与 sys.version_info 一起 弄清楚你在哪里发布 运行在与a相关的立场下 给定功能的状态。

Ideas?


“我想通知用户,他们需要使用 Python >= 2.6 重新运行该程序,并可能提供一些有关如何执行此操作的说明。”

这不是 README 文件的用途吗?

这是您的替代方案。 “包装器”:Python 的一个小块,用于在运行目标 aop 之前检查环境。

文件:appwrapper.py

import sys
major, minor, micro, releaselevel, serial = sys.version_info
if (major,minor) <= (2,5):
    # provide advice on getting version 2.6 or higher.
    sys.exit(2)
import app
app.main()

“直接进口”是什么意思。您可以检查以下内容__future__。你仍然受到以下事实的约束from __future__ import print_function是编译器的信息,但您可以在导入执行实际工作的模块之前进行研究。

import __future__, sys
if hasattr(__future__, 'print_function'): 
    # Could also check sys.version_info >= __future__. print_function.optional
    import app
    app.main()
else:
    print "instructions for upgrading"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何优雅地处理由于旧解释器版本而导致的失败的未来功能(__future__)导入? 的相关文章

随机推荐