Ste*_*lla 2 python module object reload python-3.x
我只是认识到,imp.reload()
如果从模块的源文件中删除了旧的类和函数,则不会删除它们。
一个例子:
:~$ python3
Python 3.2.3 (default, May 3 2012, 15:54:42)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print(open("test.py").read())
# empty file
>>> import test
>>> dir(test)
['__builtins__', '__cached__', '__doc__', '__file__', '__name__',
'__package__']
>>> print(open("test.py").read())
# new class A and B added
class A:
pass
class B:
pass
>>> import imp
>>> dir(imp.reload(test))
['A', 'B', '__builtins__', '__cached__', '__doc__', '__file__', '__name__',
'__package__']
>>> print(open("test.py").read())
# class A deleted
class B:
pass
>>> dir(imp.reload(test))
['A', 'B', '__builtins__', '__cached__', '__doc__', '__file__', '__name__',
'__package__']
>>> import sys
>>> dir(sys.modules['test'])
['A', 'B', '__builtins__', '__cached__', '__doc__', '__file__', '__name__',
'__package__']
>>> sys.modules['test'].A
<class 'test.A'>
Run Code Online (Sandbox Code Playgroud)
在最后几行中,您可以看到有一个类对象,A
尽管它已从模块源代码中删除。为什么会这样呢?有没有办法识别模块的这些元素?
根据文档:
如果模块的新版本未定义旧版本定义的名称,则保留旧定义。如果此功能维护模块的全局表或对象缓存,则可以利用该模块的优势-通过try语句,它可以测试表的存在并在需要时跳过其初始化:
Run Code Online (Sandbox Code Playgroud)try: cache except NameError: cache = {}
所以这就是为什么。如果您不希望这些旧对象在那里,则可以在重新加载之前清空模块的字典。例如,在这里我将导入hashlib
,清空其字典,然后重新加载。
import hashlib
for attr in dir(hashlib):
if attr not in ('__name__', '__file__'):
delattr(hashlib, attr)
hashlib = imp.reload(hashlib)
Run Code Online (Sandbox Code Playgroud)
可怜的hashlib
。