Получение блока команд, которые должны быть выполнены в операторе with

При чтении спецификаций дляwith заявление (ссылка на сайт), У меня есть некоторые вещи, которые яЯ хотел бы поиграть с. Это н'т для любого производственного кода или чего-нибудь, яЯ просто исследую, так что, пожалуйста, нене будет слишком резким, если это плохая идея.

Что я'Я хотел бы сделать, это взять кусок под названием "БЛОК» в связанных документах выше, и на самом деле возиться с ним внутри звонка__enter__, (См. Связанный документ, сразу после начала раздела о мотивации и резюме.)

Идея состоит в том, чтобы создать собственное локальное пространство имен на лету. Что-то вроде этого:

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

В основном, я хочу, чтобы заявления внутриwith блок для подчинения локальным переменным и соглашениям о присваивании.some_object

В моем конкретном случае,some_object может быть специальный массив данных, который имеет мои собственные операции по столбцам или что-то в этом роде. В этом случае говорят что-то вродеx = y + 5 if y > 4 else y - 2 может быть какая-то причудливая векторизация NumPy под капотом, но я нене нужно явно вызыватьsome_objectИнтерфейс с этими методами. В пространстве имен выражения должны "просто работай" (Однако я определяю их выводить вMyNameSpace учебный класс.

Моя первая идея - как-то прерватьwith обработать и получить код, который идет вtry блок. Затем интерпретировать этот код, когда__enter__ вызывается, и заменить код вtry блокировать чем-то другим (возможноpass если это сработает, но, возможно, что-то, что восстанавливаетsome_object вернуться к исходной области видимости переменных с сохранением новых измененных переменных).

Простой тестовый пример будет выглядеть примерно так:

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

Мне интересно, существует ли эта идея где-то уже.

Я знаю о лучших практиках назначения переменных. Это любимый проект, поэтому, пожалуйста, предположите, что ради этой идеи мы можем игнорировать лучшие практики. Даже если бы ты неМне не нравится присваивать переменные таким образом, это может быть полезно в моем текущем проекте.

редактировать

Чтобы уточнить, какие хитрые вещи я бы хотел сделать, и ответить на приведенный ниже ответ, утверждая, что это возможно.сделать, рассмотрим пример файлаtestLocals.py ниже:

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

что дает следующее, когда я запускаю его неинтерактивно:

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

Ответы на вопрос(2)

Ваш ответ на вопрос