假设我使用__builtins__={}
Is there a way to force reimport of all base modules? 我想过使用_frozen_importlib.BuiltinImporter
,可以使用那种方法来完成吗?
目标是看是否可以做到,以及如何从这种情况中解脱出来。除了简单地学习 Python 的深奥部分之外,它没有任何用处。顺便说一句,这是python3。
正如@Kevin 在评论中指出的那样,REPL 和脚本之间似乎有所不同。在脚本中,重新分配__builtins__
似乎没有效果(Python 3.7.3):
# test.py
__builtins__ = {}
print(max([1,2,3]))
def really_weird():
__builtins__ = {"max": lambda x: min(x)}
print(max([1,2,3]))
really_weird()
# Output
3
3
max
没有改变,即使__builtins__
重新分配名称(有点)。
在REPL中,你说得对,_frozen_importlib.BuiltinImporter
可以用。
>>> import _frozen_importlib # This must be before reassigning __builtins___, since __builtins__ includes __import__
>>> __builtins__ = {}
>>> max([1,2,3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'max' is not defined
>>> __builtins__ = _frozen_importlib.BuiltinImporter().load_module("builtins")
>>> max([1,2,3])
3
需要注意的一件事:模块名称是builtins
,而不是__builtins__
。
此外,正如评论中所指出的,做import builtins as b; ... __builtins__ = b
或类似的事情也有效。
如果您不想进行设置工作,@Kevin 的回答在没有先前导入的情况下也会这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句