当前位置: 首页 > 面试题库 >

由于旧的解释器版本,如何妥善处理失败的将来功能(__future__)导入?

唐炳
2023-03-14
问题内容

您如何优雅地处理将来失败的功能导入?如果用户使用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

只能在future_statement之前出现的行是:

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

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

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_statements主要是编译时的mm头,并且try /
except会在编译器完成很长时间之后发生。也就是说,在您尝试/例外时,对模块有效的语义已经完成。由于try / except无法完成 看起来
应该完成的工作,因此完全不允许这样做。我们还希望使这些特殊声明易于查找和识别。

请注意,您 可以
直接导入__future__,并使用其中的信息以及sys.version_info来确定相对于给定功能的状态,您正在运行的发行版所处的位置。

有想法吗?


问题答案:

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

这不是自述文件的目的吗?

这是您的替代选择。“包装器”:一点点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向编译器提供a信息这一事实,但是您可以在导入完成实际工作的模块之前先三思。

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"


 类似资料:
  • 获取以下异常: 预期: TableInfo{name='chat_table',Columns={message=column{name='message',type='text',affinity='2',notnull=false,primarykeyposition=0},messageStatus=column{name='message status',type='text',affin

  • 我正在与我无法控制的遗留库集成。 它定义了以下接口: 这个“subscribe”方法被不同的线程频繁调用。我关心“Future.get()”的结果的唯一情况是当它失败时,所以我可以获取并处理异常。这不一定发生在调用线程中。另外,在“Future.get()”上阻塞调用线程对我来说是非常昂贵的,因为即使成功也可能需要几秒钟才能完成。 所以我的任务是以某种方式“后处理”所有这些期货,过滤失败的期货。基

  • 我试图让我的单元测试在pull_request上通过GitHub操作运行。 当我更新我的PR时,我可以看到运行的操作,但当PHP版本尝试composer安装我的项目时,它不会更新。 我尝试了多个不同的工作流文件,这是一个给了我最多的控制,但它似乎仍然运行在php7.4。 最后,下面是我的composer json中的一段代码,它显示了约束:

  • 这是一个有点奇怪的问题。我有很多Spock测试(功能测试),我在所有浏览器上都运行得很好(即IE-10、FF和Chrome)。但就在最近,我遇到了一个绊脚石,我不能始终如一地很好地运行测试,这是因为我开始使用代理设置(辉煌的IT部门已经引入了代理设置)。 奇怪的是,我的测试在Firefox上仍然运行良好,但在IE和Chrome上却失败了。我只知道它们都有相同的代理设置。 我使用下面的代码在gebc

  • 在调试模式下启动M2101K7AG上的lib\main.dart...正在运行Gradle任务'assembleDebug'... 失败:构建失败,有一个异常。 哪里出错了:配置根项目'android'时出现问题。 无法解析配置: classpath的所有工件。无法下载bundletool-0.14.0.jar(com.android.tools.build: bundletool: 0.14.0

  • 我正在尝试构建海豚播放器,但我得到了他的错误: