Получение блока команд, которые должны быть выполнены в операторе 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

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

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

Edit

Чтобы уточнить, какие хитрые вещи я бы хотел сделать, и ответить на приведенный ниже ответ, утверждая, что это невозможно, рассмотрите файл примера.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)

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