我正在尝试编码挑战。我之前无法更改代码
del __builtins__.__dict__["__import__"]
,但之后必须使用import。我需要一种恢复默认__builtins__
的方法。它的python 2.7。
我尝试了__builtins__ = [x for x in (1).__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0]()._module.__builtins__
,但由于对 buildins 的引用尚未消失,但内置字典中的元素已经消失,因此无法正常工作。
答案 0 :(得分:5)
在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
模块,并从builtins
字典中删除sys.modules
模块的已缓存但已损坏的副本,以便可以加载新的builtins
模块与__loader__.load_module
的副本:
>>> del __builtins__.__dict__['__import__']
>>> del __loader__.load_module('sys').modules['builtins']
>>> __builtins__ = __loader__.load_module('builtins')
>>> __import__
<built-in function __import__>
>>>