Utilizando el espacio de nombres de nivel superior, esto es imposible.Cuando se ejecuta
`var = 1`
Almacena la clave y el valor var
1
en el diccionario global. Es más o menos equivalente a llamar al globals().__setitem__('var', 1)
. El problema es que no se puede reemplazar el diccionario global en un script en ejecución (es probable que se pueda jugar con la pila, pero esa no es una buena idea). Sin embargo, puede ejecutar código en un espacio de nombres secundario y proporcionar un diccionario personalizado para sus globales.
class myglobals(dict):
def __setitem__(self, key, value):
if key=='val':
raise TypeError()
dict.__setitem__(self, key, value)
myg = myglobals()
dict.__setitem__(myg, 'val', 'protected')
import code
code.InteractiveConsole(locals=myg).interact()
que iniciará un REPL que casi se opera con normalidad, pero niega cualquier intento de establecer la variable val
. También puede usar execfile(filename, myg)
. Tenga en cuenta que esto no protege contra el código malicioso.
¿Cuál es el caso de uso? – msw
Caso de uso: las personas van a escribir pequeños scripts utilizando mi API de servicio, y quiero evitar que cambien datos internos y propaguen este cambio al siguiente script. – Caruccio
Python explícitamente evita prometer que un codificador malicioso o ignorante no podrá acceder. Otros idiomas le permiten evitar algún error de programador debido a su ignorancia, pero las personas tienen una extraña habilidad para codificarlos. – msw