Abrufen des Befehlsblocks, der in der with-Anweisung ausgeführt werden soll

Beim Lesen der Spezifikationen für diewith Aussage (VerknüpfungIch habe einige Dinge, mit denen ich gerne herumspielen würde. Dies ist nichts für Produktionscodes oder ähnliches. Ich erkunde nur, also seien Sie bitte nicht zu hart, wenn dies eine schlechte Idee ist.

Was ich tun möchte, ist, das Stück mit dem Namen "BLOCK" in den oben verlinkten Dokumenten zu schnappen und tatsächlich innerhalb des Aufrufs an damit herumzubasteln__enter__. (Siehe das verlinkte Dokument direkt nach dem Beginn des Motivations- und Zusammenfassungsabschnitts.)

Die Idee ist, meine eigene Art von lokalem On-the-Fly-Namespace zu erstellen. Etwas wie das:

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

Grundsätzlich möchte ich die Aussagen innerhalb derwith Block, um den lokalen Variablen und Zuweisungskonventionen von untergeordnet zu seinsome_object.

In meinem speziellen Fallsome_object Möglicherweise handelt es sich um ein spezielles Datenarray mit eigenen spaltenweisen Operationen oder Ähnlichem. In welchem ​​Fall etwas sagen wiex = y + 5 if y > 4 else y - 2 Es könnte sich um eine ausgefallene vektorisierte NumPy-Operation handeln, die ich jedoch nicht explizit aufrufen musssome_objectSchnittstelle zu diesen Methoden. Im Namespace sollten die Ausdrücke "nur funktionieren" (ich definiere sie jedoch so, dass sie in der abgeleitet werdenMyNameSpace Klasse.

Meine erste Idee ist, das irgendwie zu unterbrechenwith verarbeiten Sie und erhalten Sie den Code, der in die gehttry Block. Dann interpretiere diesen Code wenn__enter__ wird aufgerufen, und ersetzen Sie den Code in dertry mit etwas anderem blockieren (vielleichtpass wenn das klappen würde, aber evtl. etwas was wiederherstelltsome_object Zurück zum ursprünglichen Variablenbereich (die neuen geänderten Variablen bleiben erhalten).

Ein einfacher Testfall wäre etwa so:

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

Mich interessiert, ob diese Idee schon irgendwo existiert.

Mir sind Best Practices für die Zuweisung von Variablen bekannt. Dies ist ein Lieblingsprojekt. Nehmen Sie daher bitte an, dass wir nur im Interesse dieser Idee die Best Practices ignorieren können. Auch wenn Sie keine Variablen auf diese Weise zuweisen möchten, könnte dies in meinem aktuellen Projekt hilfreich sein.

Bearbeiten

Betrachten Sie die Beispieldatei, um zu klären, welche schwierigen Aufgaben ich möglicherweise ausführen möchte, und um die unten stehende Antwort mit der Behauptung zu beantworten, dass dies nicht möglich isttestLocals.py unten:

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

was folgendes ergibt, wenn ich es nicht interaktiv ausführe:

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage