python怎么撤销_关于Python:Python-如何删除/取消导入之前已导入的库

本问题已经有最佳答案,请猛点这里访问。

众所周知,在python 2.x中,如果我们将两个整数值相除,则结果为int。 但是,如果使用from __future__ import division,我们取而代之的是float值。

1

2

3

4

5

6

7

8

9

10

11

12>>> 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__"模块",也无法删除它们-即使使用del division; from sys import modules; del modules[__future__]。 我认为此导入会覆盖解释器中的某些内容。 但是,对于其他标准导入,可以通过del eting sys.modules[MODULE_NAME]来删除(尽管这是有风险的,并且几乎绝不应这样做)模块。

python具有reload来重新导入已经导入的模块(不应在生产代码中使用),但是一旦导入,就没有办法(我知道)取消导入模块。

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

1

2

3

4import 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解决方案包括注册一个导入钩子,并弄清楚一些及时的逻辑以修复对模块对象的所有引用。

是! del moudle_name适用于导入moudle_name的条件。我仍然找到从xxx import xx的状况的方式,我想我可以通过print sys.modules或print sys.modules.keys()找到它们。

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

如果它是其他任何"正常"模块,则有很多方法,但是您不走运。

要么处理更改后的语义,要么将需要进行不同编译的代码放在单独的模块中。

因此,撤消普通模块是通过使用del,不是吗?

Marsalo:否。如果您想更改自己的问题,我会回答,但在一般情况下不起作用。 sys.modules以及以后导入该对象的任何模块都将引用该模块对象。 del sys.modules[modulename]更接近但仍不完整。

好吧,我认为del有效。我通过Math模块进行了测试,而del数学未将其导入。

但是sys.modules [math]不起作用!那很奇怪!数学模块会从sys.modules中删除。在使用sys.modules [math]之前和之后,我将它们打印两次。

我认为您缺少import进入sys.modules条目的事实:gist.github.com/3751495。请注意,这并未解决对模块的任何其他引用的问题,因此并不完全可靠/值得进行生产。

我已添加我的评论。我很奇怪,即使sys.modules中不再存在math,数学模块也能正常工作。

我也已经遇到了这种需要。

我不使用__future__。

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

1

2>>> 3/float(2)

1.5

"不要那样做。"不是"我该怎么办?"的答案

>>> 32.0 1.5 >>> 3.02 1.5 >>> 3.02.0 1.5

抱歉,我只是不知道如何在注释框中进行换行

@bukzor:没错,从技术上讲,这不是答案。但是我发现许多关于SO的"做错了事"的答案非常有用。来自我的支持。

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

1>>> del(module)

是的,del moudle_name在某些情况下可以工作,例如import moudle_name,但似乎不能用于xxx import xxx。

这不会卸载模块。该对象仍然至少存在于sys.modules中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值