相关疑难解决方法(0)

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

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

from __future__ import print_function
Run Code Online (Sandbox Code Playgroud)

为Python 2.5编译此模块将失败,并带有:

  File "__init__.py", line 1
    from __future__ import print_function
SyntaxError: future feature print_function is not defined
Run Code Online (Sandbox Code Playgroud)

我想告诉用户他们需要用Python> = 2.6重新运行程序,并且可能提供一些如何操作的说明.但是,引用PEP 236:

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

  • 模块docstring(如果有的话).
  • 评论.
  • 空白行.
  • 其他future_statements.

所以我做不了类似的事情:

import __future__

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

因为它产生:

  File "__init__.py", line 4
    from __future__ import print_function
SyntaxError: from __future__ imports must occur at the beginning of the file
Run Code Online (Sandbox Code Playgroud)

来自PEP的这个片段似乎给了内联的希望:

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

A:对不起!try/except是一个运行时功能; future_statements主要是编译时的噱头,你的try/except在编译完成后很久就会发生.也就是说,当你尝试使用/ except时,对模块有效的语义已经完成了.由于试/除非将无法完成它看起来 像它应该做到,它只是不允许的.我们还希望保持这些特殊陈述非常容易找到和识别.

请注意,您 …

python python-import

68
推荐指数
3
解决办法
5万
查看次数

如何编写Python 2.6+脚本,使用较旧的Python优雅地失败?

我正在使用Python 3.x中的新打印,我观察到以下代码由于没有编译end=' '.

from __future__ import print_function

import sys
if sys.hexversion < 0x02060000:
    raise Exception("py too old")

...
print("x",end=" ") # fails to compile with py24
Run Code Online (Sandbox Code Playgroud)

如何继续使用新语法但使脚本失败?是否必须调用另一个脚本并在此处仅使用安全语法?

python python-3.x

5
推荐指数
2
解决办法
758
查看次数

用于指定兼容解释器版本的Python约定?

类似于__author____version__顶层模块的变量,有指定支持Python版本的Python源文件中的任何约定?

我的用例是一个项目,其中包含一些需要与Python 2.4兼容的脚本.我想用一些普遍可识别的方式注意它们中的事实.

我不是在询问如何在执行期间要求最小的Python版本.我的问题是开发人员可能会意外地使用与此特定脚本需要支持的python版本不兼容的功能.PyCharm可以警告Python不兼容性.如果能够获取此注释并在每个文件的基础上配置警告,那将会很棒.

python backwards-compatibility pycharm

5
推荐指数
1
解决办法
132
查看次数