【问题标题】:How can I remove/unimport symbols from __future__ after importing them?导入后如何从 __future__ 中删除/取消导入符号?
【发布时间】:2012-09-19 15:20:53
【问题描述】:

在 python 2.x 中,将两个整数相除会返回一个整数。但是,如果您使用

from ___future___ import division

你可以得到一个浮点值:

>>> 3/2
1
>>> from __future__ import division
>>> 3/2
1.5
>>> 
>>> 
>>> 3//2
1
>>> 4/3
1.3333333333333333
>>> 

import 之后,你必须使用// 而不是/ 来进行整数除法。如何恢复 import 以便 / 再次进行整数除法?

【问题讨论】:

  • 你为什么要这样做?

标签: python


【解决方案1】:

__future__ 导入是特殊的,无法撤消。你可以阅读他们的行为here

以下是一些相关部分:

未来语句在编译时被识别和特殊处理:核心构造语义的更改通常通过生成不同的代码来实现。甚至可能是新特性引入了新的不兼容语法(例如新的保留字),在这种情况下,编译器可能需要以不同的方式解析模块。此类决定不能推迟到运行时。
...
在交互式解释器提示下键入的未来语句将在解释器会话的其余部分生效。

由于__future__ 语句是在编译时而不是运行时处理的,因此没有运行时方法可以恢复更改的行为。

使用普通模块,您可以删除或取消导入模块,方法是删除从命名空间导入的任何内容,并删除 sys.modules 中该导入的条目(根据用例,第二部分可能不是必需的,它所做的一切如果再次导入,则强制重新加载模块。

【讨论】:

  • +1 这个答案(解释了问题)和 Brendan Long 的(解释了 OP 如何实际做他想做的事)。
  • 另请注意,扩展模块(那些用 C 等编译语言编写的)无法卸载,因为它们在导入时已集成到解释器的地址空间中。跨度>
【解决方案2】:

import 语句对于您导入的文件是本地的,例如,如果您将此文件作为 example.py

from __future__ import division
print(1/2)

然后将其加载到另一个文件中:

import example # prints 0.5 because `division` is imported in example.py
print(1/2) # prints 0 because `division` is not imported in this file

因此,如果您想要仅在某些代码中使用的导入,请将该代码放在单独的文件中。

在您提供的情况下,我不确定它是否有帮助。为什么在需要整数除法时不直接使用//

【讨论】:

  • 为什么有人想要“取消导入”未来部门的一个答案是单元测试。我正在重载除法运算符并想验证 Python 2 中的单斜杠行为。我可以直接调用 __div__()。您的答案可能是更好的解决方案:在不同的源文件中使用单斜杠进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多