Pobieranie bloku poleceń, które mają być wykonane w instrukcji with

Czytając specyfikacje dlawith oświadczenie (połączyć), Mam kilka rzeczy, z którymi chciałbym się bawić. To nie jest dla żadnego kodu produkcyjnego ani niczego, po prostu odkrywam, więc proszę, nie bądź zbyt surowy, jeśli to zły pomysł.

To, co chciałbym zrobić, to pobrać kawałek o nazwie „BLOCK” w połączonych dokumentach powyżej i faktycznie majstrować przy nim wewnątrz połączenia do__enter__. (Zobacz powiązany dokument, tuż po rozpoczęciu sekcji motywacji i podsumowania).

Pomysł polega na stworzeniu własnego rodzaju lokalnej przestrzeni nazw w locie. Coś takiego:

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

Zasadniczo chcę wypowiedzi w środkuwith blok podporządkowany zmiennym lokalnym i konwencjom przypisaniasome_object.

W moim konkretnym przypadkusome_object może być specjalną tablicą danych, która ma moje własne operacje kolumnowe lub coś takiego. W takim przypadku powiedzenie czegoś takiegox = y + 5 if y > 4 else y - 2 może być jakąś fantazyjną operacją wektorową pod maską NumPy, ale nie muszę jawnie dzwonićsome_objectinterfejs do tych metod. W przestrzeni nazw wyrażenia powinny „po prostu działać” (jednak definiuję je jako wywnioskowane wMyNameSpace klasa.

Moim pierwszym pomysłem jest jakoś przerwaćwith przetworzyć i uzyskać kod, który znajduje się wtry blok. Następnie interpretuj ten kod, gdy__enter__ zostaje wywołany i zamienia kod wtry blok z czymś innym (być możepass jeśli to zadziała, ale może coś, co przywrócisome_object powrót do oryginalnego zakresu zmiennych z zachowanymi nowymi zmienionymi zmiennymi).

Prostym przypadkiem testowym byłoby coś takiego:

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

Jestem zainteresowany, jeśli ten pomysł już gdzieś istnieje.

Jestem świadomy najlepszych praktyk dotyczących przypisywania zmiennych. To jest projekt dla zwierząt, więc załóżmy, że dla dobra tego pomysłu możemy zignorować najlepsze praktyki. Nawet jeśli nie chcesz przypisywać zmiennych w ten sposób, może to być przydatne w moim bieżącym projekcie.

Edytować

Aby wyjaśnić rodzaje trudnych rzeczy, które chciałbym zrobić, i odpowiedzieć na poniższą odpowiedź, twierdząc, że nie można tego zrobić, rozważ przykładowy pliktestLocals.py poniżej:

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

co daje następujące, gdy uruchamiam go nieinteraktywnie:

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

questionAnswers(2)

yourAnswerToTheQuestion