python-3.x 内置函数删除后有没有办法恢复?[duplicate]

oprakyz7  于 2023-03-20  发布在  Python
关注(0)|答案(2)|浏览(127)

此问题在此处已有答案

How to restore a builtin that I overwrote by accident?(3个答案)
7个月前关闭。
删除了这样的内置函数后,我想在不重新启动解释器的情况下恢复它。

>>> import builtins
>>> del builtins.eval
>>> builtins.eval = None

我尝试使用importlib重新加载内置模块,但无法恢复eval。

>>> import importlib
>>> importlib.reload(builtins)
<module 'builtins' (built-in)>
>>> eval("5 + 5")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable

我也尝试过从另一个模块中赋值一个__builtins__变量,但效果不太好。

>>> import os
>>> __builtins__ = os.__builtins__
>>> eval()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable

有没有办法在删除内置函数后恢复它?

w8biq8rn

w8biq8rn1#

我认为builtins的使用模式和你建议的不一样,你通常做的是根据你的需要重新绑定一个内置的名字,然后使用builtins来恢复功能:

eval = None

eval('5 + 5')
# TypeError: 'NoneType' object is not callable

import builtins

eval = builtins.eval
eval('5 + 5')
# 10

或者(正如@ShadowRanger所评论的),在这个特定的例子中甚至更简单:

eval = None

eval('5 + 5')
# TypeError: 'NoneType' object is not callable

del eval

eval('5 + 5')
# 10
soat7uwm

soat7uwm2#

在发布问题后,我找到了一种使用BuiltinImporter恢复它的方法。

>>> import builtins
>>> del builtins.eval
>>> builtins.eval = None
>>> eval()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
>>> import importlib
>>> bi = importlib.machinery.BuiltinImporter
>>> bi.load_module("builtins")
<module 'builtins' (built-in)>
>>> import sys
>>> __builtins__ = bi.load_module.__globals__['module_from_spec'](sys.modules['builtins'].__spec__)
>>> eval("5 + 5")
10

相关问题