Python中的重新加载模块:更改值与删除值不一致

Python中的重新加载模块:更改值与删除值不一致,python,python-2.7,module,python-import,Python,Python 2.7,Module,Python Import,在使用内置的reload调试某些代码时,我发现一些行为不一致 审议以下互动会议: Python 2.7.4 (default, Sep 26 2013, 03:20:26) [GCC 4.7.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import foo >>> foo.BAR 'bar' >>> # her

在使用内置的
reload
调试某些代码时,我发现一些行为不一致

审议以下互动会议:

Python 2.7.4 (default, Sep 26 2013, 03:20:26) 
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo
>>> foo.BAR
'bar'
>>> # here I edit foo.py, changing BAR to 'foobar'
... 
>>> foo.BAR
'bar'
>>> # as expected
... 
>>> reload(foo)
<module 'foo' from 'foo.py'>
>>> foo.BAR
'foobar'
>>> # as expected
... 
>>> 
Python 2.7.4(默认,2013年9月26日03:20:26)
[GCC 4.7.3]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口食品
>>>美食酒吧
“酒吧”
>>>#这里我编辑foo.py,将BAR更改为“foobar”
... 
>>>美食酒吧
“酒吧”
>>>#如预期
... 
>>>重新加载(foo)
>>>美食酒吧
“foobar”
>>>#如预期
... 
>>> 
一切正常。但是,如果我删除该值而不是更改它,它将无法按预期工作

Python 2.7.4 (default, Sep 26 2013, 03:20:26) 
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo
>>> foo.BAR
'bar'
>>> # here I edit foo.py, removing BAR from it
... 
>>> foo.BAR
'bar'
>>> # as expected
... 
>>> reload(foo)
<module 'foo' from 'foo.py'>
>>> foo.BAR
'bar'
>>> # ???
... 
>>> 
Python 2.7.4(默认,2013年9月26日03:20:26)
[GCC 4.7.3]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口食品
>>>美食酒吧
“酒吧”
>>>#这里我编辑foo.py,从中删除了BAR
... 
>>>美食酒吧
“酒吧”
>>>#如预期
... 
>>>重新加载(foo)
>>>美食酒吧
“酒吧”
>>> # ???
... 
>>> 

为什么会这样?有没有办法重新加载模块并避免该问题?

我不知道为什么会发生这种情况,但您可以先从模块缓存中删除模块,然后完全重新加载模块:

import sys
del sys.modules['foo']
然后重新导入:

import foo
摘自:

如果模块实例化一个类的实例,则重新加载定义该类的模块不会影响实例的方法定义-它们将继续使用旧的类定义。派生类也是如此

重新加载模块时,将保留其字典(包含模块的全局变量)。名称的重新定义将覆盖旧的定义,因此这通常不是问题。如果模块的新版本未定义旧版本定义的名称,则旧定义将保留