有没有办法在删除后恢复内置函数?
Is there a way to restore a builtin function after deleting it?
删除了这样一个内置函数后,我想在不重启解释器的情况下恢复它。
>>> 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
有没有办法在删除后恢复内置函数?
发布问题后,我找到了使用 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
我认为 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
删除了这样一个内置函数后,我想在不重启解释器的情况下恢复它。
>>> 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
有没有办法在删除后恢复内置函数?
发布问题后,我找到了使用 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
我认为 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