Вы можете восстановить после переназначения __builtins__ в python?
Если я открою интерактивный режим и введите:
__builtins__ = 0 # breaks everything
Я полностью нарушил сессию? Если да, то что происходит за кулисами, чтобы назначить __builtins__ встроенному модулю, который не может обрабатываться интерпретатором? Если нет, как я могу оправиться от этого?
Несколько моих попыток исправить:
- Любая попытка импортировать что-либо приводит к ошибке "ImportError __import__ not found"
- все функции, которые я мог бы использовать, чтобы выполнить что-либо кроме оценки числовых выражений,
- Существует еще одна переменная __package__, доступная, но я не знаю, можно ли ее использовать.
Ответы
Ответ 1
Обычно вы можете получить доступ ко всему, что вам нужно, даже если __builtins__
был удален. Это просто вопрос копания достаточно далеко. Например:
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> __builtins__ = 0
>>> open
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'open' is not defined
>>> dir
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'dir' is not defined
>>> int
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'int' is not defined
>>> float
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'float' is not defined
>>>
>>> __builtins__ = [t for t in ().__class__.__bases__[0].__subclasses__() if 'warning' in t.__name__][0]()._module.__builtins__
>>>
>>> open
<built-in function open>
>>> int
<type 'int'>
>>> float
<type 'float'>
>>>
Для объяснения того, что здесь произошло, читайте Eval действительно опасно, где аналогичные методы используются для демонстрации того, что вы не можете безопасно выполнить ненадежный код Python.
Ответ 2
В основном беспорядок с защищенными и зарезервированными именами означает нарушение вашей сессии, иногда без возможности восстановления.
Например, вы можете ввести оболочку:
True = False # The chaos begins!
Это невозможно с другими языками программирования, но python позволяет делать то, что вы хотите, даже если это сломает все.
Ответ 3
Вы правы; вы можете практически сломать сеанс Python. Я сомневаюсь, что есть способ полностью его уничтожить - видение ответа Неда было для меня откровением.
Будучи очень динамичным языком, Python дает вам много веревки, чтобы повесить себя. Не смотри на это как на недостаток; общий лозунг Python гласит, что "мы все соглашаемся с взрослыми здесь". Если вы понимаете язык и действительно знаете, что делаете, у вас есть безумный контроль над всеми аспектами Python.