本文介绍了如何正确处理由于解释器版本旧而导致的未来功能(__未来__)导入失败?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何正确处理失败的未来功能导入?如果用户正在使用Python2.5运行,并且我的模块中的第一条语句是:

from __future__ import print_function

为Python2.5编译此模块将失败,并显示:

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

我想通知用户,他们需要使用Python>=2.6重新运行程序,并可能提供一些如何执行此操作的说明。然而,引用PEP 236

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

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的代码似乎给了内联执行该操作的希望:

想法?

推荐答案

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

这不就是自述文件的用途吗?

这是您的替代方案。"包装器":在运行目标AOP之前检查环境的一小段Python代码。

文件: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__的内容。您仍然受到afrom __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"

这篇关于如何正确处理由于解释器版本旧而导致的未来功能(__未来__)导入失败?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-11 17:31