【问题标题】:Python - How to remove/unimport libs was imported before [duplicate]Python - 如何删除/取消导入库是在[重复]之前导入的
【发布时间】:2012-09-11 22:25:16
【问题描述】:

我们知道,在 python 2.x 中,如果我们将两个整数值相除,则会得到一个int。但是,如果使用from __future__ import division,我们会得到一个float 值。

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

所以,如果我们在导入__future__.division 后想要整数,应该使用// 而不是/,但我想知道如何让/ 再次返回整数。

有没有办法取消导入或删除之前导入的模块?


有一种方法可以在 IDLE 中取消导入库或模块,即使用 Ctrl+F6 或菜单中的选项重新启动它

【问题讨论】:

  • @NedBatchelder 这正是我的问题。
  • 请不要再发布同样的问题,@Marslo。如果您没有得到好的答案,请尝试通过添加更多细节或澄清问题来改进您现有的问题。
  • 不管怎样,你应该在任何需要整数除法的时候使用//。如果您使用/,您的代码应该足够健壮以处理整数或真除法,或者您应该使用__future__,这样您就可以确定您使用的是真除法。
  • 即使在 __future__ "modules" 被导入之后,也没有办法删除它们 - 即使是 del division; from sys import modules; del modules['__future__']。我认为此导入会覆盖解释器中的某些内容或其他内容。但是,对于其他标准导入,删除(尽管这是有风险的,几乎永远不应该这样做)模块可以由 deleting sys.modules[MODULE_NAME] 完成

标签: python


【解决方案1】:

python 有reload 重新导入一个已经导入的模块(不应该在生产代码中使用),但没有办法(据我所知)在导入模块后取消导入。

当然,您可以在当前命名空间中删除对该模块的引用:

import module
module.foo()
del module
module.foo() #NameError, can't find `module`

另一点是__future__ 并不是真正的模块。它更多的是告诉解析器如何表现的指令。因此,当放入文件时,它必须是其中的第一件事(在任何其他导入等之前)。您可以从交互式会话中的任何位置导入 __future__ 是一种特殊情况。

【讨论】:

  • 有一些方法可以取消导入模块,例如你可以del他们。不过,它不适用于__future__
  • @LevLevitsky -- 不,这会删除当前命名空间中对模块的引用,这不是一回事。 -- 如果你from module import *,它不起作用。
  • @LevLevitsky -- 你也许可以用sys.modules 来删除它,但这是有问题的......
  • 它有点适用于from module import *,你只需要知道要删除哪些名称。
  • @mgilson:存在这方面的现有技术。 (我现在懒得查,抱歉。)正确地做起来很复杂,但它可以做到,并且在所有情况下都能很好地工作。说“没有官方支持方式”更正确。 IIRC 解决方案涉及注册一个导入钩子并找出一些复杂的回溯逻辑来修复对模块对象的所有引用。
【解决方案2】:

__future__ 看起来像一个模块,但实际上不是。导入它实际上会影响当前模块的编译选项。没有办法“撤消”它,因为它实际上发生在模块执行之前。

如果它是任何其他“正常”模块,有办法,但你在这里不走运。 要么处理改变的语义,要么将需要不同编译的代码放在单独的模块中。

【讨论】:

  • 那么,撤消“正常”模块是使用“del”,不是吗?
  • Marsalo:不。如果你想改变你的问题,我会回答,但一般情况下这行不通。模块对象仍将被sys.modules 以及随后导入它的任何模块引用。 del sys.modules['modulename'] 更接近但仍不完整。
  • 嗯,我认为'del' 有效。我用“数学”模块测试过,它被`del math`取消导入
  • 但是 sys.modules['math'] 不起作用!!那很奇怪! 'math' 模块确实从 sys.modules 中删除。我使用 'sys.modules['math'] ' 打印它们之前和之后两次。
  • 我认为您错过了 import 使 sys.modules 条目:gist.github.com/3751495 的事实。请注意,这并没有解决对模块的任何其他引用的问题,因此并不完全可靠/值得生产。
【解决方案3】:

我也遇到过这种需求。

我不使用__future__

当我需要浮点结果时,我将除数设为浮点数:

>>> 3/浮点数(2) 1.5

【讨论】:

  • “不要那样做。”不是对“我该怎么做?”的回答
  • >>> 3/2.01.5>>> 3.0/21.5>>> 3.0/2.01.5
  • 对不起,我只是不知道如何在评论框中换行
  • @bukzor:你是对的,从技术上讲,这不是一个答案。但是我发现许多关于 SO 的“你做错了”的“答案”非常有用。给我点赞。
【解决方案4】:

您可以使用以下方式卸载它:

>>> del(module)

【讨论】:

  • 是的,del moudle_name 在某些情况下有效,例如 import moudle_name,但它似乎不适用于 from xxx import xxx.
  • 这不会卸载模块。该对象至少仍存在于sys.modules 中。
猜你喜欢
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 2023-01-24
相关资源
最近更新 更多