Подтвердить что ты не робот

Вы можете восстановить после переназначения __builtins__ в python?

Если я открою интерактивный режим и введите:

__builtins__ = 0 # breaks everything

Я полностью нарушил сессию? Если да, то что происходит за кулисами, чтобы назначить __builtins__ встроенному модулю, который не может обрабатываться интерпретатором? Если нет, как я могу оправиться от этого?

Несколько моих попыток исправить:

  • Любая попытка импортировать что-либо приводит к ошибке "ImportError __import__ not found"
  • все функции, которые я мог бы использовать, чтобы выполнить что-либо кроме оценки числовых выражений,
  • Существует еще одна переменная __package__, доступная, но я не знаю, можно ли ее использовать.
4b9b3361

Ответ 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.