本问题已经有最佳答案,请猛点这里访问。
众所周知,在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中。