Obtención del bloque de comandos que se ejecutarán en la instrucción with

Al leer las especificaciones para elwith declaraciónenlazar), Tengo algunas cosas con las que me gustaría jugar. Esto no es para ningún código de producción ni nada, solo estoy explorando, así que, por favor, no seas tan severo si es una mala idea.

Lo que me gustaría hacer es agarrar la pieza llamada "BLOQUEO" en los documentos vinculados de arriba, y en realidad jugar con ella dentro de la llamada a__enter__. (Consulte el documento vinculado, justo después del inicio de la sección de motivación y resumen).

La idea es crear mi propio tipo de espacio de nombres local sobre la marcha. Algo como esto:

with MyNameSpace(some_object):
    print a #Should print some_object.a
    x = 4 #Should set some_object.x=4

Básicamente, quiero las declaraciones dentro de lawith bloque para estar subordinado a las variables locales y convenciones de asignación desome_object.

En mi caso específico,some_object podría ser una matriz de datos especial que tenga mis propias operaciones de columna o algo así. En cuyo caso decir algo comox = y + 5 if y > 4 else y - 2 podría ser una operación vectorizada NumPy de lujo bajo el capó, pero no necesito llamar explícitamentesome_objectLa interfaz de esos métodos. En el espacio de nombres, las expresiones deberían "simplemente funcionar" (sin embargo, las defino para que sean inferidas en elMyNameSpace clase.

Mi primera idea es interrumpir de alguna manera elwith procesar y obtener una retención del código que va en eltry bloquear. Luego interpreta ese código cuando__enter__ se llama, y ​​reemplazar el código en eltry bloquear con otra cosa (tal vezpass Si eso funcionara, pero posiblemente algo que restaure.some_object volver al ámbito de variables original con sus nuevas variables modificadas conservadas).

Un caso de prueba simple sería algo como esto:

my_dict = {'a':3, 'b':2}
with MyNameSpace(my_dict):
    print a # Should print 3
    x = 5 # When the block finishes, my_dict['x'] should now be 5

Me interesa si esta idea ya existe en algún lugar.

Soy consciente de las mejores prácticas para asignar variables. Este es un proyecto favorito, así que supongamos que, solo por el bien de esta idea, podemos ignorar las mejores prácticas. Incluso si no le gustaría asignar variables de esta manera, podría ser útil en mi proyecto actual.

Editar

Para aclarar el tipo de cosas difíciles que podría querer hacer, y para abordar la respuesta a continuación que afirma que no se puede hacer, considere el archivo de ejemplo.testLocals.py abajo:

my_dict = {'a':1, 'b':2}
m = locals()
print m["my_dict"]['a']
m["my_dict"]['c'] = 3
print my_dict

class some_other_scope(object):
    def __init__(self, some_scope):
        x = 5
        g = locals()
        some_scope.update(g)
        some_scope["my_dict"]["d"] = 4

sos = some_other_scope(m)
print my_dict
print x

que da lo siguiente cuando lo ejecuto de forma no interactiva:

ely@AMDESK:~/Desktop/Programming/Python$ python testLocals.py
1
{'a': 1, 'c': 3, 'b': 2}
{'a': 1, 'c': 3, 'b': 2, 'd': 4}
5

Respuestas a la pregunta(2)

Su respuesta a la pregunta