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

时间:2020-07-13 12:01:54

标签: python python-3.x built-in

在删除这样的内置函数之后,我想在不重新启动解释器的情况下恢复它。

>>> 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

删除内置函数后,是否可以还原内置函数?

2 个答案:

答案 0 :(得分:4)

我认为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

答案 1 :(得分:0)

发布问题后,我想出了一种使用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)>
>>> __builtins__ = bi.load_module.__globals__['module_from_spec'](modules['builtins'].__spec__)
>>> eval("5 + 5")
10