Python3 重新导入 __builtins__

SL

假设我使用__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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章