首页 > 解决方案 > 使用 del __builtins__.__dict__["__import__"] 删除后如何恢复 __import__

问题描述

我现在正在尝试编码挑战。我之前无法更改代码, del __builtins__.__dict__["__import__"]但之后必须使用导入。我需要一种方法来恢复默认值__builtins__。它的python 2.7。

我试过__builtins__ = [x for x in (1).__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0]()._module.__builtins__了,但这不起作用,因为对内置函数的引用没有消失,但是内置函数字典中的元素是。

标签: pythonpython-2.7

解决方案


在 Python 2 中,您可以使用该reload函数来获取模块的新副本__builtins__

>>> del __builtins__.__dict__['__import__']
>>> reload(__builtins__)
<module '__builtin__' (built-in)>
>>> __import__
<built-in function __import__>
>>>

在 Python 3 中,该reload函数已移至imp模块(在 Python 3.4 中,importlib),因此imp如果importlib没有__import__. 相反,您可以使用__loader__.load_module加载模块并从字典sys中删除缓存但损坏的模块副本,以便您可以加载模块的新副本:builtinssys.modulesbuiltins__loader__.load_module

>>> del __builtins__.__dict__['__import__']
>>> del __loader__.load_module('sys').modules['builtins']
>>> __builtins__ = __loader__.load_module('builtins')
>>> __import__
<built-in function __import__>
>>>

推荐阅读