tutorial python cpython

tutorial - python 3



¿Puede recuperarse de la reasignación de__builtins__ en python? (3)

Si abro el modo interactivo y escribo:

__builtins__ = 0 # breaks everything

¿He roto completamente la sesión? Si es así, ¿qué sucede detrás de escena para asignar __builtins__ al módulo integrado que no puede ser manejado por el intérprete? Si no, ¿cómo puedo recuperarme de esto?

Solo algunos de mis propios intentos de arreglarlo:

  • Cualquier intento de importar algo da como resultado un error "ImportError __import__ no encontrado"
  • Todas las funciones que podría usar para hacer algo más que evaluar las expresiones numéricas están rotas
  • Hay otra variable __package__ aún accesible, pero no sé si / cómo puede usarse.

Básicamente, jugar con nombres protegidos y reservados significa romper tu sesión, a veces sin una forma de recuperación.

Por ejemplo, puede escribir en shell:

True = False # The chaos begins!

Estos no son posibles con otros lenguajes de programación, pero Python le permite hacer lo que quiere, incluso si lo rompe todo.


Por lo general, puede obtener acceso a cualquier cosa que necesite, incluso cuando se haya eliminado __builtins__ . Es solo una cuestión de cavar lo suficiente. Por ejemplo:

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

Para obtener una explicación de lo que acaba de suceder aquí, leer Eval realmente es peligroso , donde se utilizan técnicas similares para demostrar que no se puede ejecutar de forma segura un código Python no confiable.


Tienes razón; prácticamente se puede romper una sesión de Python. Dudo que haya una manera de destruirlo completamente, ya que ver la respuesta de Ned fue toda una revelación para mí.

Al ser un lenguaje muy dinámico, Python te da mucha cuerda para colgarte. Sin embargo, no mires esto como un defecto; un eslogan común de Python dice que "todos estamos aceptando adultos aquí". Si entiendes el idioma y realmente sabes lo que estás haciendo, tienes un increíble control sobre cada aspecto de Python.