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_object
Schnittstelle 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