Есть ли способ восстановить встроенную функцию после ее удаления? - PullRequest
3 голосов
/ 13 июля 2020

После удаления такой встроенной функции я хочу восстановить ее без перезапуска интерпретатора.

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

4 голосов
/ 13 июля 2020

Я думаю, что образец использования builtins отличается от того, что вы предлагаете. Обычно вы повторно связываете встроенное имя для своей цели, а затем используете builtins для восстановления функциональности:

eval = None

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


import builtins


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

или (как прокомментировал @ShadowRanger), что еще проще в данном случае c:


eval = None

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

del eval

eval('5 + 5')
# 10
0 голосов
/ 13 июля 2020

После публикации вопроса я нашел способ восстановить его с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...